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
相关产品推荐
相关产品推荐

