OPL CPLEX迭代中仅固定值为1的变量问题求助
迭代求解仅固定值为1的变量:代码问题排查与修正
感谢Alex的解答,您的方案可正常运行,但会冻结所有变量。我希望在迭代求解时仅固定值为1的变量,为此编写了如下代码,但无法正常工作,恳请协助排查问题:
main { var source = new IloOplModelSource("subset.mod"); var cplex = new IloCplex(); var def = new IloOplModelDefinition(source); var output=0; for(var iter=1;iter<=5;iter++) { var opl = new IloOplModel(def,cplex); var data2= new IloOplDataElements(); data2.M=thisOplModel.s; data2.M.add(iter); data2.N=thisOplModel.N; data2.Links=thisOplModel.Links; opl.addDataSource(data2); opl.generate(); for (var k in data2.M){ for (var r in data2.Links){ if (opl.x[k][r.N]==1){ // This line is used to select variables equal to 1 opl.x[k][r.N].LB=output; opl.x[k][r.N].UB=output; } } } if (cplex.solve()) { writeln("ITERATION ", iter); writeln(' ****OBJ************'); writeln("OBJ = " + cplex.getObjValue()); } else { writeln("No solution"); } opl.postProcess(); output=opl.x[k][r.N].solutionValue; writeln("x[k][1]=",opl.x[k][r.N].solutionValue); data2.end(); opl.end(); } }
问题点分析
- 变量值判断时机错误:
opl.generate()之后模型还未求解,变量没有实际解的值,直接判断opl.x[k][r.N]==1永远不成立,根本不会设置任何变量的上下界。 output变量逻辑混乱:初始值为0,用来设置上下界完全不符合“固定值为1的变量”的需求;而且迭代末尾赋值时,k和r是外层循环最后一次的变量,无法捕获所有需要固定的变量。- 无跨迭代约束保留:每次迭代新建
opl模型,但没把上一次解中值为1的变量记录下来,导致每次迭代都是从头开始,没有累积固定规则。
修正后的代码
main { var source = new IloOplModelSource("subset.mod"); var cplex = new IloCplex(); var def = new IloOplModelDefinition(source); // 用集合保存需要固定为1的变量索引(k和N的组合) var fixedVars = new IloSet(); for(var iter=1; iter<=5; iter++) { var opl = new IloOplModel(def, cplex); var data2 = new IloOplDataElements(); data2.M = thisOplModel.s; data2.M.add(iter); data2.N = thisOplModel.N; data2.Links = thisOplModel.Links; opl.addDataSource(data2); opl.generate(); // 应用之前迭代中需要固定的变量约束 for (var idx in fixedVars) { var [k, n] = idx; opl.x[k][n].LB = 1; opl.x[k][n].UB = 1; } if (cplex.solve()) { writeln("ITERATION ", iter); writeln("\n****OBJ************"); writeln("OBJ = " + cplex.getObjValue()); // 记录本次解中值为1的变量,加入固定集合 for (var k in data2.M) { for (var r in data2.Links) { if (opl.x[k][r.N].solutionValue == 1) { fixedVars.add([k, r.N]); } } } } else { writeln("No solution"); break; // 无解时终止迭代 } opl.postProcess(); data2.end(); opl.end(); } }
修正说明
- 新增
fixedVars集合:跨迭代保存需要固定为1的变量索引,确保每次迭代都能继承之前的约束。 - 调整约束设置时机:模型生成后先加载历史固定约束,求解完成后再从当前解中筛选新的固定变量。
- 正确获取变量解:用
solutionValue属性获取求解后的变量实际值,替代原代码中错误的变量对象比较。 - 移除冗余的
output变量:直接用1作为固定值,贴合需求逻辑。
内容的提问来源于stack exchange,提问作者yalan
相关产品推荐
相关产品推荐

