CPLEX无代码报错但无解决方案,约束初始化后ct2出现冲突
CPLEX建模冲突问题排查与修复
核心冲突原因及修复点
1. ct2条件表达式语法错误
OPL不支持7000000<=pl[i]<=10000000这类连续比较写法,必须拆分为逻辑与(&&)连接的两个条件:
ct2: if (pl[i] >= 7000000 && pl[i] <= 10000000) c[i] == 3.5;
2. ct1-ct3逻辑覆盖与约束冲突
原代码三个if约束未明确逻辑蕴含关系,且边界值(如pl[i]=7000000)归属模糊,易引发冲突。建议改为蕴含式写法,确保每个pl[i]值对应唯一c[i]:
ct1: forall(i in tavail) (pl[i] < 7000000) => (c[i] == 2.5); ct2: forall(i in tavail) (pl[i] >= 7000000 && pl[i] <= 10000000) => (c[i] == 3.5); ct3: forall(i in tavail) (pl[i] > 10000000) => (c[i] == 5);
需确保pl[i]的取值范围被完全覆盖,避免出现不属于任何区间的情况。
3. ct5、ct6中的矛盾条件
- ct5中
c[i]==3.5&&c[i]==5:同一变量无法同时等于两个不同值,属于矛盾条件,需根据业务逻辑修改为c[i]==3.5 || c[i]==5或单独条件判断。 - ct6中
c[i]==3.5&&c[i]==2.5同理,必须修正。
4. ct7的循环赋值错误
原代码对每个j重复赋值pl[i],会导致冲突(多个j对应pl[i]的不同结果)。正确写法应为对j求和,且需定义初始值避免自赋值:
ct7: forall(i in tavail) pl[i] == pl_initial[i] + sum(j in number) (pevch[i][j] - pevdis[i][j]);
5. 目标函数语法错误
原目标函数中sum(j in number)-pevdis[i][j]*c[i]写法错误,减号需放在sum内部:
minimize 0.5*sum(i in tavail)( (pt[i]-pl[i]) + sum(j in number) pevch[i][j]*c[i] - sum(j in number) pevdis[i][j]*c[i] );
修改后的完整代码示例
minimize 0.5*sum(i in tavail)( (pt[i]-pl[i]) + sum(j in number) pevch[i][j]*c[i] - sum(j in number) pevdis[i][j]*c[i] ); subject to { ct1: forall(i in tavail) (pl[i] < 7000000) => (c[i] == 2.5); ct2: forall(i in tavail) (pl[i] >= 7000000 && pl[i] <= 10000000) => (c[i] == 3.5); ct3: forall(i in tavail) (pl[i] > 10000000) => (c[i] == 5); ct4: forall(i in tavail,j in number) { ct5: if (pt[i]-pl[i] < 0 && 0.7 < soc[j][i] && soc[j][i] < 0.9 && (c[i]==3.5 || c[i]==5)) pevdis[i][j] == (0.9 - soc[j][i])*100000; else pevdis[i][j] == 0; } ct6: forall(i in tavail,j in number) { if (pt[i]-pl[i] > 0 && soc[j][i] <= 0.7 && (c[i]==3.5 || c[i]==2.5)) pevch[i][j] == (0.7 - soc[j][i])*100000; else pevch[i][j] == 0; } ct7: forall(i in tavail) pl[i] == pl_initial[i] + sum(j in number) (pevch[i][j] - pevdis[i][j]); }
内容的提问来源于stack exchange,提问作者Harip
相关产品推荐
相关产品推荐

