OPL迭代间保存解决方案:xnew未更新且提示undefined求助
问题分析与解决方案
核心问题
你的代码存在几个关键问题导致xnew未正确初始化且显示undefined:
- 循环内重复创建数据源:每次循环都新建
IloOplDataElements(),且仅赋值单个元素,无法构建完整的二维数组结构,与.mod中定义的xnew[s][N]不匹配。 - 赋值逻辑错误:
data3.xnew = x[k][r.N];直接将单个数值赋值给二维数组类型的xnew,导致结构不兼容。 - 变量作用域与初始化缺失:未预先初始化与x同维度的xnew数组,仅在循环内处理单个元素,无法形成完整的数据集传递给模型。
修正后的代码示例
// 1. 先初始化xnew为与x同维度的二维数组,默认值设为0(按需调整) var x = opl.x.solutionValue; var xnew = {}; // 遍历所有k,初始化xnew的第一维度 for (var k in data2.M) { xnew[k] = {}; // 遍历所有N值,初始化第二维度 for (var r in data2.Links) { var n = r.N; xnew[k][n] = 0; } } // 2. 遍历赋值符合条件的元素 for (var k in data2.M) { for (var r in data2.Links) { var n = r.N; if (x[k][n] == 1) { xnew[k][n] = opl.x[k][n].solutionValue; writeln("x[",k,"][",n,"] = ",x[k][n]); writeln("xnew[",k,"][",n,"] = ",xnew[k][n]); } } } // 3. 一次性创建数据源并添加到opl var data3 = new IloOplDataElements(); data3.xnew = xnew; opl.addDataSource(data3);
额外注意事项
- 确保.mod文件中
xnew的集合定义与脚本维度完全匹配:
这里的{float} xnew[s in M][n in N] = [];M和N要对应脚本中data2.M和data2.Links里的N集合,避免维度不匹配导致的未定义问题。 - 迭代时如果需要保留上一次的xnew数据,要注意在每次迭代前正确初始化或复用数组,避免数据污染。
内容的提问来源于stack exchange,提问作者yalan
相关产品推荐
相关产品推荐

