Ответ не соответствует ограничениям

Я применяю MILP о маршрутизации транспортных средств в opl. Одним из важных ограничений является то, что каждую поездку можно обслужить не более одного раза одним транспортным средством. (каждая поездка приносит прибыль за ее обслуживание) Поэтому я хотел бы, чтобы оператор максимизировал общую прибыль и показал мне, какие поездки обслуживаются. Однако результат показывает, что определенные поездки обслуживаются всеми транспортными средствами. Так что я думаю, что с кодом что-то не так.

Я пробовал разные способы написать свои ограничения (например, удалить «k в K» из скобки «для всех»), но результаты те же.

[Файл модели]

{int} J = ...; // запрос на поездку

{int} K = ...; // Автомобиль

/ * параметры * /

float Pj [J] = ...; // прибыль, полученная в результате выполнения измененной заявки на аренду j

/ * Выражение переменных решения * / dexpr float profit = sum (j в J, k в K) Pj [j] * x [j] [k];

/ Целевая функция /

максимизировать прибыль;

/ ограничения /

ограничение ct1 [J] [K];

при условии {

forall (j in J, k in K)
  ct1 [j][k]: sum(i in J) x[i][k] <= 1;

}

        // end subject to. 

/ * +++ ВЫВОД ПЕЧАТИ +++ ВЫВОД ПЕЧАТИ +++ ВЫВОД ПЕЧАТИ +++ * /

выполнить printOutput {Writeln ();

write("profit= ", profit);

 writeln();     //number of trips j served 
write("number of trips served = ")
for (var j in J){
     for(var k in K){
            write( x[j][k], "\t")   
            }   

        }

}


opl
person Joanna Shih    schedule 18.09.2019    source источник


Ответы (1)


Я предполагаю, что ограничение ct1 ослаблено, поскольку оно мягкое. При необходимости CPLEX ослабит мягкие ограничения.

Если ты повернешься

ct1 [j][k]: sum(i in J) x[i][k] <= 1;

в

sum(i in J) x[i][k] <= 1;

тогда ограничение станет жестким.

person Alex Fleischer    schedule 29.11.2019