Mathematica 12 图论方面需要注意的最小费用最大流函数结果

此问题来自qq群 Mathematica数理力研讨班(959910893).
网络流是图论里面重要的概念之一,有关基本概念可见任何图论教材. 一个具体一点的问题是求解一个图的l两点之间最小费用最大流
Mathematica 提供了函数 FindMinimumCostFlow 可是这个函数求出来的结果让人大跌眼镜。具体如下:

data = Partition[{s, v1, 8, 2, s, v3, 7, 8, v1, v3, 5, 5, v1, v2, 9, 
   2, v2, v3, 2, 1, v3, v4, 9, 3, v4, v2, 6, 4, v2, t, 5, 6, v4, t, 
   10, 7}, 4]
g = SetProperty[
  Graph[#[[1]] -> #[[2]] & /@ data, EdgeCapacity -> data[[All, 3]], 
   EdgeCost -> data[[All, 4]]], {VertexLabels -> Automatic}]
v = FindMinimumCostFlow[g, s, t, "OptimumFlowData"](*流值*)
gc = FindMinimumCostFlow[g, s, t] (*费用*)

在这里插入图片描述

读者可运行之,最后会发现流值为0,费用 90. 流值为0很显然是错误的。
这里可以采用对此图采用相应的算法解决。胡运权的运筹学教材这一块讲解很详细。 有关手算计划下一次单独公布。
此时我们用 networkx库函数 计算。明显合理很多。

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
G = nx.DiGraph()
G.add_edges_from(
    [('s', 'v3', {'capacity': 7, 'weight': 8}), 
     ('s', 'v1', {'capacity': 8, 'weight': 2}), 
     ('v1','v3', {'capacity': 5, 'weight': 5}), 
     ('v1','v2', {'capacity': 9, 'weight': 2}),
     ('v2','v3', {'capacity': 2, 'weight': 1}),
    ('v3','v4', {'capacity': 9, 'weight': 3}),
     ('v2', 't',{'capacity': 5, 'weight': 6}), 
     ('v4', 'v2',{'capacity': 6, 'weight': 4}),
     ('v4', 't'),{'capacity': 10, 'weight': 7}])
nx.draw(G,with_labels = True)
mincostFlow = nx.max_flow_min_cost(G,'s', 't')
print(mincostFlow)
print(nx.cost_of_flow(G, mincostFlow))
{'s': {'v3': 6, 'v1': 8}, 'v3': {'v4': 9}, 'v1': {'v3': 1, 'v2': 7}, 'v2': {'v3': 2, 't': 5}, 'v4': {'v2': 0, 't': 9}, 't': {}, 'capacity': {'weight': 0}, 'weight': {}}
142

显示费用142, 依据定义流值看源点s顶点的流出流量,应为14(=5+9)。
评注 是不是mma 对最小费用最大流定义的不一样还是本身算法错误,有待讨论。不过使用此函数者应予以足够关注。

原创文章 16 获赞 8 访问量 1219

猜你喜欢

转载自blog.csdn.net/zlc_abc/article/details/104829141
今日推荐