【发布时间】:2021-03-29 17:53:37
【问题描述】:
尝试在 Pyomo 中构造一个大规模的二次约束如下:
import pyomo as pyo
from pyomo.environ import *
scale = 5000
pyo.n = Set(initialize=range(scale))
pyo.x = Var(pyo.n, bounds=(-1.0,1.0))
# Q is a n-by-n matrix in numpy array format, where n equals <scale>
Q_values = dict(zip(list(itertools.product(range(0,scale), range(0,scale))), Q.flatten()))
pyo.Q = Param(pyo.n, pyo.n, initialize=Q_values)
pyo.xQx = Constraint( expr=sum( pyo.x[i]*pyo.Q[i,j]*pyo.x[j] for i in pyo.n for j in pyo.n ) <= 1.0 )
事实证明,考虑到问题的规模,最后一行速度慢得令人难以忍受。尝试了PyPSA、Performance of creating Pyomo constraints 和pyomo seems very slow to write models 中提到的几件事。但没有运气。
有什么建议(一旦构建模型,Ipopt 求解也很慢。但我猜这与 Pyomo 无关)?
ps:直接构造这样的二次约束也没有帮助(也慢得难以忍受)
pyo.xQx = Constraint( expr=sum( pyo.x[i]*Q[i,j]*pyo.x[j] for i in pyo.n for j in pyo.n ) <= 1.0 )
【问题讨论】:
-
是凸问题吗?
-
@ErlingMOSEK 是。但将其转换为 SOCP 并没有太大帮助,因为这里的基本问题是 Pyomo 中二阶约束生成缓慢(这种大规模的二阶约束无论如何都需要循环/列表理解)
-
@ErlingMOSEK 或者你可能打算使用 Schur 的把戏。但是我不确定如何在 Pyomo 中构建这样的约束。也许你可以帮忙说明一下?
-
顺便说一句,我们在 Pyomo 中直接支持二次约束。
-
但不幸的是 mosek 既不是免费的也不是 GPL ......这里应该是技术问题
标签: python constants pyomo quadratic ipopt