Cplex Opl流程控制:决策变量求解结果展示问题咨询
解答:Benders分解中变量解的展示与
getObjCoef()的调用 首先,针对你的问题逐一说明:
1. printSolution()的正确性
subOpl.printSolution()是正确且有效的,它会输出模型中所有变量的求解结果,包括你关注的x[][][]、y[][]和theta[]。不过它的输出是全量的,格式比较通用,如果你只需要聚焦这三个变量,手动遍历输出会更清晰易读。
2. 定制化展示目标变量的解
如果你想单独展示这三个变量的解,可以通过遍历变量并访问它们的solutionValue属性来实现,针对不同变量类型(浮点数/二进制)做针对性过滤:
输出x[][][](正浮点数)
由于浮点数解可能存在极小的数值误差,建议过滤掉接近0的结果:
writeln("\n--- x变量解(正浮点数)---"); for (var s in thisOplModel.other_scenarios) { for (var d in thisOplModel.demands) { for (var a in thisOplModel.arcs) { var val = subOpl.x[s][d][a].solutionValue; if (val > 1e-6) { // 过滤极小值 writeln("x[" + s + "][" + d + "][" + a + "] = " + val.toFixed(4)); // 保留4位小数 } } } }
输出y[][](二进制变量)
二进制变量只需展示取值为1的情况(避免输出大量0):
writeln("\n--- y变量解(二进制)---"); // 请根据y变量的实际索引结构调整循环 for (var i in thisOplModel.y) { for (var j in thisOplModel.y[i]) { var val = subOpl.y[i][j].solutionValue; if (val > 0.5) { // 二进制变量取1的判定阈值 writeln("y[" + i + "][" + j + "] = " + val); } } }
输出theta[](二进制变量)
同理,只展示取值为1的结果:
writeln("\n--- theta变量解(二进制)---"); for (var k in thisOplModel.theta) { var val = subOpl.theta[k].solutionValue; if (val > 0.5) { writeln("theta[" + k + "] = " + val); } }
3. getObjCoef()方法的调用
getObjCoef()是IloCplex对象的方法,用于获取单个变量在目标函数中的系数,调用时需要传入对应的变量对象作为参数。示例如下:
// 示例:获取某个x变量的目标系数 var firstScenario = thisOplModel.other_scenarios[0]; var firstDemand = thisOplModel.demands[0]; var firstArc = thisOplModel.arcs[0]; var xCoeff = subCplex.getObjCoef(subOpl.x[firstScenario][firstDemand][firstArc]); writeln("x[" + firstScenario + "][" + firstDemand + "][" + firstArc + "] 的目标系数:" + xCoeff); // 同理获取y或theta的系数 var yCoeff = subCplex.getObjCoef(subOpl.y[i][j]); // i,j为具体索引 var thetaCoeff = subCplex.getObjCoef(subOpl.theta[k]); // k为具体索引
整合后的完整代码片段
替换你原代码中if (subCplex.solve())部分的内容即可:
if (subCplex.solve()) { writeln("Total Cost = " + subCplex.getObjValue()); // 可选:输出全量解 writeln("\n=== 全量解输出 ==="); subOpl.printSolution(); // 定制化输出目标变量解 writeln("\n=== 目标变量解详情 ==="); // 输出x变量 writeln("\n--- x变量(正浮点数)---"); for (var s in thisOplModel.other_scenarios) { for (var d in thisOplModel.demands) { for (var a in thisOplModel.arcs) { var val = subOpl.x[s][d][a].solutionValue; if (val > 1e-6) { writeln("x[" + s + "][" + d + "][" + a + "] = " + val.toFixed(4)); } } } } // 输出y变量 writeln("\n--- y变量(二进制)---"); for (var i in thisOplModel.y) { for (var j in thisOplModel.y[i]) { var val = subOpl.y[i][j].solutionValue; if (val > 0.5) { writeln("y[" + i + "][" + j + "] = " + val); } } } // 输出theta变量 writeln("\n--- theta变量(二进制)---"); for (var k in thisOplModel.theta) { var val = subOpl.theta[k].solutionValue; if (val > 0.5) { writeln("theta[" + k + "] = " + val); } } // 示例:调用getObjCoef获取变量目标系数 writeln("\n=== 变量目标系数示例 ==="); var firstS = thisOplModel.other_scenarios[0]; var firstD = thisOplModel.demands[0]; var firstA = thisOplModel.arcs[0]; var xCoef = subCplex.getObjCoef(subOpl.x[firstS][firstD][firstA]); writeln("x[" + firstS + "][" + firstD + "][" + firstA + "] 的目标系数:" + xCoef); } else { writeln("No solution"); }
内容的提问来源于stack exchange,提问作者ga32suj
相关产品推荐
相关产品推荐

