我们正在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__)
找到(:
-
克隆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的维护人员提出这个问题。