数学建模--最短路径算法的Python实现

目录

1.算法流程简介

2.算法核心代码

3.算法效果展示

1.算法流程简介

#最短路径算法
#针对有向图的最短路径问题,我们有很多的算法能解决.
"""
目前主流算法如下所示:
Dijkstra算法:Dijkstra算法是一种单源最短路径算法,用于计算从起点到其它所有节点的最短路径。该算法的基本思想是从起点开始,依次计算每个节点到起点的最短路径,然后再依次计算每个节点到起点的最短路径,直到所有节点都被计算完毕。。
Ford算法:Ford算法是一种动态规划算法,用于找到带权重的有向图中从一个起点到所有其他节点的最短路径。该算法可以处理负边权图,并且还可以检测到负权环。
Floyd-Warshall算法:Floyd-Warshall算法是一种动态规划算法,用于找到带权重的有向图中任意两个节点之间的最短路径。该算法可以处理负边权图,并且可以同时计算多组最短路径。
"""
"""
#在python中,我们能够借用networkx库中的函数来进行最短路径的求解
如下所示:networks_shortest_path(G,source,target,weight,method)函数如下所示:
networkx.shortest_path(G, source=None, target=None, weight=None, method='dijkstra')
1.G代表图矩阵,可以是无向或者有向
2.source代表的是起始点
3.target代表的是终止点
4.weight代表的边与边之间的权重关系
5.method表示所用的算法,默认为Dijkstra,也可以指定Bellman-Ford和Floyd-Warshall。
#ps1:该算法返回值是一个字典,键表示的是目标结点,值表示最短路径
#ps2:如果需要求最短的距离,请使用networks_short_path_length()
"""
具体流程步骤:
#1.导入各边距离权重矩阵
#2.将矩阵进行转化
#3.求解任意点的最短路径问题,以A点为例

2.算法核心代码

import networkx as nx
#1.导入各边距离权重矩阵
number=6#gragh中参与计算的点的数量
dis = [[0, 50, 0, 40, 25, 10],
         [50, 0, 15, 20, 0, 25],
         [0, 15, 0, 10, 20, 0],
         [40, 20, 10, 0, 10, 25],
         [25, 0, 20, 10, 0, 55],
         [10, 25, 0, 25, 55, 0]]
#2.将矩阵进行转化
G=nx.DiGraph()
for i in range(number):
    for j in range(number):
        if dis[i][j]!=0:#可以处理负权
            G.add_edge(chr(i+65),chr(j+65),weight=dis[i][j])
#3.求解任意点的最短路径问题,以A点为例
best_path = nx.shortest_path(G, source='A', weight='weight') 
best_path_length = nx.shortest_path_length(G, source='A', weight='weight')#答案存在这里   
for loc,cost in best_path_length.items():
    print("从A到",str(loc),"的最短路径是",str(best_path[loc]),"票价为"+str(cost)+"元")

3.算法效果展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python,可以使用多种算法来解决最短路径问题。其最常用的算法包括Dijkstra算法、Bellman-Ford算法和Floyd算法。 Dijkstra算法是一种用于解决单源最短路径问题的贪心算法。它通过不断选择与当前节距离最近的节,以逐步扩展最短路径树,直到找到目标节或所有节都被遍历过。 Bellman-Ford算法是一种用于解决带有负权边的图的单源最短路径问题的动态规划算法。它通过对图所有边进行松弛操作,逐步更新节最短路径估计值,直到收敛或检测到负权环。 Floyd算法是一种用于解决全局最短路径问题的动态规划算法。它通过维护一个二维矩阵来存储任意两个节之间的最短路径估计值,并通过逐个节转来更新矩阵的值,最终得到全局最短路径。 除了这些经典算法之外,还有启发式算法A*可以用于求解最短路径问题。A*算法通过综合考虑节的实际代价和预估代价,以选择下一个要扩展的节,并逐步搜索最优解。 在Python,可以使用图论库如NetworkX来实现这些算法,同时也可以根据具体的问题需求进行自定义实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python小白的数学建模课-16.最短路径算法](https://blog.csdn.net/youcans/article/details/118555468)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔济沧海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值