IBM ILOG CPLEX运行配置无效及OPL模型不可行问题求助
枢纽选址路径问题(HLRP)求解中的约束不可行性与配置错误分析及解决方法
问题背景
使用IBM ILOG CPLEX Optimization Studio 22.1.1求解枢纽选址路径问题(Hub Location Routing Problem)时,遇到两类核心问题:
- 运行配置错误:在
Project->(run configuration)->configuration(default)中指定CSAHLRPSTW3.mod和CSAHLRPSTW3.dat后,系统提示run configuration 'configuration' is invalid。 - 约束不可行性错误:通过命令行执行
oplrun CSAHLRPSTW3.mod CSAHLRPSTW3.dat时,首先触发Infeasibility row 'ct5(1)': 0 = 1错误;注释ct5约束后,又出现Infeasibility row 'ct8(1)(1)': 0 >= 8错误,调整数据规模(n从4改为8)后问题依然存在。
模型文件
/********************************************* * OPL 22.1.1.0 Model * Author: * Creation Date: 2025/01/05 at 1:54:46 CSAHLRPSTW3.mod *********************************************/ // Data section int n = ...; // number of nodes from node.dat range N = 1..n; range C = N; // set of customers (non-hub nodes) range H = N; // set of potential hubs // Data reading from external files tuple Coordinate { float x; float y; } Coordinate coordinates[N] = ...; float d[N][N] = ...; // demand matrix float F[N] = ...; // fixed costs for hubs float Qh[N] = ...; // hub capacities int K = ...; // number of vehicles float t[N][N] = ...; // travel times tuple TimeWindow { float start; float end; } TimeWindow timewindows[N] = ...; // Constants float Qv = 1100; // vehicle capacity float M = 1000000; // big M float alpha = 0.004; // unit inter-hub transportation cost float beta = 1.0; // unit local delivery cost float zeta = 1.0; // early arrival penalty coefficient float gamma = 2.0; // late arrival penalty coefficient // Calculate distances between nodes float c[i in N][j in N] = sqrt(pow(coordinates[i].x - coordinates[j].x, 2) + pow(coordinates[i].y - coordinates[j].y, 2)); // Decision Variables dvar boolean x[N][N][H]; // routing variable dvar boolean y[H]; // hub location variable dvar float+ z[C][C][H][H]; // flow variable dvar float+ u[N][H]; // pickup amount dvar float+ v[N][H]; // delivery amount dvar float+ s[N]; // service start time dvar float+ P[N]; // time window penalty dvar float+ visitOrder[i in N]; // exclude sub-tour // Optimization Model minimize beta * sum(i in N, j in N, m in H) c[i][j] * x[i][j][m] + sum(m in H) F[m] * y[m] + alpha * sum(m in H, n in H, i in C, j in C) d[i][j] * z[i][j][m][n] * c[m][n] + sum(i in N) P[i]; subject to { //self roop protection forall(i in N, m in H) ct0:x[i][i][m] == 0; //return to the hubs forall(m in H) ct1:sum(i in N: i != m) x[i][m][m] == sum(j in N: j != m) x[m][j][m]; // Constraint (2): All demand must be routed through hubs forall(i in C, j in C) ct2:sum(m in H, n in H) z[i][j][m][n] == 1; // Constraint (3): Hub capacity constraints forall(m in H) ct3:sum(i in C, j in C, n in H) d[i][j] * z[i][j][m][n] + sum(i in C, j in C, n in H: n != m) d[i][j] * z[i][j][n][m] <= Qh[m] * y[m]; // Constraint (4): Vehicles can only depart from established hubs forall(m in H) ct4:sum(j in N) x[m][j][m] <= M * y[m]; // Constraint (5): Each customer must be visited exactly once forall(i in C) ct5:sum(j in N: j != i, m in H) x[i][j][m] == 1; // Constraint (6): Flow conservation forall(i in N, m in H) ct6:sum(j in N) x[i][j][m] == sum(j in N) x[j][i][m]; // Constraint (7): No inter-hub routes in local delivery forall(m in H) ct7:sum(j in N, n in H: n != m) x[n][j][m] == 0; // Constraint (8): Link between flow and routing variables forall(i in C, m in H) ct8:M * sum(j in N) x[i][j][m] >= sum(j in C, n in H) z[i][j][m][n] + sum(j in C, n in H) z[j][i][n][m]; // Constraint (9): Pickup load continuity forall(i in N, j in C, m in H: i != j) ct9:u[i][m] + sum(t in C, n in H) d[j][t] * z[j][t][m][n] - M * (1 - x[i][j][m]) <= u[j][m]; // Constraint (10): Delivery load continuity forall(i in C, j in N, m in H: i != j) ct10:v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] + M * (1 - x[i][j][m]) >= v[j][m]; // Constraint (11): Vehicle capacity constraint for delivery forall(i in C, m in H) ct11:v[i][m] <= Qv; // Constraint (12): Vehicle capacity constraint considering loading/unloading forall(i in C, m in H) ct12:u[i][m] + v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] <= Qv; // Constraint (13): Number of vehicles limit ct13:sum(m in H) sum(j in N) x[m][j][m] <= K; // Constraint (14): Time consistency forall(i in N, j in N, m in H) ct14:s[i] + t[i][j] - s[j] <= M * (1 - x[i][j][m]); // Constraint (15): Time window penalties forall(i in C) { ct15:P[i] >= zeta * (timewindows[i].start - s[i]); P[i] >= gamma * (s[i] - timewindows[i].end); P[i] >= 0;}; //Constraint (16): prohibit subtour forall(i in N, j in N, m in H: i != j && i != m && j != m) ct16: visitOrder[i] - visitOrder[j] + n * x[i][j][m] <= n - 1; }; // Solver configuration execute { cp.tilim = 10800; // Time limit: 10800 seconds }
数据文件
/********************************************* * OPL 22.1.1.0 Data * Author: * Creation Date: 2025/01/05 at 1:55:06 CSAHLRPSTW3.dat *********************************************/ n = 4; coordinates = [ <12944.330389, 19522.690462>, <23487.769950, 14749.226168>, <31004.306839, 21458.349354>, <49728.492698, 17946.318136> ]; d = [ [5.705460, 9.801600, 5.028110, 3.105340], [21.242070, 38.706030, 18.462480, 10.396320], [5.763190, 9.909430, 9.328980, 8.665890], [3.820190, 6.300870, 9.807810, 10.572880] ]; F = [ 28766.736921, 28376.761527, 29774.238965, 24301.334212 ]; Qh = [ 2198.532635, 6106.711881, 2226.593104, 4515.466789 ]; K = 4; timewindows = [ <0,10000>, <0,10000>, <0,10000>, <0,10000> ]; t = [ [0.00 233.68 19.41 529.92], [233.68 0.00 436.25 352.77], [19.41 436.25 0.00 339.71], [529.92 352.77 339.71 0.00] ];
原因分析
1. 运行配置错误
- 文件路径不匹配:配置中指定的mod/dat文件不在项目根目录,或文件名拼写错误。
- 配置类型冲突:误将MIP模型配置为CP求解器运行,或求解器版本与模型不兼容。
- 软件配置损坏:CPLEX Studio的默认配置文件损坏,导致配置无法加载。
2. 约束不可行性
ct5约束问题
当前模型定义C=N且H=N,即所有节点既是客户又是潜在枢纽,但存在逻辑矛盾:
- ct5要求所有节点(包括枢纽)必须被访问一次,但ct7禁止跨枢纽的路径,若枢纽未被选中(
y[m]=0),ct4会限制该枢纽的所有出发路径为0,导致无法满足ct5的“必须离开一次”要求。 - 若枢纽无需作为客户访问,
C的定义错误,应将纯客户节点与枢纽节点分离。
ct8约束问题
ct8试图关联流变量z与路径变量x,但逻辑存在缺陷:
- ct2强制所有客户需求必须通过枢纽流转(
sum(m,n)z[i][j][m][n]=1),但当ct5被注释后,sum(j)x[i][j][m]可能为0(即节点i无路径关联枢纽m),此时右边的流量和大于0,导致0 >= 正数的矛盾。
解决方法
1. 修复运行配置错误
- 校验文件路径:确保mod/dat文件在项目目录下,或在配置中指定完整绝对路径。
- 重建运行配置:删除现有默认配置,重新创建配置并选择正确的模型、数据文件及MIP求解器。
- 重启软件:若配置文件损坏,重启CPLEX Studio或重新导入项目。
2. 修复约束不可行性
调整ct5约束
- 分离客户与枢纽节点:重新定义集合,例如将前k个节点设为潜在枢纽,剩余为纯客户:
range N = 1..n; range H = 1..2; // 潜在枢纽集合 range C = 3..n; // 纯客户集合 - 修改ct5仅约束纯客户:
forall(i in C) ct5:sum(j in N: j != i, m in H) x[i][j][m] == 1;
修复ct8约束
- 补充双向关联逻辑,确保流量与路径的一致性:
当forall(i in C, m in H) { ct8:sum(j in C, n in H) z[i][j][m][n] + sum(j in C, n in H) z[j][i][n][m] <= M * sum(j in N) x[i][j][m]; ct8_2:sum(j in N) x[i][j][m] >= (sum(j in C, n in H) z[i][j][m][n] + sum(j in C, n in H) z[j][i][n][m]) / M; }x[i][j][m]的和为0时,右边流量和必须为0;当有流量时,必须存在对应的路径。
优化其他约束一致性
- 调整ct7约束:若允许枢纽间的中转路径,需删除或修改该约束,否则需确保流变量
z的枢纽间流转不依赖x变量。 - 校准大M值:将
M调整为合理范围(例如最大需求总量的2倍),避免因过大导致数值计算误差。
内容的提问来源于stack exchange,提问作者八木澤友輔
相关产品推荐
相关产品推荐

