繁体   English   中英

Pyomo 优化问题,索引问题

[英]Pyomo optimization problem, problem with index

我正在尝试使用 pyomo package 在 python 中优化发电并最小化成本。 我从 Matpower 案例中获取参数,现在我正在尝试案例 5。

所以通常,我会说:

m.Gen=Var(m.N, domain = NonNegativeReals) 
m.Pg=Var(m.N, domain = Reals)
m.N  = Set(initialize=[i for i in range(bus_number)])

def obj_rule(m):
    cost =  sum(Cg[n]*m.Gen[n] for n in m.N )
    return    cost 
m.obj = Objective(rule = obj_rule, sense=minimize)

def loadbal_rule(m, n):
    return Sb*  m.pg[n] == -m.gen[n] + Pd[n] 
m.loadbal_rule = Constraint(m.N, rule = loadbal_rule)

这里,n 是系统中的节点。 负载平衡确保有足够的电力输送到每个节点。 Pd[n] 是节点 n 的功率需求。 N 是节点的总数。 Sb 是基本功率,pg[n] 是注入节点 n 的功率(可以来自连接到它的任何其他节点)我也对从一个节点到另一个节点的功率流有限制,但我没有在这里显示它们(那是为什么我不能只把 sum(gen[n] for n in mN) == sum( Pd[n] for n in mN)

现在我的问题:在案例 5 中,有 5 个节点,节点 1 有两个生成器,但节点 2 没有生成器。因此,我认为我需要生成器的索引,g in mG?

但是,我不知道如何制定目标 function 和负载平衡。 应该是 m.gen[g,n] 吗?

这是我尝试过的:

def obj_rule(m):
    cost =  sum(Cg[g]*(m.gen[g,n]) for g in m.G for n in m.N) 
    return    cost  
m.obj = Objective(rule = obj_rule, sense=minimize)

def loadbal_rule(m, n,g):
    return Sb*  m.pg[n] == sum(m.gen[n,g] for g in m.G) - Pd_matrix[n] # ??  
m.loadbal_rule = Constraint(m.N, m.G, rule = loadbal_rule)

好的,所以如果你不能只将节点 1 的两个生成器组合在一起(正如我在评论中建议的那样),我认为你有 2 个选择....

您可以按照您的尝试对节点 x 生成器 [n, g] 的决策变量进行双重索引。 如果你这样做,你可以用你应该从数据中生成的一组稀疏的 [n, g] 合法组合来初始化变量。 然后在你的负载平衡中,你需要为每个节点而不是你现在似乎正在做的每个节点生成组合来制定它。 您仍然可以在节点处进行平衡,因此在内部对生成器求和....类似于:

def node_load_bal(m, n):
    return m.pg[n] == sum(m.gen[n, g] for g in m.G) - m.pd[n]
m.load_bal = Constraint(m.N, rule=node_load_bal)

另一种选择可能更聪明和简单,因为它避免了双重索引,它是引入一个假(或合成)节点来容纳额外的生成器。 将其称为节点“1B”或其他名称,并将其逻辑连接(无需求,正确连接到节点 1 等)到“真实”节点 1,然后运行您在 N+1 节点上已有的所有内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM