Python 最大流量:修改networkx源代码,使一些边缘不再';不要把所有的流量都占满了

Python 最大流量:修改networkx源代码,使一些边缘不再';不要把所有的流量都占满了,python,graph,networkx,Python,Graph,Networkx,最大流算法通过给定边容量的图查找最大流。但是,如果在流经两条边之间存在一个选项,则通常只会完全利用其中一条边,而忽略另一条边。通过使用“最小成本-最大流量”并将优选边缘的成本设置为较低,可以影响哪些边缘应为优选边缘。然而,与其他边缘相比,这仍然使一些边缘更可取。在这种情况下,如果我希望流在边之间均匀分布,该怎么办?这里是一个玩具的例子。我们可以看到max flow(使用python networkx;下面提供的代码)利用了vertex-1,并通过它流动了4个单元。然而,它也可以很容易地通过ver

最大流算法通过给定边容量的图查找最大流。但是,如果在流经两条边之间存在一个选项,则通常只会完全利用其中一条边,而忽略另一条边。通过使用“最小成本-最大流量”并将优选边缘的成本设置为较低,可以影响哪些边缘应为优选边缘。然而,与其他边缘相比,这仍然使一些边缘更可取。在这种情况下,如果我希望流在边之间均匀分布,该怎么办?这里是一个玩具的例子。我们可以看到max flow(使用python networkx;下面提供的代码)利用了vertex-1,并通过它流动了4个单元。然而,它也可以很容易地通过vertex-1发送2个单位,通过vertex-2发送2个单位。我怎样才能让它这样做?要么通过修改networkx的源代码,要么通过某种形式的扩展

注意,我在CS stackexchange上问了一个类似的问题:。在那个里,我要求的是一个有明确目标函数的最优解(最小化流经边缘的流量变化)。在这里,对源代码或其顶部的任何更改都足以使流不那么集中在下面示例中给出的边缘

通过network-x的最大流量代码(与CS stackexchange版本无关或在CS stackexchange版本中未正确呈现):

如果你采用Edmonds-Karp方法,也许你可以在BFS步骤中随机选择后续步骤?
import networkx as nx
from networkx.algorithms.flow import maximum_flow


G = nx.DiGraph()

G.add_edges_from([(0, 1, {'capacity': 5, 'weight': 1}),
              (0, 2, {'capacity': 3, 'weight': 0.5}),
              (0, 3, {'capacity': 1, 'weight': 1}),
              (4, 6, {'capacity': 4, 'weight': 1}),
              (5, 6, {'capacity': 5, 'weight': 1}),
              (1, 4, {'capacity': np.inf, 'weight': 1}),
              (2, 4, {'capacity': np.inf, 'weight': 1}),
              (3, 5, {'capacity': np.inf, 'weight': 1}),
            ])

mincostflow = nx.max_flow_min_cost(G,0,6)
flow_val, flow_dict = nx.maximum_flow(G,0,6)