我在opl中应用了有关车辆路线选择的MILP。 一个重要的约束条件是,每次旅行最多只能由一辆车辆服务一次。 (每次旅行都可以从中获利) 因此,我希望opl可以最大限度地提高总利润,并向我显示提供哪些旅行。 但是,结果表明,所有车辆都可以进行某些行程。 所以我认为代码有问题。
我尝试了多种写约束的方法(例如,从“针对所有人”的括号中删除“ k中的k”),但是结果是相同的。
[模型文件]
{int} J = ...; //旅行请求
{int} K = ...; //汽车
/ *参数* /
float Pj [J] = ...; //满足修改后的租金请求j
/ *决策变量的表达* / dexpr浮点利润= 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")
}
}
}
答案 0 :(得分:0)
我猜想约束ct1是宽松的,因为它很软。 CPLEX将在需要时放宽软约束
如果您转动
ct1 [j][k]: sum(i in J) x[i][k] <= 1;
进入
sum(i in J) x[i][k] <= 1;
然后约束会变得很困难。