CPLEX OPL有序对建模正确性咨询:索引i复用是否合规
CPLEX建模正确性验证
我正尝试在CPLEX中完成建模,以下是我的代码实现,想确认模型是否正确,尤其不确定索引“i”的多次使用是否合规:
tuple _IU_ { int i; int t; }; {_IU_} IU = {<1, 1>, <1, 2>, <2, 1>, <2, 2>}; tuple _IC_ { int i; int c; }; {_IC_} IC = {<1, 1>, <1, 2>, <1, 3>, <1, 4>}; int NT = 31; dvar float+ FCTU[1..NI, 1..NU, 1..NC, 1..NT]; dvar float+ FTU[1..NI, 1..NU, 1..NT]; subject to { sixteen: forall(<i, u> in IU, t in 1..NT) FTU[i, u, t] == sum(<i, c> in IC) FCTU[i, u, c, t]; };
问题分析与修正建议
未定义变量报错
代码中NI、NU、NC三个变量未声明直接使用,会导致编译错误,需补充定义,例如:int NI = 2; // 对应IU中i的取值范围 int NU = 2; // 对应IU中u的取值范围 int NC = 4; // 对应IC中c的取值范围索引“i”重复使用的逻辑错误
约束sixteen中,外层forall的<i, u> in IU里的i,和内层sum(<i, c> in IC)里的i存在变量遮蔽问题:内层的i会覆盖外层的i,导致求和逻辑并非针对当前外层的i进行,完全不符合预期。正确写法需重命名内层索引,并添加匹配条件,确保求和仅针对与外层
i相同的元组:subject to { sixteen: forall(<i, u> in IU, t in 1..NT) FTU[i, u, t] == sum(<i_c, c> in IC : i_c == i) FCTU[i, u, c, t]; };元组字段名语义混淆
_IU_元组的第二个字段是t,但约束中却用u作为变量名(<i, u> in IU),语法虽合法但语义易混淆,建议调整元组定义以匹配变量名:tuple _IU_ { int i; int u; // 改为u,和约束中的变量名对应 };
内容的提问来源于stack exchange,提问作者Emerita Mangosing
相关产品推荐
相关产品推荐

