NetworkXを使用して、複数のソースとシンクで最大フローの問題を解決しています。私は、NetworkXの中で比較的うまく動作する関数、すなわちmax_cost_flow
と呼ばれる関数を見つけましたが、問題はネット需要がゼロでなければならないということです。つまり、シンクが必要以上に少なくなる必要はありません。すべての要求を満たす最小コストの最大フロー
可能な限り最良のフローを計算できるようにするために、このアルゴリズムを変更するにはどうすればよいですか?
kraskevichの提案パー:あなたは新しいソース頂点を作成し、ゼロコストとの古い値とエッジを追加することにより、シングルソースの問題へのマルチソースフローの問題を変換することができ
import networkx as nx
def convert(graph):
allNodes = graph.nodes()
newSource = len(allNodes) + 1
newSink = len(allNodes) + 2
graph.add_node(newSource)
graph.add_node(newSink)
for currentNode in allNodes:
demand = graph.node[currentNode]['demand']
if demand < 0 :
graph.add_edge(newSource, currentNode, weight=0, capacity=demand)
if demand > 0:
graph.add_edge(newSink, currentNode, weight=0, capacity=demand)
return graph
g = nx.DiGraph()
g.add_node(1, demand = 1)
g.add_node(2, demand = -2)
g.add_node(3, demand = 2)
g.add_node(4, demand = -4)
g.add_edge(1, 2, weight=4, capacity=100)
g.add_edge(1, 4, weight=3, capacity=100)
g.add_edge(3, 2, weight=5, capacity=100)
g.add_edge(3, 4, weight=2, capacity=100)
g.add_edge(3, 1, weight=1)
newGraph = convert(g)
print(nx.max_flow_min_cost(g, newGraph.nodes()[-2],newGraph.nodes()[-1]))
コードにはいくつかのバグがあります。私は私の答えに実際の例を加えました。 – kraskevich