如何解决Pyomo + Mosek 问题:系数矩阵不是半正定的
我们正在 Pyomo + Mosek(商业)中制定 QP 优化问题。
出乎意料的是,mosek 抱怨二次系数不是 PSD。
Error: rescode.err_obj_q_not_psd(1295): The quadratic coefficient matrix in the objective is not positive semidefinite as expected for a minimization problem.
最小可重现示例:
import pyomo.kernel as pmo
import numpy as np; np.random.seed(1)
n = 5
Q1 = np.random.randn(n,n)
Q1 = Q1.T @ Q1 # theoretically always PSD
m = 5
A1 = np.random.randn(m,n)
b1 = np.random.randn(m)
problem = pmo.block()
problem.x = pmo.variable_list()
for i in range(n):
problem.x.append(pmo.variable())
problem.OBJ = pmo.objective(expr = problem.x @ Q1 @ problem.x,sense = pmo.minimize)
problem.cons = pmo.constraint_list()
tmp_lhs = A1 @ problem.x
for i in range(len(b1)):
problem.cons.append(pmo.constraint(expr= tmp_lhs[i] <= b1[i]))
opt = pmo.solverFactory("mosek")
opt.solve(problem)
我们认为 Q1 是 PSD 的原因:
- 它的所有特征值都是正的
- CPLEX(商业)能够解决它
请帮忙!
解决方法
我在 2021 年 2 月的 PR 中修复了这个错误。但是,当前版本 (v 5.7.3) 似乎还没有修复。您可以做两件事(对于这两件事,您都需要知道 pyomo 的安装位置,请在 python 控制台中使用 print(pyomo.__file__)
找到):
-
克隆 Pyomo github 存储库(主分支)并将其用作 pyomo 安装。提示:您可以使用 pip 安装 pyomo,然后使用 repo 克隆的符号链接替换 pyomo 安装(在 env/lib/site-packages/pyomo 中的某处)。 #lifehack
-
如果您有 Pyomo 5.7.3 ,那么您可以自己进行修复。如果您转到文件:
python3.8/site-packages/pyomo/solvers/plugins/solvers/mosek_direct.py
,那么您只需要将第 253 行从mosek_qexp = (qsubi,qsubj,qvals)
更改为mosek_qexp = (qsubj,qsubi,qvals)
。
第二个选项应该更快。
很抱歉给您带来不便。为什么版本还没有这个修复程序有点令人困惑,但我会向 repo 的维护者提出这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。