Pyomo: 创建关于电力分配的抽象模型

问题描述 投票:0回答:1

我是一个PyomoPython的新用户。在学习pyomo的过程中,我需要解决一些优化问题。

我需要在总发电量和总需求量(800MW)之间做一个平衡。如果我想找到 "Sum(a) "的最小值。p^2+bp+c))'.这就是数学模型。这个问题的数学模型

如何构建一个抽象模型,让我可以从下面表格中的同一行中选择a、b、c的值?如果我单独设置'集合',那么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
;

你能帮我解决这个问题吗? 谢谢你

薇薇

python optimization pyomo
1个回答
0
投票

我认为你应该按照Pyomo文档中的描述来构建你的.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 
;

现在我不确定 PminPmax因为在你的模型中,它们似乎是二维的,而在你的数据中,它们似乎只是一维的。但一般来说,你可以按照上面链接中的说明来创建你的.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)
© www.soinside.com 2019 - 2024. All rights reserved.