如何解决优化潮流的 Pyomo 约束迭代
我正在解决 DC 最优潮流问题,并且我正在尝试集思广益以最有效的方式迭代 Pyomo 中的约束。
以下是数据结构,其中 i 和 k 是通过分支连接的节点,X 是电抗,是分支的一个属性。
我遇到问题的约束如下:
其中符号“delta”和“p”是约束中的变量,每个节点都有一个单独的delta和p值。这个约束的主要作用是确保从所有连接的节点 k 流入节点 i 的所有功率等于同一节点中现有的功率值。
这是一个 i=1 和 i=2 的例子,约束的迭代。
所以我试图找到在 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。