【问题标题】:Pyomo: Abstract model creation about power distributionPyomo:关于配电的抽象模型创建
【发布时间】:2020-10-03 12:42:17
【问题描述】:

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

我需要在总发电量和总需求量(800 兆瓦)之间取得平衡。 如果我想找到'Sum(ap^2+bp+c))'的最小值。这是数学模型:mathematics model of this problem

如何构建一个抽象模型,我可以从下表的同一行中选择 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
;

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

薇薇

【问题讨论】:

  • 到目前为止您尝试过什么?你的模型写出来了吗?此外,如果您已经将数据(上图)放在数据框中,则应该直接将其放入具体模型中。不需要摘要。
  • 嗨,杰夫。上次,你帮我纠正了我的模型(那个运输问题)。我所做的如上所示。我需要学习抽象模型,因为我在以后的学习中需要使用大数据文件。我不知道如何从表的同一行中选择 a、b、c 的值。以及如何在 Pmin 和 Pmax 之间设置随机值?使用两个约束来限制值?这真的让我很困惑。
  • 哦,来吧。 :) 这是一个相当微弱的尝试。很多错误/缺少索引/等。重新看看你的问题。你需要多少个索引?不确定您在哪里看到随机数,但阅读 random 上的 dox 可能也会有所帮助。
  • 真的很抱歉这个模型。我会尝试纠正它。但是如何从表的同一行中选择a、b、c的值呢?
  • 对所有 3 个使用相同的索引?

标签: python optimization pyomo


【解决方案1】:

我认为您应该按照 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 
;

现在我不确定PminPmax,因为在您的模型中它们似乎是二维的,而在您的数据中,它们似乎只是一维的。但通常,您可以按照上面链接中的说明创建 .dat 文件。

关于你的第二个问题,我不确定我是否理解正确,但你指的是数学模型描述中的P_min &lt;= P &lt;= P_max约束,对吗?

然后,对于P_min &lt;= 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)

【讨论】:

  • 感谢您的帮助,先生!你知道如何生成大于 Pmin 小于 Pmax 的数吗?
  • 如果有帮助,欢迎采纳。我现在也对其进行了编辑以回答您的第二个问题。
  • 谢谢,先生。我已经更改了上面的代码。我知道这不是一个好模型。请指出里面的错误。并不是我需要的所有生成器,因为我想找到这些生成器的最佳分布。但是如何设置这个的约束呢?
  • 您的模型在我看来还不错,并且符合您提供的数学描述。您不需要额外的约束来选择生成器。这将隐式完成,因为对于某些生成器,P 变量将等于 0,这意味着它们不会运行。
  • 但是这个模型不能运行并得到最好的结果......我不知道为什么......你能帮我解决一下吗?
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2016-04-03
  • 2019-11-30
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多