0

我正在使用 CVXR 使用 MOSEK 求解器解决 R 中的优化问题。CVXR 通过 ANACONDA 找到了 MOSEK SOLVER 并且工作正常。但是,当模型不可行时,我无法生成 MOSEK 可行性报告。这通常通过 MSK_IPAR_INFEAS_REPORT_AUTO = "ON" 开启(至少在 GAMS 中,我之前使用过 MOSEK)并且对于识别模型设计、数据等方面的问题非常有用。标准命令给了我一个错误。然后我尝试了 Python 接口,它告诉我使用:task.putintparam(iparam.infeas_report_auto, onoffkey.on)。这似乎被我的解决命令接受但仍然没有吐出可行性报告。下面是一个可重现的例子。我究竟做错了什么?


# 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))

仅给出标准输出:

问题名称:
客观意义:min
类型:LO(线性优化问题) 约束:2 个
锥体:0
标量变量:1
矩阵变量:0
整数变量:0

优化器启动。预求解开始。消除器启动。消除器中释放的约束:0 消除器终止。消除器启动。消除器中释放的约束:0 消除器终止。消除器 - 尝试:2 次:0.00
林。部 - 尝试:0 次:0.00
林。部 - number : 0
Presolve 终止。时间:0.00
优化器终止。时间:0.01

内点解决方案摘要 问题状态:DUAL_INFEASIBLE 解决方案状态:DUAL_INFEASIBLE_CER 原始。obj:-1.0000000000e+00 nrm:1e+00 Viol。缺点:0e+00 变量:0e+00

基本解决方案摘要 问题状态:DUAL_INFEASIBLE 解决方案状态:DUAL_INFEASIBLE_CER 原始。obj:-1.0000000000e+00 nrm:1e+00 Viol。缺点:0e+00 变量:0e+00

4

1 回答 1

0

我查看了代码。正确的语法原则上应该与 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 枚举)。

于 2019-11-26T07:44:17.443 回答