首页 文章

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

提问于
浏览
0

我正在从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 回答

  • 1

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

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

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

    2:您是否查看了每次运行的CPLEX日志,以了解每次运行时CPLEX正在执行的操作?

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

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

相关问题