首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一个必经点的最短路径

一个必经点的最短路径

作者头像
裴来凡
发布2022-05-29 10:30:51
发布2022-05-29 10:30:51
49500
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
import matplotlib.pyplot as plt
import networkx as nx
gAnt=nx.Graph()
gAnt.add_weighted_edges_from([(0,1,3),(0,2,1),(0,3,1),
                            (1,2,1),(1,4,1),(1,9,4),
                            (2,3,1),(2,4,2),(2,5,1),
                            (3,5,2),(3,6,2),(3,7,1),
                            (4,5,1),(4,9,1),
                            (5,6,1),(5,9,3),(5,10,1),(5,12,3),
                            (6,7,1),(6,8,2),(6,12,2),(6,13,4),(6,14,3),
                            (7,8,1),
                            (8,14,1),(8,15,3),
                            (9,10,1),(9,11,1),
                            (10,11,1),(10,12,2),
                            (11,12,1),(11,16,1),
                            (12,13,2),(12,16,1),
                            (13,14,1),(13,15,2),(13,16,2),(13,17,1),
                            (14,15,1),
                            (15,17,4),
                            (16,17,1)])#向图中添加多条赋权边:(node1,node2,weight)
pos={0:(0,8),1:(7,12),2:(6,9),3:(5,6),4:(11,10),5:(14,8),#指定顶点位置
     6:(17,6),7:(10,4),8:(19,4),9:(18,12),10:(21,10),11:(28,12),
     12:(25,8),13:(30,7),14:(24,5),15:(29,4),16:(32,10),17:(37,8)}
minWPatha=nx.dijkstra_path(gAnt,source=0,target=6)#N0到N6的最短加权路径
lMinWPatha=nx.dijkstra_path_length(gAnt,source=0,target=6)#最短加权路径长度
minWPathb=nx.dijkstra_path(gAnt,source=6,target=17)# 6到N17的最短加权路径
lMinWPathb=nx.dijkstra_path_length(gAnt,source=6,target=17)#最短加权路径长度
minWPatha.extend(minWPathb[1:]) # 拼接 minWPath3a、minWPath3b 并去重 N7
print("\n问题: 一个必经点的约束")
print("S 到 E 的最短加权路径: ", minWPatha)
print("S 到 E 的最短加权路径长度: ", lMinWPath3a+lMinWPathb)
edgeList=[]
for i in range(len(minWPath3a)-1):
    edgeList.append((minWPath3a[i],minWPath3a[i+1]))
nx.draw_networkx_edges(gAnt,pos,edgelist=edgeList,edge_color='#ffc0cb',width=6)#设置边的颜色
nx.draw(gAnt,pos,with_labels=True,alpha=0.8)
labels=nx.get_edge_attributes(gAnt,'weight')
nx.draw_networkx_edge_labels(gAnt,pos,edge_labels=labels,font_color='c')#显示权值
nx.draw_networkx_nodes(gAnt,pos,nodelist=[0,17],node_color='yellow')#设置顶点颜色
nx.draw_networkx_nodes(gAnt,pos,nodelist=[7,12],node_color='lime')#设置顶点颜色
nx.draw_networkx_edges(gAnt,pos,edgelist=[(2,4),(13,14)],edge_color='lime',width=2.5)#设置边的颜色
nx.draw_networkx_edges(gAnt,pos,edgelist=[(11,12)],edge_color='r',width=2.5)#设置边的颜色
plt.show()

问题: 一个必经点的约束 S 到 E 的最短加权路径: [0, 3, 6, 12, 16, 17] S 到 E 的最短加权路径长度: 7

算法:一个必经点的最短路径是分解为起点至必经点和必经点至终点求最短加权路径和最短加权路径长度,然后合并得到经过必经点的最短加权路径和最短加权路径长度。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档