我正在使用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_status
和row_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
答案 0 :(得分:0)
我不确定你为何会获得CPXERR_NO_BASIS。看我的评论。
如果您提供row_primal
,col_dual
和row_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
总会有所帮助(在某些情况下甚至可能是个坏主意)。我没有参考。