CPLEX编写i ∈ V^a∪ V^s约束及集合交集遍历写法咨询
CPLEX OPL约束写法修正说明
你提供的原有写法存在两处错误,不符合你的需求:
1. 集合范围匹配错误
你明确要求约束适用范围是i ∈ V^a ∪ V^s(两个集合的并集),但现有代码中Exp1使用inter关键字计算的是两个集合的交集,和需求不符。如果要取并集,需要改用union关键字。
如果你的实际需求确实是遍历两个集合的交集,仅描述时笔误写错了范围,这部分可以保留inter不用修改。
2. forall作用域语法错误
你现有代码中forall仅将第一个求和式纳入了遍历逻辑,第二个求和式和等式判断都在forall的作用域之外,相当于只有第一个求和值会随i迭代变化,第二个求和是全局固定值,完全不符合你要为每个i单独生成约束的要求,需要把整个等式都放到forall的作用范围内。
修正后的参考代码如下:
{int} Arr_node; // 对应集合V^a {int} Loco_start; // 对应集合V^s // 取两个集合的并集匹配需求范围 {int} Exp1 = Arr_node union Loco_start; // 整个约束等式放在forall作用域内,为每个i生成独立约束 forall(i in Exp1) { sum(<i,j> in A2) x[<i,j>] + sum(<i,j,k> in A3) y[<i,j,k>] == 1; }
内容的提问来源于stack exchange,提问作者Jack-5M
相关产品推荐
相关产品推荐

