将CPLEX参数传递给CVXPY

3
当使用CPLEX求解器时,我该如何通过CVXPY传递公差和其他参数?
from cvxpy import Problem, Minimize
from cvxpy.settings import CPLEX
costs = ...
constraints = ...
prob = Problem(Minimize(costs), constraints)
prob.solve(solver=CPLEX, ...)

我看到了一个CPLEX参数页面,但不清楚哪些适用于我的二次问题。此外,CVXPY文档有其他求解器的传递选项,但没有CPLEX。
1个回答

0
这将来会有所改变(请参见this拉取请求),但是在cvxpy 1.0.6中,您可以执行以下操作(注意:这是未记录的行为;请参阅下文了解更多信息):
prob.solve(solver=CPLEX, advance=0)

advance=0 将关闭 高级启动开关 参数。因此,如果在 CPLEX Python API 中参数名称为 parameters.advance,则应将其传递为关键字参数的一部分(即 advance),并将值作为关键字参数传递。传递给 solve 方法的任何额外关键字参数都会以这种方式进行解释。为了调试,您应该将 verbose=Truesolve 的标准关键字参数之一)设置为打开引擎日志;参数设置将显示在日志顶部。

这种行为没有记录是有原因的。它不允许您设置参数,例如 数据一致性检查和建模辅助。在 CPLEX Python API 中,该参数名称为 parameters.read.datacheck,但是在 Python 中不能将 read.datacheck 用作关键字参数(否则会导致语法错误)。

作为解决方法,请考虑使用环境变量 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})

所以如果我理解正确,由于容差被嵌套在更深的一层,我需要使用参数文件来降低容差。 - rhaskett
1
@rhaskett:我不确定你指的是哪个容差参数(有很多种),但是是的,那听起来是正确的。例如,对于绝对MIP间隙容差,这是正确的。 - rkersh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接