将CPLEX参数传递给CVXPY

时间:2018-08-09 16:57:30

标签: python cplex cvxpy

使用CPLEX求解器时如何通过CVXPY传递公差和其他参数?

from cvxpy import Problem, Minimize
from cvxpy.settings import CPLEX
costs = ...
constraints = ...
prob = Problem(Minimize(costs), constraints)
prob.solve(solver=CPLEX, ...)

我看到CPLEX Parameters的页面,尽管不清楚哪些页面适用于我的二次问题。另外,CVXPY documentation具有其他求解程序的通过选项,但CPLEX没有。

1 个答案:

答案 0 :(得分:0)

将来这会改变(请参见this拉取请求),但是对于cvxpy 1.0.6,您可以执行以下操作(注意:这是未记录的行为;有关更多信息,请参见下文):

prob.solve(solver=CPLEX, advance=0)

advance=0将“关闭” advanced start switch参数。因此,如果CPLEX Python API中的参数名称为parameters.advance,则将parameters.(即advance)之后的部分作为关键字参数传递。传递给solve方法的所有其他关键字参数都将以这种方式进行解释。为了进行调试,您可能应该设置verbose=Truesolve的标准关键字参数之一)来打开引擎日志。参数设置将显示在日志顶部。

没有充分的理由记录此行为。它不允许您设置诸如data consistency checking and modeling assistance之类的参数。 CPLEX Python API中的参数名称为parameters.read.datacheck,但read.datacheck不能用作Python中的关键字参数(这会导致语法错误)。

作为解决方法,请考虑使用here中记录的ILOG_CPLEX_PARAMETER_FILE环境变量。


编辑:使用cvxpy 1.0.8不再需要上述解决方法。也就是说,无论它们在参数层次结构中的什么位置,您现在都应该能够设置所有参数。不过,您需要使用可选的cplex_params参数。最好将其与verbose=True结合使用,以便您可以在引擎日志中查看参数设置。例如:

prob.solve(solver=cvxpy.CPLEX,
           verbose=True,
           cplex_params={"mip.tolerances.absmipgap": 1e-07, 
                         "benders.strategy": 3})