IBM CPLEX C++ Concert Technology实现ILP遇不可行解求助
问题排查与修复
你的C++代码出现"Infeasible"的核心原因是约束表达式没有在每次循环中重置,导致约束逻辑和.mod文件完全不一致:
问题分析
在.mod文件中,约束C1的逻辑是:对每个操作i,所有周期j和DPU k对应的o_st[i][j][k]之和等于1,每个i的约束完全独立。
但你的C++代码里,IloExpr exp3在循环外声明,每次循环i时都会把当前i的所有o_st[i][j][k]累加到exp3中,再添加exp3 == 1的约束。这会导致:
- 第一个约束是
sum(i=0的所有j,k) o_st[0][j][k] == 1(逻辑正确) - 第二个约束是
sum(i=0的所有j,k) + sum(i=1的所有j,k) == 1(逻辑错误,前一个约束已要求第一部分和为1,这里总和为1意味着第二部分和必须为0,和.mod的逻辑完全矛盾) - 后续约束的矛盾会越来越严重,最终导致整个问题不可行。
修复代码
把表达式的声明放到i的循环内部,每次循环i都新建独立的表达式,同时记得用完后调用end()释放资源避免内存泄漏:
// 约束构建修正版 for (int i = 0; i < n_op; i++) { IloExpr exp3(env); // 每次循环i新建表达式 for (int j = 0; j < n_cyc; j++) { for (int k = 0; k < n_dpu; k++) { exp3 += o_st[i][j][k]; } } Model.add(exp3 == 1); exp3.end(); // 释放表达式资源 }
额外检查点
- 确认
n_op、n_cyc、n_dpu的取值和.mod文件中range_op、range_cyc、range_dpu的范围完全一致(比如.mod里range_op是1..m,C++里n_op是否等于m); - 检查
Numbool3D的typedef是否正确,确保它是typedef IloArray<IloArray<IloBoolArray>> Numbool3D;,保证变量类型和.mod里的boolean变量匹配。
内容的提问来源于stack exchange,提问作者PUDI DHILLESWARARAO
相关产品推荐
相关产品推荐

