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

如何在CPLEX与C++中创建工人路径表达式?代码纠错求助

工人路径规划CPLEX代码问题求助

我正在用C++结合CPLEX编写工人路径规划的代码,目前遇到不少错误,没法确定代码正确性,希望能得到帮助。其中X[w][w][i][j]是决策变量,p[i][j]是弧i到j的处理权重,d[i][j]是距离。

我编写的代码:

compteur = 0;
IloFloatVarArray2 CW(env, W);
for (w = 0; w < W; w++)
{
    CW[w] = IloFloatVarArray(env, W, 0.0, INFINITY);
    model.add(CW[w]);
#ifdef DEBUG
    for (w = 0; w < W; w++)
    {
        sprintf(varname, "CW_%d_%d", w, w);
        CW[w][w].setName(varname);
        compteur++;
    }
}
#endif
#ifdef DEBUG
printf("compteur cw =%d\n", compteur);
#endif

IloExpr CW[w][w](env);

for (i = 0; i < A; i++)
    for (j = 0; j < A; j++)
        CW[w][w] += d[i][j] * xW[w][i][j][w];
for (i = 0; i < A; i++)
    for (j = 0; j < A; j++)
        CW[w][w] += Parc[i][j] * xW[w][i][j][w];
for (i = 0; i < A; i++)
    for (j = 0; j < A; j++)
        CW[w][w] += 1 * xW[w][i][j][w];
model.add(env, CW[w][w]);
CW[w][w].end();

代码中的核心问题:

  • 变量重定义冲突:先声明了IloFloatVarArray2 CW,后续又定义同名的IloExpr CW[w][w],编译器会报错,且IloExpr不能用循环变量w作为数组维度。
  • 循环变量重复:外层循环用w遍历工人,内层DEBUG循环又用w,会覆盖外层变量,导致逻辑混乱。
  • 表达式构建无遍历:当前代码没有针对每个工人w循环构建表达式,w是未明确范围的变量,无法正确计算每个工人的路径成本。
  • 变量用途混淆:CW既被用作变量数组,又被用作表达式,导致模型添加逻辑错误。
  • 资源管理不当:IloExpr的end()调用位置错误,若为数组形式未逐个释放,会引发内存泄漏。

修正后的示例代码:

int compteur = 0;
// 定义每个工人的总成本变量
IloFloatVarArray workerCosts(env, W, 0.0, IloInfinity);
for (int w = 0; w < W; ++w) {
#ifdef DEBUG
    char varname[20];
    sprintf(varname, "WorkerCost_%d", w);
    workerCosts[w].setName(varname);
    compteur++;
#endif
    model.add(workerCosts[w]);
}

#ifdef DEBUG
printf("compteur cw = %d\n", compteur);
#endif

// 为每个工人构建路径成本表达式
for (int w = 0; w < W; ++w) {
    IloExpr costExpr(env);
    // 累加距离、处理权重和计数项
    for (int i = 0; i < A; ++i) {
        for (int j = 0; j < A; ++j) {
            costExpr += d[i][j] * xW[w][i][j][w];
            costExpr += Parc[i][j] * xW[w][i][j][w];
            costExpr += xW[w][i][j][w]; // 1*可省略
        }
    }
    // 约束工人总成本等于表达式计算值
    model.add(workerCosts[w] == costExpr);
    costExpr.end(); // 释放表达式资源
}

修正说明:

  1. 拆分变量与表达式的命名,用workerCosts存储每个工人的总成本变量,costExpr临时构建每个工人的成本表达式,避免命名冲突。
  2. 修正循环变量重复问题,所有循环使用独立的局部变量。
  3. 针对每个工人w循环构建表达式,确保每个工人的路径成本计算准确。
  4. 明确变量与表达式的约束关系,将总成本变量与表达式通过等式约束关联,符合CPLEX的建模逻辑。
  5. 正确管理IloExpr资源,每个表达式使用后立即调用end()释放内存。

内容的提问来源于stack exchange,提问作者Siw Mni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:25:21