CPLEX求解运输优化模型时决策变量全为0问题求助
问题排查与解决思路
核心原因:u数组赋值时机错误
你的execute块是在模型求解之后才执行的,这意味着求解时u[i][j][k]的初始值全为0。此时:
- 约束
Constraint1要求sum(i in I) x[i][j][k] == 0,结合x>=0的约束,所有x必须为0; - 目标函数是最小化
f*y + v*d*y,若f和v为正数(符合运输模型的成本逻辑),则y=0是最优解(成本最低)。
修复方案
将u的赋值逻辑移到求解前执行,OPL中可以用initialization块替代execute块,确保求解时u已经正确赋值:
int m = ...; int n = ...; int o = ...; range I = 1..m; range J = 1..n; range K = 1..o; float d[I][J] = ...; float s[I] = ...; float f = ...; float v = ...; float q = ...; float u[I][J][K]; float data[1..9][1..261] = ...; // 初始化u数组,放在求解前执行 initialization { for (var k = 1; k <= o; k++) { for (var i = 1; i <= m; i++) { for (var j = 1; j <= n; j++) { var row = (k - 1) * m + i; u[i][j][k] = data[row][j]; } } } } dvar float x[I][J][K]; dvar int y[I][J][K]; minimize sum(i in I, j in J, k in K) f*y[i][j][k] + sum(i in I, j in J, k in K) v*d[i][j]*y[i][j][k]; subject to { Constraint1: forall(j in J, k in K) sum(i in I) x[i][j][k] == sum(i in I) u[i][j][k]; Constraint2: forall(i in I) sum(j in J, k in K) x[i][j][k] <= s[i]; Constraint3: forall(i in I, j in J, k in K) x[i][j][k] <= q*y[i][j][k]; Constraint4: forall(i in I, j in J, k in K) x[i][j][k] >= 0; Constraint5: forall(i in I, j in J, k in K) y[i][j][k] >= 0; } // 可选:添加execute块验证u的取值 execute { writeln("示例u值:u[1][1][1] = ", u[1][1][1]); }
其他排查方向
- 验证
u数组的实际取值:在execute块中打印部分u的元素,确认是否正确读取了Excel中的data数据,同时检查Excel的读取范围CPLEX! C16:JC24是否对应9行261列的有效数据。 - 修正目标函数逻辑:运输模型中,单位运输成本通常与运输量
x成正比,而非路线启用变量y。若你的模型逻辑如此,应将目标函数改为sum(i,j,k) f*y[i][j][k] + sum(i,j,k) v*d[i][j]*x[i][j][k]。 - 完善
y变量约束:若y表示是否启用某条路线,应将其定义为0-1整数变量:dvar int y[I][J][K] in 0..1;,避免y取非0非1的无效值。
内容的提问来源于stack exchange,提问作者Aziz Agasi
相关产品推荐
相关产品推荐

