如何在CPLEX中正确编写含l ∈ {i, j}条件的约束语句
CPLEX约束写法正误判断与修正方案
原写法错误原因
你目前编写的代码是错误的,forall(<i,j,k> in A3, l in node :i!=j )的逻辑是遍历所有节点集合内的l,仅过滤了i≠j的条件,完全没有实现l ∈ {i, j}的限制,会生成远多于需求的冗余约束,不符合给定的数学定义。
正确实现方式
有两种常用的可行写法,均完全匹配y[ijk]≤q[lk] ,(i,j,k) ∈ A₃ ,l ∈ {i, j}的约束逻辑:
写法1:直接限定l的取值集合
CPLEX的forall循环支持直接指定动态字面量集合,写法最贴合数学定义:forall(<i,j,k> in A3, l in {i, j}) y[<i,j,k>] <= q[l][k];
写法2:拆分两条独立约束
如果追求更高可读性、避免循环变量写错,也可以直接展开l的两个取值,不需要额外遍历l:
forall(<i,j,k> in A3) { y[<i,j,k>] <= q[i][k]; y[<i,j,k>] <= q[j][k]; }
两种写法逻辑完全等价,运行效果一致。
内容的提问来源于stack exchange,提问作者Jack-5M
相关产品推荐
相关产品推荐

