CPLEX在连续运行时输出不同的结果 - 异步问题?

时间:2015-05-15 18:56:43

标签: asynchronous cplex

我从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

1 个答案:

答案 0 :(得分:1)

很抱歉这不是一个真正的答案,但它太大了,不能作为评论......

我不认为setCoef()调用是异步的而不是完整的 - 这将是非常令人惊讶的。这种行为太难以预测,太多其他人会遇到这种行为的问题。但是,CPLEX本身将使用多个线程来解决问题,这意味着它可以在每次运行时生成不同的解决方案。您显示的示例目标值似乎确实发生了显着变化,因此有一些问题/观察结果:

1:这些数字似乎是单调递增的 - 它们都是这样增加的,直到它们达到最大值?它看起来像某种收敛行为。重新运行时,如果可以,CPLEX将从先前的解决方案开始。检查没有其他CPLEX参数提前停止搜索,例如迭代或时间限制或更广泛的解决方案最优容差。

2:您是否查看了每次运行的CPLEX日志,以了解CPLEX在每次运行中的作用?

3:如果您对要解决的模型有疑问,请尝试将模型转储为LP文件并检查每次迭代中的值。在你的情况下,它们应该都是一样的。您还可以尝试在CPLEX独立优化器中求解LP文件,以查看它给出的值。

4:您是否尝试过设置参数以使CPLEX使用不同的LP算法(例如原始单纯形,屏障等)?