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

OPL CPLEX中DRLP模型无解问题求助

CPLEX中DRLP模型运行问题调试

我在CPLEX中运行DRLP模型,参数存放在单独文件里。由于OPL经验不足,找不到问题所在。我认为模型应该有可行解,但推测决策变量的定义及其关联的循环索引可能存在错误。我尝试调整过循环索引,但没有效果。以下是我的代码:

int I= 6;

range Komplett=1..I;
range I1=1..(I-1);
int R=2;
range Reihen=1..R;

// Parameter
float f[i in 1..I][j in 1.. I]=...;
int d=1;
int M=50;
int N=50;;
float w[i in 1..I]=...;
float c_ij[i in 1..I][j in 1..I]=...;
float a_r[i in 1..I]= ...;
float a_l[j in 1..I]=...;
int b[i in 1..I]=...;

w=[1.5,3,3.5,2,2.5,1];

c_ij=[[0,   1.5,    1.5,    2,  1,  0.5],
[1.5,   0,  1.5,    1.5,    1,  1],
[1.5,   1.5,    0,  2,  1.5, 1],
[2, 1.5,    2,  0,  0.5,    0.5],
[1, 1,  1.5,    0.5,    0,  1.5],
[0.5,   1,  1, 0.5  ,1.5    ,0]];

f=[[0,  3.5,    6,  7,  0.5,    6.5],
[6, 0,  8,  4,  6.5,    6.5],
[6, 1,  0,  2.5,    0,  5],
[3.5,   1.5,    1.5,    0,  7.5,    6],
[4, 9,  9,  0.5,    0,  5],
[0.5,   7.5,    5.5,    2.5,    2.5,    0]];

a_r=[1,0.5,0.5,1.5,0,1.5];

a_l=[0,0,0,0,1,1.5];

b=[0,0,0,0,0,1];
 
// Variablen
dvar float+ x[Komplett];
dvar float+ a[ Komplett][Komplett];
dvar boolean y[Komplett][Reihen];
dvar boolean z[Komplett ][Komplett][Reihen];
dvar boolean q[Komplett][Komplett];
dvar boolean p_l[Komplett ];
dvar boolean p_r[Komplett ];
dvar int+ l[Komplett][Reihen];
dvar boolean s[Komplett ][Komplett ][Reihen ];
dvar boolean e[Komplett ][Komplett ][Reihen];
dvar float+ minVal1[Komplett][Komplett]; 
dvar float+ minVal2[Komplett][Komplett];

// Zielfunktion
minimize sum(i in I1, j in (i+1)..I) (f[i][j] + f[j][i]) * (abs(x[j] - x[i]) + d * (1 - q[i][j]));

// Nebenbedingungen
subject to {
  c1:forall(i in Komplett)
    sum(r in Reihen) y[i][r] == 1;
  
 c2: forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[j][i][r] + a[i][j] <= x[i] - x[j] + (M * (1 - z[j][i][r]));
  
  c3:forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[i][j][r] + a[i][j] <= x[j] - x[i] + M * (1 - z[i][j][r]);
 
  
    //NB5 
   c6: forall(i in I1, j in (i+1)..I, r in Reihen)
      M*(1-z[i][j][r]) + a[i][j] >=a_r[i] * p_r[i] + a_l[j] * p_l[j]-minVal1[i][j]*s[i][j][r];
    // //NB6  
     c7:  forall(i in I1, j in (i+1)..I, r in Reihen)
     M*(1-z[j][i][r]) + a[i][j] >=a_r[j] * p_r[j] + a_l[i] * p_l[i]-minVal2[j][i]*s[j][i][r];
     
       //NB7 
  c5: forall(i in I1, j in (i+1)..I, r in Reihen)
    a[i][j] <= a_r[i] * p_r[i] + a_l[j] * p_l[j] - minVal1[i][j] * s[i][j][r] + M * (1 - z[i][j][r]);   
     forall(i in I1, j in (i+1)..I, r in Reihen)
   {minVal1[i][j]<=a_r[i];
    minVal1[i][j]<=a_l[j];
    minVal1[i][j] >= a_r[i] + a_l[j] - M;}
    
     // NB 8
  c4:forall(i in I1, j in (i+1)..I, r in Reihen)
  a[i][j] <= a_r[j] * p_r[j] + a_l[i] * p_l[i] - minVal2[j][i] * s[j][i][r] + M * (1 - z[j][i][r]);
  forall(i in I1, j in (i+1)..I, r in Reihen)
  {minVal2[j][i]<=a_r[j];
  minVal2[j][i]<=a_l[i];
     minVal2[j][i] >= a_r[j] + a_l[i] - M;}
     
     
  c8:forall(i in I1, j in (i+1)..I)
    M * q[i][j] >= a[i][j];
  
  c9:forall(i in 1..I, r in 1..R)
   sum(j in Komplett : j != i) z[j][i][r] == l[i][r];
  
  c10:forall(i in Komplett,j in Komplett:j != j, r in Reihen )
    N * (1 - z[i][j][r]) + l[j][r] - l[i][r] + e[i][j][r] >= 2;
  
  c11:forall(i in Komplett, j in Komplett: j!=i, r in Reihen)
    e[i][j][r] <= z[i][j][r];
  
  c12:forall(r in Reihen)
   sum(i in Komplett, j in Komplett: j != i) e[i][j][r] <= sum(i in Komplett) y[i][r] - 1;
  
  c13:forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] <= e[i][j][r];
  
 c14: forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] >= p_r[i] + p_l[j] + e[i][j][r] - 2;
  
  c15:forall(i in Komplett)
    sum(j in Komplett: j != i,r in Reihen ) s[i][j][r] <= p_r[i];
  
  c16:forall(j in Komplett)
    sum( i in Komplett: i != j,r in Reihen) s[i][j][r] <= p_l[j];
  
  c17:forall(i in Komplett)
    p_l[i]+p_r[i] >= b[i] + 1;
  
 c18: forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
   z[i][j][r] + z[j][i][r] <= y[i][r];
 
 c19:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] <= y[j][r];
  
  c20:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] + 1 >= y[i][r] + y[j][r];
  
  c21:forall(i in Komplett, j in Komplett:j!=i)
   q[i][j] == sum(r in 1..R) (z[i][j][r] + z[j][i][r]);
  
 c22: forall(i in Komplett)
    x[i] - 0.5 * w[i] - a_l[i] * p_l[i] >= 0;
}

关键问题排查

  • 约束c10的索引笔误:原代码中j != j是无效条件,没有任何j满足该条件,导致这个约束完全失效。应改为j != i,修正后约束如下:
    c10:forall(i in Komplett,j in Komplett:j != i, r in Reihen )
        N * (1 - z[i][j][r]) + l[j][r] - l[i][r] + e[i][j][r] >= 2;
    
  • 参数定义冲突风险:代码开头声明参数时用了...表示从外部文件读取,但后面又直接给参数赋值(如w=[...]),如果外部文件也有相同参数定义,会导致冲突。建议删除代码内的直接赋值,仅保留外部文件引用。
  • 大M值验证:当前设置M=50、N=50,需确认这些值是否足够覆盖变量的最大可能差值,避免约束过紧导致无解,或过松导致模型精度下降。
  • q变量的对称性:目标函数仅使用i < j的q[i][j],但约束c21定义了所有i≠j的q[i][j],需确认是否需要对称处理q[i][j]和q[j][i],避免逻辑不一致。

内容的提问来源于stack exchange,提问作者user29585664

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:10:53