我从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
最后一刻更新
将调用次数减少到cplex.setCoef
到大约2500会消除此问题,并且所有迭代都会返回相同的目标值。遗憾的是,我们确实需要更改所有10,000个系数。
修改:OPL脚本和引擎日志:http://goo.gl/ywJhkm和此处:http://goo.gl/v2Qhm9
答案 0 :(得分:1)
很抱歉这不是一个真正的答案,但它太大了,不能作为评论......
我不认为setCoef()调用是异步的而不是完整的 - 这将是非常令人惊讶的。这种行为太难以预测,太多其他人会遇到这种行为的问题。但是,CPLEX本身将使用多个线程来解决问题,这意味着它可以在每次运行时生成不同的解决方案。您显示的示例目标值似乎确实发生了显着变化,因此有一些问题/观察结果:
1:这些数字似乎是单调递增的 - 它们都是这样增加的,直到它们达到最大值?它看起来像某种收敛行为。重新运行时,如果可以,CPLEX将从先前的解决方案开始。检查没有其他CPLEX参数提前停止搜索,例如迭代或时间限制或更广泛的解决方案最优容差。
2:您是否查看了每次运行的CPLEX日志,以了解CPLEX在每次运行中的作用?
3:如果您对要解决的模型有疑问,请尝试将模型转储为LP文件并检查每次迭代中的值。在你的情况下,它们应该都是一样的。您还可以尝试在CPLEX独立优化器中求解LP文件,以查看它给出的值。
4:您是否尝试过设置参数以使CPLEX使用不同的LP算法(例如原始单纯形,屏障等)?