You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 <= b
  • a <= c
  • a >= b + c - 1

把你代码里的5个非线性乘积约束逐一替换:

  1. 替换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;
  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;
  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;
  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;
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:27:51