CPLEX找到最佳LP解决方案但不返回基本错误

时间:2016-10-09 20:14:09

标签: python cplex

我正在使用CPLEX Python API解决一系列LP问题。 由于许多问题基本相同,因此请保存一手充满参数。我想通过调用函数AnyRef =>来为大多数问题使用上一个问题的解决方案。

此功能记录在案here。其中两个参数cpx.start.set_start(col_status, row_status, col_primal, row_primal, col_dual, row_dual)cpx = cplex.Cplex()是通过调用col_statusrow_status获得的。

但是,尽管cpx.solution.basis.get_col_basis()返回cpx.solution.basis.get_row_basis()并且能够同时获得cpx.solution.status[cpx.solution.get_status()]optimal ...

致电cpx.solution.get_values()返回cpx.solution.get_dual_values()

现在,根据this post,可以使用列表和行基础状态的空列表调用热启动函数,如下所示。

cpx.solution.basis.get_basis()

但是,这实际上会导致进行更多的CPLEX迭代。为什么还有更多不清楚,但总的目标是明显减少。

版本信息 Python 2.7.12 CPLEX 12.6.3

1 个答案:

答案 0 :(得分:0)

我不确定你为何会获得CPXERR_NO_BASIS。看我的评论。

如果您提供row_primalcol_dualrow_dual的值,也许会有更好的运气。例如:

cpx2.start.set_start(col_status=[],
                     row_status=[],
                     col_primal=cpx.solution.get_values(),
                     row_primal=cpx.solution.get_linear_slacks(),
                     col_dual=cpx.solution.get_reduced_costs(),
                     row_dual=cpx.solution.get_dual_values())

我能够使用CPLEX示例附带的afiro.mps模型重现您描述的行为(仅在指定col_primal时确实增加了确定性滴答的数量)。但是,在执行上述操作时,它确实有所帮助(改进了tick的数量,迭代次数变为0)。

最后,我不相信保证使用set_start总会有所帮助(在某些情况下甚至可能是个坏主意)。我没有参考。