创建高效的 Gurobi 约束环

问题描述 投票:0回答:0

我有一个功率流图/图表,我想创建一个有效的矩阵。 我的示例输入是:

lines = [ (0,1), (1,2), (2,3), (1,4), (4,5), (1,6), (2,7) ]

我想创建一个循环函数,它为所有 i 提供以下输出:

model.addConstr(p[i] + f[:,i] - f[i,:] - l[i,:]) -d[i])

其中":"表示连接的所有节点。

例子:

line1: p(0)-f(0,1)-l(0,1)-d(0)=0
line2: p(1)+f(0,1)-f(1,2)-f(1,4)-f(1,6)-l(1,2)-l(1,4)-l(1,6)-d(1)=0
line3: p(2)+f(1,2)-f(2,3)-f(2,7)-l(2,3)-l(2,7)-d(2)=0
line4: p(3)+f(2,3)-d(3)=0
line5: p(4)+f(1,4)-f(4,5)-l(4,5)-d(4)=0
line6: p(5)+f(4,5)-d(5)=0
line7: p(6)+f(1,6)-d(6)=0
line8: p(7)+f(2,7)-d(7)=0

其中 p 是该节点的发电量,-f 和 +f 是流入和流出的流量,-l 是损失,-d 是需求。

通常我正在创建一个从到矩阵,其中每个边表示为 1,其余为 0。但是我正在处理 10k+ 节点,因此效率非常低。

我当前的代码:

for i in bus1:
        model.addConstr(P_gen[i] + gp.quicksum(f_activeP[j,i] for j in bus2 if C.iloc[j,i]==1)
                                 - gp.quicksum(f_activeP[i,j] for j in bus2 if C.iloc[i,j]==1)
                                 == gp.quicksum(P_loss[i,j] for j in bus2 if C.iloc[i,j]==1) + P_demand.iloc[i])

其中 C.iloc==1 验证边缘以减少内存消耗。它不一定是 gp.quicksum,但我们需要添加相关节点的所有边。

我可以通过 {} 或 np.empty 创建变量,但我无法正确定义流。

P={} # or np.empty(N,N)
for i,j in lines:
        P[i,j] = model.addVar(vtype=GRB.CONTINUOUS, name="P-%d%d" %(i,j))
python dictionary for-loop tuples gurobi
© www.soinside.com 2019 - 2024. All rights reserved.