如何在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(); // 释放表达式资源 }
修正说明:
- 拆分变量与表达式的命名,用
workerCosts存储每个工人的总成本变量,costExpr临时构建每个工人的成本表达式,避免命名冲突。 - 修正循环变量重复问题,所有循环使用独立的局部变量。
- 针对每个工人
w循环构建表达式,确保每个工人的路径成本计算准确。 - 明确变量与表达式的约束关系,将总成本变量与表达式通过等式约束关联,符合CPLEX的建模逻辑。
- 正确管理
IloExpr资源,每个表达式使用后立即调用end()释放内存。
内容的提问来源于stack exchange,提问作者Siw Mni
相关产品推荐
相关产品推荐

