Pyomo:关于配电的抽象模型创建
Pyomo: Abstract model creation about power distribution
我是新 Pyomo/Python 用户。在学习pyomo的过程中,我需要解决一些优化问题。
我需要在总发电量和需求量 (800 MW) 之间取得平衡。
如果我想找到'Sum(ap^2+bp+c))'的最小值。这是数学模型:mathematics model of this problem
如何构造一个抽象模型,让我可以从下面table的同一行中选择a、b、c的值?如果我单独设置 'sets' ,那么 abc 的值将来自不满足公式的不同行。以及如何在 Pmin 和 Pmax 之间设置一个随机值?使用两个约束来限制值?
真是让我一头雾水。
from pyomo.environ import *
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import random
model = AbstractModel()
model.J = Set()
model.A = Param(model.J)
model.B = Param(model.J)
model.C = Param(model.J)
model.P_min = Param(model.J)
model.P_max= Param(model.J)
model.P = Var(model.J, domain=NonNegativeReals)
def obj_expression(model):
return sum(model.A* model.P**2+model.B*model.P+model.C for j in model.J)
model.OBJ = Objective(rule=obj_expression, sense=minimize)
# Upper bounds rule
def upper_bounds_rule(model,j):
return model.P[j] <= model.P_max[j]
model.upper = Constraint(model.J,rule=upper_bounds_rule)
# Lower bounds rule
def lower_bounds_rule(model, j):
return model.P[j] >= model.P_min[j]
model.lower = Constraint(model.J, rule=lower_bounds_rule)
def rule_eq1(model,j):
return sum(model.P[j] >= 800;
model.eq1 = Constraint(model.J, rule=rule_eq1)
opt = SolverFactory('Ipopt')
instance = model.create_instance("E:/pycharm_project/PD/pd.dat")
results = opt.solve(instance) # solves and updates instance
#data file
# Creating the set J:
set J := g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 ;
# Creating Parameters A, B, C, P_min, P_max:
param : A B C P_min P_max:=
g1 0.0148 12.1 82 80 200
g2 0.0289 12.6 49 120 320
g3 0.0135 13.2 100 50 150
g4 0.0127 13.9 105 250 520
g5 0.0261 13.5 72 80 280
g6 0.0212 15.4 29 50 150
g7 0.0382 14.0 32 30 120
g8 0.0393 13.5 40 30 110
g9 0.0396 15.0 25 20 80
g10 0.0510 14.3 15 20 60
;
你能帮我解决这个问题吗?谢谢!
薇薇
我认为您应该根据 Pyomo 文档 here.
中描述的内容构建您的 .dat 文件
我相信对于参数 A、B、C,这样的东西对你有用:
# Creating the set J:
set J := g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 ;
# Creating Parameters A, B, C:
param : A B C :=
g1 0.0148 12.1 82
g2 0.0289 12.6 49
g3 0.0135 13.2 100
g4 0.0127 13.9 105
g5 0.0261 13.5 72
g6 0.0212 15.4 29
g7 0.0382 14.0 32
g8 0.0393 13.5 40
g9 0.0396 15.0 25
g10 0.0510 14.3 15
;
现在我不确定 Pmin
和 Pmax
,因为在您的模型中它们似乎是二维的,而在您的数据中它们似乎只是一维的。但一般来说,您可以按照上面 link 中的说明创建您的 .dat 文件。
关于你的第二个问题,我不确定我是否理解正确,但是你参考了数学模型描述中的P_min <= P <= P_max
约束,对吗?
然后,对于 P_min <= P
部分,您需要稍微更改当前约束:
def lower_bounds_rule(model, i, j):
return model.P[i,j] >= model.P_min[i,j]
model.lower = Constraint(model.i,model.j,rule=lower_bounds_rule)
我是新 Pyomo/Python 用户。在学习pyomo的过程中,我需要解决一些优化问题。
我需要在总发电量和需求量 (800 MW) 之间取得平衡。 如果我想找到'Sum(ap^2+bp+c))'的最小值。这是数学模型:mathematics model of this problem
如何构造一个抽象模型,让我可以从下面table的同一行中选择a、b、c的值?如果我单独设置 'sets' ,那么 abc 的值将来自不满足公式的不同行。以及如何在 Pmin 和 Pmax 之间设置一个随机值?使用两个约束来限制值? 真是让我一头雾水。
from pyomo.environ import *
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
import random
model = AbstractModel()
model.J = Set()
model.A = Param(model.J)
model.B = Param(model.J)
model.C = Param(model.J)
model.P_min = Param(model.J)
model.P_max= Param(model.J)
model.P = Var(model.J, domain=NonNegativeReals)
def obj_expression(model):
return sum(model.A* model.P**2+model.B*model.P+model.C for j in model.J)
model.OBJ = Objective(rule=obj_expression, sense=minimize)
# Upper bounds rule
def upper_bounds_rule(model,j):
return model.P[j] <= model.P_max[j]
model.upper = Constraint(model.J,rule=upper_bounds_rule)
# Lower bounds rule
def lower_bounds_rule(model, j):
return model.P[j] >= model.P_min[j]
model.lower = Constraint(model.J, rule=lower_bounds_rule)
def rule_eq1(model,j):
return sum(model.P[j] >= 800;
model.eq1 = Constraint(model.J, rule=rule_eq1)
opt = SolverFactory('Ipopt')
instance = model.create_instance("E:/pycharm_project/PD/pd.dat")
results = opt.solve(instance) # solves and updates instance
#data file
# Creating the set J:
set J := g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 ;
# Creating Parameters A, B, C, P_min, P_max:
param : A B C P_min P_max:=
g1 0.0148 12.1 82 80 200
g2 0.0289 12.6 49 120 320
g3 0.0135 13.2 100 50 150
g4 0.0127 13.9 105 250 520
g5 0.0261 13.5 72 80 280
g6 0.0212 15.4 29 50 150
g7 0.0382 14.0 32 30 120
g8 0.0393 13.5 40 30 110
g9 0.0396 15.0 25 20 80
g10 0.0510 14.3 15 20 60
;
你能帮我解决这个问题吗?谢谢!
薇薇
我认为您应该根据 Pyomo 文档 here.
中描述的内容构建您的 .dat 文件我相信对于参数 A、B、C,这样的东西对你有用:
# Creating the set J:
set J := g1 g2 g3 g4 g5 g6 g7 g8 g9 g10 ;
# Creating Parameters A, B, C:
param : A B C :=
g1 0.0148 12.1 82
g2 0.0289 12.6 49
g3 0.0135 13.2 100
g4 0.0127 13.9 105
g5 0.0261 13.5 72
g6 0.0212 15.4 29
g7 0.0382 14.0 32
g8 0.0393 13.5 40
g9 0.0396 15.0 25
g10 0.0510 14.3 15
;
现在我不确定 Pmin
和 Pmax
,因为在您的模型中它们似乎是二维的,而在您的数据中它们似乎只是一维的。但一般来说,您可以按照上面 link 中的说明创建您的 .dat 文件。
关于你的第二个问题,我不确定我是否理解正确,但是你参考了数学模型描述中的P_min <= P <= P_max
约束,对吗?
然后,对于 P_min <= P
部分,您需要稍微更改当前约束:
def lower_bounds_rule(model, i, j):
return model.P[i,j] >= model.P_min[i,j]
model.lower = Constraint(model.i,model.j,rule=lower_bounds_rule)