Pyomo+Mosek问题:系数矩阵不是半正定的



我们正在Pyomo+Mosek(商业(中制定一个QP优化问题。

出乎意料的是,莫塞克抱怨二次系数不是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中修复了这个错误。然而,当前版本(v5.7.3(似乎还没有修复。您可以做两件事(对于这两件事,您都需要知道pyomo的安装位置,请在python控制台中使用print(pyomo.__file__)找到(:

  1. 克隆Pyomo github存储库(主分支(,并将其用作Pyomo安装。提示:您可以使用pip安装pyomo,然后用repo克隆的符号链接替换pyomo安装(位于env/lib/site-packages/pyomo中的某个位置(#lifehack

  2. 如果您有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的维护人员提出这个问题。

最新更新