Minimal cost flow network when using multiple demand/supply sets (networkx)

Viewed 140

This is my first stackoverflow submission, so please let me know whether I am asking this question according to community guidelines.

Question in short: Is there a way to have networkx find the min cost flow network given multiple demand/supply sets?

I currently working on a network optimization problem in which I am using the nx.min_cost_flow() function to calculate the minimum cost network layout given a supply and demand set for the nodes, and maximum capacity for certain edges. The code works, but now I am trying to find a way to find the optimal network layout when given multiple supply and demand sets over time. I have tried a method that works for optimal trees (iterating through all the demand/supply sets and using the maximum capacity for each edge in each time step), but sadly this does not provide the optimal solution when using nx.min_cost_flow() as I want the model to be able to create loops as well.

I have added the relevant code below, but it might be a bit confusing as there are many elements referring to other parts of the model unrelated to the problem I am currently facing. The complete model is too large to share.

I have tried looking for a solution online without success. Hopefully you know a solution. Thanks in advance!

def full_existing(T,G,folder,rpc,routing): 
fullG = G.copy()
for (i,j) in fullG.edges():
    fullG[i][j]['capacity'] = 0
    for (i,j) in T.edges():
        if 'current' in T[i][j]:
            fullG[i][j]['weight'] = T[i][j]['weight']*rpc
f_demand = open(folder+'/demand.txt','r')
for X in f_demand:
    print('Demand set is called')
    Y = X.split(',')
    demand = {i: float(Y[i+1]) for i in range(len(Y)-1)}      
    G1 = fullG.copy()
    for i in fullG.nodes():
        if i in demand.keys():
            G1.nodes[i]['demand'] = demand[i]
        else:
            G1.nodes[i]['demand'] = 0
    for (i,j) in G1.edges():
        G1[i][j]['capacity'] = inf 
        for (i,j) in T.edges():
            if 'current' in T[i][j]:
                G1[i][j]['capacity'] = T[i][j]['current']
                G1[i][j]['weight'] = T[i][j]['weight']*rpc
            else:
                G1[i][j]['capacity'] = inf           
    G1 = simplex(G1)
    for i,j in G1.edges():
        fullG[i][j]['capacity'] = max(fullG[i][j]['capacity'],G1[i][j]['capacity'])
for (i,j) in T.edges():
    if 'current' in T[i][j]:
        fullG[i][j]['weight'] = T[i][j]['weight']     
nx.set_edge_attributes(fullG,nx.get_edge_attributes(T,'current'),'current')
return fullG

The simplex procedure is called because the input graph is undirected.

def simplex(G):
GX = G.copy()    
G1 = GX.to_directed()
ns = nx.min_cost_flow(G1)
for i,j in G1.edges():
    if ns[i][j] > 0 or ns[j][i] > 0:
        GX[i][j]['capacity'] = max(ns[i][j],ns[j][i])
    else:
        GX[i][j]['capacity'] = 0
return GX
0 Answers
Related