我正在从IBM ILOG CPLEX Optimization Studio 12.6运行CPLEX . 在这里,我面临着一个奇怪的问题 . 连续多次解决相同的优化问题(纯LP)会产生不同的结果 .
目的是解决一次,然后迭代地修改系数矩阵,并重新解决问题 . 但是,我们经历过迭代之间的变化与修改不一致 . 这导致我们尝试重新解决问题而不进行两者之间的修改,从而返回不同的结果 .
问题在于我们在开始迭代之前仍然进行了一次重大修改,我们的假设是这种变化(大约10,000行上的 cplex.setCoef(...)
)是异步完成的,因此它只是在第一次重新解决迭代过程中部分完成 .
但是,我们似乎找不到任何文档说明此方法是异步的,也没有任何方法可以确保同步执行,因此所有更改都在CPLEX重新启动之前完成 .
有谁知道是否是这种情况?有没有办法延迟重启直到 cplex.setCoef(...)
完成?问题非常严重,但代表性的是:
functionUsingSetCoefOn10000rows();
for(var j = 0; j < 100; j++){
cplex.solve();
writeln("Iteration " + j + ": " + cplex.getObjValue());
for(var k = 0; k < 100000; k++){
doBusyWork(); //Just to kill time
}
}
哪个输出
Iteration 0: 1529486959.814946
Iteration 1: 1544325969.750444
Iteration 2: 1549669732.757587
Iteration 3: 1551818419.584333
...
Iteration 33: 1564007987.849925
...
Iteration 98: 1564007987.849925
Iteration 99: 1564007987.849925
Last minute update 将对 cplex.setCoef
的调用次数减少到大约2500可以消除此问题,并且所有迭代都会返回相同的目标值 . 遗憾的是,我们确实需要更改所有10,000个系数 .
Edit: OPL脚本和引擎日志:http://goo.gl/ywJhkm和这里:http://goo.gl/v2Qhm9
1 回答
对不起,这不是一个真正的答案,但它太大了,不能作为评论...
我不认为setCoef()调用是异步的而不是完整的 - 这将是非常令人惊讶的 . 这种行为太难以预测,太多其他人会遇到这种行为的问题 . 但是,CPLEX本身将使用多个线程来解决问题,这意味着它可以在每次运行时生成不同的解决方案 . 您显示的示例目标值似乎发生了显着变化,因此有几个问题/观察:
1:数字似乎单调增加 - 它们是否都会这样增加,直到它们达到最大值?它看起来像某种收敛行为 . 重新运行时,如果可以,CPLEX将从先前的解决方案开始 . 检查没有其他CPLEX参数提前停止搜索,例如迭代或时间限制或更宽的解决方案最优容差 .
2:您是否查看了每次运行的CPLEX日志,以了解每次运行时CPLEX正在执行的操作?
3:如果您对要解决的模型有疑问,请尝试将模型转储为LP文件并检查每次迭代中的值 . 在你的情况下,它们应该都是一样的 . 您还可以尝试在CPLEX独立优化器中求解LP文件,以查看它给出的值 .
4:您是否尝试过设置参数以使CPLEX使用不同的LP算法(例如原始单纯形,屏障等)?