最优潮流的 Pyomo 约束迭代

Pyomo Constraint iteration for Optimal Power Flow

我正在解决一个 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 数据中的分支编号列 table.

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)