CPLEX OPL Error 5002排查求助:作业调度模型代码问题
CPLEX OPL Error 5002 Troubleshooting for Job Scheduling Model
我编写了一份作业调度相关的CPLEX OPL代码,但持续出现Error 5002错误。我已尝试多种方法排查却未能解决,也无法重构模型。现附上代码,恳请各位帮忙定位问题,我的项目周一就要提交。
你的OPL代码:
range operation=1..8; range machine=1..2; range tool=1..10; dvar boolean y[operation,machine]; dvar boolean x[operation,tool]; dvar boolean w1; dvar boolean w2; dvar boolean w3; float coef1[operation,machine]=[[133,133], [71,71], [42,42], [83,83], [91,91], [63,63], [108,108], [125,125]]; float coef2[operation,machine]=[[60,60], [252,252], [302,302], [79,79], [500,500], [440,440], [445,445], [151,151]]; float coef3[operation,machine]=[[4,4], [4,4], [4,4], [6,6], [6,6], [6,6], [4,4], [6,6]]; maximize sum(i in operation,j in machine) y[i,j]*coef1[i,j]; subject to { sum(i in operation,j in machine) y[i,1]*coef2[i,1]<=384; sum(i in operation,j in machine) y[i,2]*coef2[i,2]<=492; y[1,1]+y[1,2]==x[1,1]*x[1,7]; y[2,1]+y[2,2]==x[2,1]*x[2,4]; y[3,1]+y[3,2]==x[3,5]*x[3,8]; y[4,1]+y[4,2]==w1; //x[4,1]*x[4,2]*x[4,6] y[5,1]+y[5,2]==x[5,3]*x[5,8]; y[6,1]+y[6,2]==w2; //x[6,3]*x[6,5]*x[6,8] y[7,1]+y[7,2]==x[7,2]*x[7,4]; y[8,1]+y[8,2]==w3; //x[8,7]*x[8,8]*x[8,9] w1<=x[4,1]; w1<=x[4,2]; w1<=x[4,6]; w1>=x[4,1]+x[4,2]+x[4,6]-2; w2<=x[6,3]; w2<=x[6,5]; w2<=x[6,8]; w2>=x[6,3]+x[6,5]+x[6,8]-2; w3<=x[8,7]; w3<=x[8,8]; w3<=x[8,9]; w3>=x[8,7]+x[8,8]+x[8,9]-2; x[1,1]+x[2,1]+x[4,1]<=2; x[4,2]+x[7,2]<=1; x[6,3]<=1; x[2,4]+x[7,4]<=2; x[3,5]+x[5,5]+x[6,5]<=2; x[4,6]<=2; x[1,7]+x[8,7]<=1; x[3,8]+x[6,8]+x[8,8]<=2; x[8,9]<=1; x[5,10]<=1; y[1,1]+y[1,2]<=1; y[2,1]+y[2,2]<=1; y[3,1]+y[3,2]<=1; y[4,1]+y[4,2]<=1; y[5,1]+y[5,2]<=1; y[6,1]+y[6,2]<=1; y[7,1]+y[7,2]<=1; y[8,1]+y[8,2]<=1; sum (i in operation,j in machine) y[i,1]*coef3[i,j]<=6; sum (i in operation,j in machine) y[i,2]*coef3[i,j]<=6; }
问题根源:Error 5002
CPLEX Error 5002本质是线性求解器无法处理非线性约束。你的代码里存在多个布尔变量相乘的约束(比如y[1,1]+y[1,2]==x[1,1]*x[1,7]),这类乘积项属于非线性逻辑,LP求解器不支持,所以触发了错误。
不过你已经对w1/w2/w3的乘积约束做了正确的线性化(用四个线性约束模拟逻辑与),这部分是没问题的,只需要把剩下的几个乘积约束也改成线性形式。
具体修改方案
对于布尔变量的乘积a = b * c(a、b、c都是0-1变量),可以用以下三个线性约束等价替换:
a <= ba <= ca >= b + c - 1
把你代码里的5个非线性乘积约束逐一替换:
- 替换
y[1,1]+y[1,2]==x[1,1]*x[1,7];为:
y[1,1]+y[1,2] <= x[1,1]; y[1,1]+y[1,2] <= x[1,7]; y[1,1]+y[1,2] >= x[1,1] + x[1,7] - 1;
- 替换
y[2,1]+y[2,2]==x[2,1]*x[2,4];为:
y[2,1]+y[2,2] <= x[2,1]; y[2,1]+y[2,2] <= x[2,4]; y[2,1]+y[2,2] >= x[2,1] + x[2,4] - 1;
- 替换
y[3,1]+y[3,2]==x[3,5]*x[3,8];为:
y[3,1]+y[3,2] <= x[3,5]; y[3,1]+y[3,2] <= x[3,8]; y[3,1]+y[3,2] >= x[3,5] + x[3,8] - 1;
- 替换
y[5,1]+y[5,2]==x[5,3]*x[5,8];为:
y[5,1]+y[5,2] <= x[5,3]; y[5,1]+y[5,2] <= x[5,8]; y[5,1]+y[5,2] >= x[5,3] + x[5,8] - 1;
- 替换
y[7,1]+y[7,2]==x[7,2]*x[7,4];为:
y[7,1]+y[7,2] <= x[7,2]; y[7,1]+y[7,2] <= x[7,4]; y[7,1]+y[7,2] >= x[7,2] + x[7,4] - 1;
修改后,整个模型就变成了纯整数线性规划(MILP),CPLEX的MILP求解器可以正常处理,Error 5002应该就会消失了。
内容的提问来源于stack exchange,提问作者Ayberk Ökten
相关产品推荐
相关产品推荐

