使用 Gurobi 求解 Pyomo 中的平方根约束
Solving a Squared-root constraint in Pyomo with Gurobi
我正在使用 Gurobi 9.1.2 和 Pyomo 6.1.2
我在 pyomo
中使用 pyomo.environ
建模层创建了一个 MILP 模型。
为了推进我的研究,我需要对我的模型实施新的约束。这个新约束有一个平方根,我想用 Gurobi 解决它。
import pyomo.environ as pyo
...
model = pyo.AbstractModel()
#Set
model.J = pyo.Set(doc='Generation set')
model.t = pyo.Set(doc='datetime Set')
model.S = pyo.Set(doc='Storage Systems Set')
#Params
model.Delt = pyo.Param(model.t)
model.Us = pyo.Param()
model.Ud = pyo.Param()
model.Ss = pyo.Param()
model.Sd = pyo.Param()
model.erf = pyo.Param()
#Variables
model.pnomj = pyo.Var(model.J, domain=pyo.NonNegativeReals)
model.pjtResUp = pyo.Var(model.J, model.T, domain=pyo.NonNegativeReals)
model.pbesstResUp = pyo.Var(model.S, model.T, domain=pyo.NonNegativeReals)
我要实现的约束是这个
Quadratic Constraint
其中 Δp^{SR+}_{j,t} 是 model.pjtResUp
而 Δp^{SR+}__{B,t} 是 model.pbesstResUp
def upReserves(model, t):
return model.Us*model.pnomj['PV'] - model.Ud*model.Delt[t] + \
model.erf*pyo.sqrt((model.Ss*model.pnomj['PV'])**2 + (model.Sd*model.Delt[t])**2) <= \
sum(model.pjtResUp[j,t] for j in model.J) + model.pbesstResUp['BESS',t]
这给了我下一个 ValueError:
ValueError: Cannot write legal LP file. Constraint 'upReserves[2020-01-01 00:00:00]' has a body with nonlinear terms.
在中,他们说使用 CPLEX 创建 LP 文件时存在 Pyomo 问题,因为 Gurobi 甚至可以解决 NonConvex 问题(将参数 options={'NonConvex':2}
传递给 SolverFactory)
有什么推荐可以让我看看吗?提前致谢
我要解决这个问题。
为了避免conic-constraint-style约束中的非凸性,我是这样做的:
为了避免 SOC 约束中的非凸性,我使用了一个新的变量(我们称之为 g),这样:
model.g = pyo.Var(model.T, doc='non-squared part of conic constraint')
添加二次曲线约束的非平方根部分的新约束:
def RHS_constraint(model, t):
return model.g[t] == sum(model.pjtResUp[j,t] for j in model.J) + model.pbesstResUp['BESS',t] + (model.Ud*model.Delt[t] - model.Us*model.pnomj['PV'])
model.RHS_constraint = pyo.Constraint(model.T, 规则=RHS_constraint)
为了避免 Pyomo LP 文件创建的非线性项的 ValueError,我对两边进行了平方:
def upReserves(model, t):
return model.g[t]**2 >= (model.erf**2)*((model.Ss*model.pnomj['PV'])**2 + (model.Sd*model.Delt[t])**2)
model.upReserves= pyo.Constraint(model.T, rule=upReserves)
感谢那些至少看过这篇文章的人 post。如果你觉得这个方法不对,我也在求新方法
我正在使用 Gurobi 9.1.2 和 Pyomo 6.1.2
我在 pyomo
中使用 pyomo.environ
建模层创建了一个 MILP 模型。
为了推进我的研究,我需要对我的模型实施新的约束。这个新约束有一个平方根,我想用 Gurobi 解决它。
import pyomo.environ as pyo
...
model = pyo.AbstractModel()
#Set
model.J = pyo.Set(doc='Generation set')
model.t = pyo.Set(doc='datetime Set')
model.S = pyo.Set(doc='Storage Systems Set')
#Params
model.Delt = pyo.Param(model.t)
model.Us = pyo.Param()
model.Ud = pyo.Param()
model.Ss = pyo.Param()
model.Sd = pyo.Param()
model.erf = pyo.Param()
#Variables
model.pnomj = pyo.Var(model.J, domain=pyo.NonNegativeReals)
model.pjtResUp = pyo.Var(model.J, model.T, domain=pyo.NonNegativeReals)
model.pbesstResUp = pyo.Var(model.S, model.T, domain=pyo.NonNegativeReals)
我要实现的约束是这个 Quadratic Constraint
其中 Δp^{SR+}_{j,t} 是 model.pjtResUp
而 Δp^{SR+}__{B,t} 是 model.pbesstResUp
def upReserves(model, t):
return model.Us*model.pnomj['PV'] - model.Ud*model.Delt[t] + \
model.erf*pyo.sqrt((model.Ss*model.pnomj['PV'])**2 + (model.Sd*model.Delt[t])**2) <= \
sum(model.pjtResUp[j,t] for j in model.J) + model.pbesstResUp['BESS',t]
这给了我下一个 ValueError:
ValueError: Cannot write legal LP file. Constraint 'upReserves[2020-01-01 00:00:00]' has a body with nonlinear terms.
在options={'NonConvex':2}
传递给 SolverFactory)
有什么推荐可以让我看看吗?提前致谢
我要解决这个问题。
为了避免conic-constraint-style约束中的非凸性,我是这样做的:
为了避免 SOC 约束中的非凸性,我使用了一个新的变量(我们称之为 g),这样:
model.g = pyo.Var(model.T, doc='non-squared part of conic constraint')
添加二次曲线约束的非平方根部分的新约束:
def RHS_constraint(model, t): return model.g[t] == sum(model.pjtResUp[j,t] for j in model.J) + model.pbesstResUp['BESS',t] + (model.Ud*model.Delt[t] - model.Us*model.pnomj['PV'])
model.RHS_constraint = pyo.Constraint(model.T, 规则=RHS_constraint)
为了避免 Pyomo LP 文件创建的非线性项的 ValueError,我对两边进行了平方:
def upReserves(model, t): return model.g[t]**2 >= (model.erf**2)*((model.Ss*model.pnomj['PV'])**2 + (model.Sd*model.Delt[t])**2) model.upReserves= pyo.Constraint(model.T, rule=upReserves)
感谢那些至少看过这篇文章的人 post。如果你觉得这个方法不对,我也在求新方法