利用Python进行数学建模:图

 最短路径问题:

dijkstra算法求解最短路径:由于这个算法采取的是贪心策略,求的是每一步中的最优解,所以总的解并不一定是全局最优解,这个算法不能处理负权边

'''图的临接链表
    0     1    2    3    4    5    6    7    8
0   0,     1, inf,   3, inf, inf, inf, inf, inf
1    1,     0,   5, inf,   2, inf, inf, inf, inf
2   inf, inf,   0,   1, inf,   6, inf, inf, inf
3   inf, inf, inf,   0, inf,   7, inf,   9, inf
4   inf,   2,   3, inf,   0,   4,   2, inf, 8
5   inf, inf,   6,   7, inf,   0, inf,   2, inf
6   inf, inf, inf, inf, inf,   1,   0, inf, 3
7   inf, inf, inf, inf, inf, inf,   1,   0, 2
8   inf, inf, inf, inf,   8, inf,   3,   2, 0  
'''

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()  #先创建一个无向图
G.add_weighted_edges_from([(0, 1, 1), (1, 0, 1), (1, 4, 2), (2, 1, 5), (2, 4, 3), (2, 5, 6), (3, 0, 3), (3, 2,1),
                  (3, 5, 7), (4, 1, 2), (4, 8, 8), (5, 2, 6), (5, 3, 7), (5, 4, 4), (5, 6, 1), (6, 4, 2),
                  (6, 7, 1), (6, 8, 3), (7, 3, 9), (7, 5, 2), (7, 8, 2), (8, 4, 8), (8, 6, 3), (8, 7, 2)])

min_path = nx.dijkstra_path(G, source=0, target=7)  #计算最短加权路径,开始于0点,结束于点7
min_path_len = nx.dijkstra_path_length(G, source=0, target=7)   #计算最短路径的权的和
print(min_path)
print(min_path_len)

pos = nx.spring_layout(G)   #这个函数接收一个图对象,返回图中每一个点在可视化中的位置,用于图的可视化绘制
labels = nx.get_edge_attributes(G, "weight")

#图的可视化
nx.draw(G, pos, with_labels=True, font_color='red') #这里的pos参数也可以自己定义,格式为{节点:(节点要在的x轴,节点要在的y轴)}
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_color="red")

plt.show()
#对于有负权的计算,可以使用Bellman-Ford算法,计算最短路径的函数为
#bellman_ford_path(G, source, target, weight=‘weight’)
#bellman_ford_path_length(G, source, target, weight=‘weight’)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值