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

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(); // 释放表达式资源
}

额外检查点

  1. 确认n_op、n_cyc、n_dpu的取值和.mod文件中range_op、range_cyc、range_dpu的范围完全一致(比如.mod里range_op是1..m,C++里n_op是否等于m);
  2. 检查Numbool3D的typedef是否正确,确保它是typedef IloArray<IloArray<IloBoolArray>> Numbool3D;,保证变量类型和.mod里的boolean变量匹配。

内容的提问来源于stack exchange,提问作者PUDI DHILLESWARARAO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:25:09