0

我们正在 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(商业)能够解决它

请帮忙!

4

1 回答 1

3

我在 2021 年 2 月的 PR 中修复了这个错误。但是,当前版本(v 5.7.3)似乎还没有修复。您可以做两件事(对于这两件事,您都需要知道 pyomo 的安装位置,print(pyomo.__file__)在 python 控制台中使用):

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

  2. 如果你有 Pyomo 5.7.3 ,那么你可以自己修复。如果你去 file:python3.8/site-packages/pyomo/solvers/plugins/solvers/mosek_direct.py那么你只需要将第 253 行从 更改mosek_qexp = (qsubi, qsubj, qvals)mosek_qexp = (qsubj, qsubi, qvals).

第二个选项应该更快。

带来不便敬请谅解。为什么这个版本还没有这个修复有点令人困惑,但我会向 repo 的维护者提出这个问题。

于 2021-05-14T13:53:47.743 回答