优化潮流的 Pyomo 约束迭代

问题描述

我正在解决 DC 最优潮流问题,并且我正在尝试集思广益以最有效的方式迭代 Pyomo 中的约束。

以下是数据结构,其中 i 和 k 是通过分支连接的节点,X 是电抗,是分支的一个属性

Sample Branch Data

我遇到问题的约束如下:

constraint

其中符号“delta”和“p”是约束中的变量,每个节点都有一个单独的delta和p值。这个约束的主要作用是确保从所有连接的节点 k 流入节点 i 的所有功率等于同一节点中现有的功率值。

这是一个 i=1 和 i=2 的例子,约束的迭代。

Sample constraint

所以我试图找到在 pyomo 中声明这个约束的最有效方法,而不是像这样写几个约束迭代:

def P1_rule(modelo):
    return modelo.p[0]-L[0]== ((modelo.d[0]-modelo.d[1])/0.1)+((modelo.d[0]-modelo.d[2])/0.1)
model.P1 = Constraint(rule=P1_rule)

def P2_rule(modelo):
    return modelo.p[1]-L[1]==((modelo.d[1]-modelo.d[0])/0.1)+((modelo.d[1]-modelo.d[2])/0.1)
model.P2 = Constraint(rule=P2_rule)

def P3_rule(modelo):
    return modelo.p[2]-L[2] ==((modelo.d[2]-modelo.d[0])/0.1)+((modelo.d[2]-modelo.d[1])/0.1)
model.P3 = Constraint(rule=P3_rule)

我想要这样的一行,以便它可以在庞大的网络中轻松推广:

def P3_rule(modelo):
    return modelo.p[i] ==((modelo.d[i]-modelo.d[k])/X[k])
model.P3 = Constraint(rule=P3_rule)

我想出了一种方法包括重组数据和创建新的索引数组等...我想看看我是否可以使用保持相同结构的数据更直接地应用约束。

解决方法

好的,所以我想出了怎么做。最好的方法,我不知道是可能的,是通过在求和中创建一个 if 语句,所以基本上在求和中进行完整的条件迭代。在下面的代码中,G是节点列表,而“From”和“To”是FullBranch数据表中的分支编号列。

def Try_rule(mod,g):
        return mod.p[g] - L[g] == sum((mod.d[i-1]-mod.d[k-1])/FullBranch.loc[x,"X"] for x,(i,k) in enumerate(zip(FullBranch["From"],FullBranch["To"])) if i == g+1)
model.Try = Constraint(G,rule=Try_rule)