我正在使用CVXR通过MOSEK求解器解决R中的一个优化问题。CVXR已经通过ANACONDA找到了MOSEK求解器,并且工作正常。然而,当模型不可行时,我不能设法生成MOSEK可行性报告。这通常是通过MSK_IPAR_INFEAS_REPORT_AUTO = " on“打开的(至少在GAMS中,我以前使用过MOSEK ),这对于识别模型设计、数据等方面的问题非常有用。然后我尝试了Python接口,它告诉我应该使用: task.putintparam(iparam.infeas_report_auto,onoffkey.on)。这似乎被我的solve命令接受了,但仍然没有输出可行性报告。下面是一个可重现的例子。我做错了什么?
# Check solvers
installed_solvers()
# Main variable
x <- Variable(1)
# Objective function
objective <- x
# Constraint
constraint <- list(x >0, x-1>0)
# Solve
problem <- CVXR::Problem(Maximize(objective), c(constraint))
sol <- psolve(problem, solver = "MOSEK", verbose = TRUE, task.putintparam(iparam.infeas_report_auto, onoffkey.on))仅提供标准输出:
问题名称:
客观感觉:最小
类型: LO (线性优化问题)约束:2
圆锥体:0
标量变量:1
矩阵变量:0
整型变量:0
优化器已启动。预解析已启动。消除器已启动。消除器中释放的约束:0消除器已终止。消除器已启动。消除器中释放的约束:0消除器已终止。消除器-尝试次数:2次: 0.00
林。副警长。-尝试次数:0时间: 0.00
林。副警长。-数量:0
预解析已终止。时间: 0.00
优化器已终止。时间: 0.01
内点解决方案摘要问题状态: DUAL_INFEASIBLE解决方案状态: DUAL_INFEASIBLE_CER原始。obj:-1.0000000000e+00 nrm: 1e+00 Viol.con: 0e+00变量: 0e+00
基本解决方案摘要问题状态: DUAL_INFEASIBLE解决方案状态: DUAL_INFEASIBLE_CER原始。obj:-1.0000000000e+00 nrm: 1e+00 Viol.con: 0e+00变量: 0e+00
发布于 2019-11-26 15:44:17
我看了一下代码。正确的语法原则上应该与CVXPY中的语法相同,即:
sol <- psolve(problem, solver = "MOSEK", verbose = TRUE,
mosek_params=list("MSK_IPAR_INFEAS_REPORT_AUTO" = 1) )但是,这将无法工作,因为
https://github.com/cvxgrp/CVXR/blob/master/inst/python/mosekglue.py#L36
存在过多的self,可能是未经测试就从CVXPY复制过来的。好的,您可以转到CVXR安装中的相同文件,删除self.,但它几乎不会工作,除了1是R中的双精度数,而不是整数,所以MOSEK不会将其作为值。
因此,最终:您必须1)对上面提到的第36行进行修复,并将其更改为
_handle_mosek_params(task, solver_opts["mosek_params"])(删除开头的self. )然后2)编写更麻烦的代码
sol <- psolve(problem, solver="MOSEK", verbose="TRUE",
mosek_params=list('MSK_IPAR_INFEAS_REPORT_AUTO' = as.integer(1)))类似的技巧适用于所有参数设置。不幸的是,字符串MSK_ON不会被接受为值,这主要是因为在CVXPY中这不是必需的(有Python枚举)。
https://stackoverflow.com/questions/59040539
复制相似问题