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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:02:39