Pyomo优化问题,带索引的问题



我正在尝试使用pyomo包优化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]用于m.n中的n(==sum(Pd[n]用于m.n中的n(

现在我的问题是:在情况5中,有5个节点,在节点1有两个生成器,但在节点2没有生成器。因此,我想我需要一个生成器的索引,以m为单位?

但是,我不知道如何制定目标函数和负载平衡。应该是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上的两个生成器分组在一起(正如我在评论中所建议的(,我认为您有两个选择。。。。

您可以在尝试对节点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,然后只运行N+1节点上已有的所有内容。

最新更新