NetworkX을 사용하여 둘 이상의 소스 및 싱크에 대한 최대 플로우 문제를 해결합니다. 나는 NetworkX에서 비교적 잘 작동하는 함수를 찾았지만 그러나 문제는 순 수요가 0이어야한다는 것입니다. 즉 싱크가 필요 이상으로 줄어들지 않아야합니다. 그렇지 않으면 오류가 발생합니다.모든 요구 사항을 만족하지 않는 최소 비용의 최대 플로우
최적의 흐름을 계산할 수 있도록 허용 할 수있는 방법 (또는이 알고리즘을 어떻게 수정할 수 있습니까?)이 모든 알고리즘이 반드시 모든 조건을 만족시키는 것은 아닙니까? 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