Как я могу решить проблему планирования железнодорожного пути? - PullRequest
0 голосов
/ 12 июня 2019

Я пишу свою диссертацию о проблеме планирования линий для железнодорожного пассажирского транспорта. Я хочу взглянуть на различные методы, которые рассчитывают надежность в железнодорожной сети. Поскольку у меня нет опыта работы с OPL, я сталкиваюсь с некоторыми проблемами при решении модели. Мой начальник не может мне помочь. Я отчаянно ищу человека, который мог бы помочь мне понять мою модель правильно. Модель должна определять, какие линии подразумевать, вместе с частотой и количеством вагонов поездов, сохраняя при этом минимальные затраты.

У меня есть две следующие проблемы: У меня есть набор ребер (E) и набор потенциальных линий (L). Как я могу сказать OPL, что, например, строка 1 состоит из ребер 1 и 2. Мне трудно связать эти переменные.

Я работаю с бинарной переменной решения x [L] [F] [C], которая представляет линию, частоту линии и количество вагонов соответственно. Как мне сказать модели, что значение умножается только на значение F. Например, третье ограничение, я хочу умножить значения F и C на capC.

int nv = ...;
range V = 1..nv;            //set of stations.

int ne =...;
range E =1..ne;                 //set of edges.

int nf = ...;
range F = 1..nf;            //set of possible frequencies.

int nc = ...;   
range C = 1..nc;            //set of possible carriages.

int nl = ...;
range L = 1..nl;            //set of potential lines.

//Parameters

int capC = ...;             //Capacity per carriage

int w[L] = ...;             //cost for using line l

int fmin[E] = ...;          //min freq per line l 

int fmax[E] = ...;          //max freq per line l

int h[E] = ...;             //Demand edge e

//Decision variable

dvar boolean x[L][F][C];                        

//Objective function
minimize sum(l in L, f in F, c in C) w[l] * x[l][f][c]; 

//Constraints

subject to {
forall (e in E)
  sum(l in L, f in F, c in C) x[l][f][c] >= fmin[e];        //Min edge freq

forall (e in E)
  sum(l in L, f in F, c in C) x[l][f][c] <= fmax[e];        //Max edge freq 

forall (e in E)
  sum(l in L, f in F, c in C) x[l][f][c] * capC >= h[e];  //Transfer all passengers

forall (l in L)
  sum(f in F, c in C) x[l][f][c] <= 1;              //Per line at most 1

1 Ответ

0 голосов
/ 12 июня 2019

Что касается «Я хочу умножить значения F и C на capC», пытались ли вы превратить

forall (e in E) sum(l in L, f in F, c in C) x[l][f][c] * capC >= h[e]; //Transfer all passengers

в

forall (e in E) sum(l in L, f in F, c in C) f*c*x[l][f][c] * capC >= h[e]; //Transfer all passengers

?

...