数学建模Python图论习题

数学建模简明教程-基于python

第五章 图与网络优化



题目

本文章为自己解答的教材答案:


三、3如表5.3是某运输问题的相关数据,将次问题转换为最小费用最大流问题,画出网络图并求解。

在这里插入图片描述

二、题解

1.问题分析

要使用要使用最大流算法,必须构造一个发点s,和收点t,设出边和边的容量,且要解决最小费用问题需要设出费用且根据链路经行赋权,再构造有向赋权图。
构造有向图(V,E,f)V为图中的节点集合,E为vivj边的集合,C为每条边的容量,
Bij为每条边的费用。
(c,f)第一个数字为容量,f第二各数字为费用
在这里插入图片描述

代码如下(示例):


from platform import node
import numpy as np
import networkx as nx
L=[('s','A',8,0),('s','B',7,0),
('A','1',8,20),('A','2',8,24),('A','3',8,5),
('B','1',7,30),('B','2',7,22),('B','3',7,20),
('1','t',4,0),('1','t',5,0),('1','t',6,0)
]
node=['s']+['A','B']+[str(i) for i in range(1,4)]+['t']
G=nx.DiGraph();n=len(node)
G.add_nodes_from(node)
for k in range(len(L)):
    G.add_edge(L[k][0],L[k][1],capacity=L[k][2],weight=L[k][3])
mincostFlow =nx.max_flow_min_cost(G,'s','t')
print('max flow',mincostFlow)
mincost=nx.cost_of_flow(G,mincostFlow)
print('min cost',mincost)

flow_mat=np.zeros((n,n))
for i,adj in mincostFlow.items():
    for j,f in adj.items():
        flow_mat[node.index(i),node.index(j)]=f
print('max flow:',sum(flow_mat[:-1]))
print('min cost max flow zero:',flow_mat)


2.运行结果

(示例):
max flow {‘s’: {‘A’: 6, ‘B’: 0}, ‘A’: {‘1’: 6, ‘2’: 0, ‘3’: 0}, ‘B’: {‘1’: 0, ‘2’: 0, ‘3’: 0}, ‘1’: {‘t’: 6}, ‘2’: {}, ‘3’: {}, ‘t’: {}}
min cost 120
max flow: [0. 6. 0. 6. 0. 0. 6.]
min cost max flow zero: [[0. 6. 0. 0. 0. 0. 0.]
[0. 0. 0. 6. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 6.]
[0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0.]]


问题总结

最短路径下的最大流量容量为6,在迭代了n次数后,没有出现负增长。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值