Я применяю 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")
}
}
}