问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python小白的数学建模课-16.最短路径算法

发布网友 发布时间:2024-09-05 07:49

我来回答

1个回答

热心网友 时间:2024-10-01 16:28

最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径。

最短路径问题有几种形式:确定起点的最短路径,确定终点的最短路径,确定起点和终点的最短路径,全局最短路径问题。

在日常生活中,最短路径长度与最短路径距离好像并没什么区别。但在图论中最短路径长度与最短路径距离却是不同的概念和问题,经常会被混淆。

图论中有无权图和有权图,无权图中的边没有权,赋权图的边带有权,可以表示距离、时间、费用或其它指标。在问题文字描述中,往往并不直接指出是无权图还是有权图,这时就要特别注意最短路径与最短加权路径的区别。

路径长度是把每个顶点到相邻顶点的长度记为 1,而不是指这两个顶点之间道路的距离——两个顶点之间的道路距离是连接边的权(weight)。

路径长度可以认为是飞行棋的步数,或者公交站点的站数,相邻顶点之间为一步,相隔几个顶点就是几站。路径长度是从路径起点到终点的步数,计算最短路径是要计算从起点到终点步数最少的路径。

如果问题不涉及相邻顶点间的距离,要计算从起点到终点的最短路径及对应的最短路径长度,是指这条路径从起点到终点有几步(站),在图论中称为最短路径长度。但是,如果问题给出相邻顶点之间的道路长度或距离,要计算从起点到终点的最短路径及对应的最短距离,显然并不是要找经过最少步数的路径,而是在找路径中各路段的距离之和最小的路径,在图论中称为最短加权路径长度——这里权重是路段距离。

相邻顶点的连接边的权,不仅可以是路段距离,也可以是时间、费用等指标。问题就变成寻求最短时间、最低成本的路径,这实际上也是最短加权路径长度问题。

求解最短路径长度的常用算法是 Dijkstra 算法、Bellman-Ford 算法和Floyd 算法,另外还有启发式算法 A*。

Dijkstra 算法是经典的最短路径算法,在数据结构、图论、运筹学中都是教学的基本算法。有趣的是,在数据结构中 Dijkstra 算法通常是按贪心法讲述,而在运筹学中则被认为是动态规划法。

Dijkstra算法从起点开始,采用贪心法策略,每次遍历距离起点最近且未访问过的邻接顶点, 层层扩展直到终点为止。

Dijkstra算法可以求出加权最短路径的最优解,算法的时间复杂度为O(n^2)。如果边数远小于 n^2,可以用堆结构将复杂度降为O((m+n)log(n))。

Dijkstar算法不能处理负权边,这是由于贪心法的选择规则决定的。

Bellman-Ford 算法是求含负权图的单源最短路径算法。算法原理是对图进行 V-1次松弛操作,得到所有可能的最短路径。

Bellman-Ford 算法可以处理负权边。其基本操作“拓展”是在深度上搜索,而“松弛”操作则在广度上搜索,因此可以对负权边进行操作而不影响结果。

Bellman-Ford 算法的效率很低,时间复杂度高达O(V*E),V、E 分别是顶点和边的数量。SPFA 是 Bellman-Ford 的队列优化,通过维护一个队列极大地减少了重复计算,时间复杂度为 O(k*E) 。

Dijkstra 算法在求解过程中,起点到各顶点的最短路径求出后就不变了。Bellman算法在求解过程中,每次循环都要修改所有顶点间的距离,起点到各顶点最短路径一直要到算法结束才确定。

Floyd 算法又称插点法,运用动态规划思想求解有权图中多源点之间最短路径问题。算法从图的带权邻接矩阵开始,递归地进行 n 次更新得到图的距离矩阵,进而可以得到最短路径节点矩阵。

Floyd 算法的时间复杂度为O(n^3),空间复杂度为 O(n^2)。算法时间复杂度较高,不适合计算大量数据。Floyd 算法的优点是可以一次性求解任意两个节点之间的最短距离,对于稠密图的效率高于执行 V 次 Dijkstra算法。

Floyd 算法可以处理负权边。

Floyd 算法号称只有 5行代码,我们来欣赏一下:

A*算法是一种静态路网中求解最短路径最有效的直接搜索方法。

A*算法是启发式算法,采用最佳优先(Best-first)搜索策略,基于估价函数对每个搜索位置的评估结果,猜测最好的位置优先进行搜索。

A*算法极大地减少了低质量的搜索路径,因而搜索效率很高,比传统的路径规划算法实时性更高、灵活性更强;但是,A*算法找到的是相对最优路径,不是绝对的最短路径,适合大规模、实时性高的问题。

NetworkX 提供了丰富的最短路径函数,除了常见的 Dijkstra 算法、Bellman-ford 算法、Floyd Warshall 算法和 A*算法,还有 Goldbery-Radzik 算法和 Johnson 算法。其中,Bellman-ford 算法函数使用的是队列改进算法,即以 SPFA 算法实现。

其中,最基本的求解最短路径函数 shortest() 和 最短路径长度 shortest_path_length() 是 ‘dijkstra’ 算法和 ‘bellman-ford’ 算法的集成接口,可以通过 method='dijkstra' 选择不同的算法。

shortest_path(G, source=None, target=None, weight=None, method='dijkstra') shortest_path_length(G, source=None, target=None, weight=None, method='dijkstra')

主要参数:

NetworkX 中关于 Dijkstra 算法提供了 13 个函数,很多函数的功能是重复的。这里只介绍最基本的函数 dijkstra_path() 和 dijkstra_path_length()。

dijkstra_path() 用于计算从源到目标的最短加权路径,dijkstra_path_length() 用于计算从源到目标的最短加权路径长度。

dijkstra_path(G, source, target, weight='weight') dijkstra_path_length(G, source, target, weight='weight')

主要参数:

NetworkX 中关于 Bellman-Ford 算法提供了多个函数,这里只介绍最基本的函数 bellman_ford_path() 和 bellman_ford_path_length()。

bellman_ford_path() 用于计算从源到目标的最短加权路径,bellman_ford_path_length() 用于计算从源到目标的最短加权路径长度。

bellman_ford_path(G, source, target, weight='weight') bellman_ford_path_length(G, source, target, weight='weight')

主要参数:

热心网友 时间:2024-10-01 16:36

最短路径问题是图论研究中的经典算法问题,用于计算图中一个顶点到另一个顶点的最短路径。

最短路径问题有几种形式:确定起点的最短路径,确定终点的最短路径,确定起点和终点的最短路径,全局最短路径问题。

在日常生活中,最短路径长度与最短路径距离好像并没什么区别。但在图论中最短路径长度与最短路径距离却是不同的概念和问题,经常会被混淆。

图论中有无权图和有权图,无权图中的边没有权,赋权图的边带有权,可以表示距离、时间、费用或其它指标。在问题文字描述中,往往并不直接指出是无权图还是有权图,这时就要特别注意最短路径与最短加权路径的区别。

路径长度是把每个顶点到相邻顶点的长度记为 1,而不是指这两个顶点之间道路的距离——两个顶点之间的道路距离是连接边的权(weight)。

路径长度可以认为是飞行棋的步数,或者公交站点的站数,相邻顶点之间为一步,相隔几个顶点就是几站。路径长度是从路径起点到终点的步数,计算最短路径是要计算从起点到终点步数最少的路径。

如果问题不涉及相邻顶点间的距离,要计算从起点到终点的最短路径及对应的最短路径长度,是指这条路径从起点到终点有几步(站),在图论中称为最短路径长度。但是,如果问题给出相邻顶点之间的道路长度或距离,要计算从起点到终点的最短路径及对应的最短距离,显然并不是要找经过最少步数的路径,而是在找路径中各路段的距离之和最小的路径,在图论中称为最短加权路径长度——这里权重是路段距离。

相邻顶点的连接边的权,不仅可以是路段距离,也可以是时间、费用等指标。问题就变成寻求最短时间、最低成本的路径,这实际上也是最短加权路径长度问题。

求解最短路径长度的常用算法是 Dijkstra 算法、Bellman-Ford 算法和Floyd 算法,另外还有启发式算法 A*。

Dijkstra 算法是经典的最短路径算法,在数据结构、图论、运筹学中都是教学的基本算法。有趣的是,在数据结构中 Dijkstra 算法通常是按贪心法讲述,而在运筹学中则被认为是动态规划法。

Dijkstra算法从起点开始,采用贪心法策略,每次遍历距离起点最近且未访问过的邻接顶点, 层层扩展直到终点为止。

Dijkstra算法可以求出加权最短路径的最优解,算法的时间复杂度为O(n^2)。如果边数远小于 n^2,可以用堆结构将复杂度降为O((m+n)log(n))。

Dijkstar算法不能处理负权边,这是由于贪心法的选择规则决定的。

Bellman-Ford 算法是求含负权图的单源最短路径算法。算法原理是对图进行 V-1次松弛操作,得到所有可能的最短路径。

Bellman-Ford 算法可以处理负权边。其基本操作“拓展”是在深度上搜索,而“松弛”操作则在广度上搜索,因此可以对负权边进行操作而不影响结果。

Bellman-Ford 算法的效率很低,时间复杂度高达O(V*E),V、E 分别是顶点和边的数量。SPFA 是 Bellman-Ford 的队列优化,通过维护一个队列极大地减少了重复计算,时间复杂度为 O(k*E) 。

Dijkstra 算法在求解过程中,起点到各顶点的最短路径求出后就不变了。Bellman算法在求解过程中,每次循环都要修改所有顶点间的距离,起点到各顶点最短路径一直要到算法结束才确定。

Floyd 算法又称插点法,运用动态规划思想求解有权图中多源点之间最短路径问题。算法从图的带权邻接矩阵开始,递归地进行 n 次更新得到图的距离矩阵,进而可以得到最短路径节点矩阵。

Floyd 算法的时间复杂度为O(n^3),空间复杂度为 O(n^2)。算法时间复杂度较高,不适合计算大量数据。Floyd 算法的优点是可以一次性求解任意两个节点之间的最短距离,对于稠密图的效率高于执行 V 次 Dijkstra算法。

Floyd 算法可以处理负权边。

Floyd 算法号称只有 5行代码,我们来欣赏一下:

A*算法是一种静态路网中求解最短路径最有效的直接搜索方法。

A*算法是启发式算法,采用最佳优先(Best-first)搜索策略,基于估价函数对每个搜索位置的评估结果,猜测最好的位置优先进行搜索。

A*算法极大地减少了低质量的搜索路径,因而搜索效率很高,比传统的路径规划算法实时性更高、灵活性更强;但是,A*算法找到的是相对最优路径,不是绝对的最短路径,适合大规模、实时性高的问题。

NetworkX 提供了丰富的最短路径函数,除了常见的 Dijkstra 算法、Bellman-ford 算法、Floyd Warshall 算法和 A*算法,还有 Goldbery-Radzik 算法和 Johnson 算法。其中,Bellman-ford 算法函数使用的是队列改进算法,即以 SPFA 算法实现。

其中,最基本的求解最短路径函数 shortest() 和 最短路径长度 shortest_path_length() 是 ‘dijkstra’ 算法和 ‘bellman-ford’ 算法的集成接口,可以通过 method='dijkstra' 选择不同的算法。

shortest_path(G, source=None, target=None, weight=None, method='dijkstra') shortest_path_length(G, source=None, target=None, weight=None, method='dijkstra')

主要参数:

NetworkX 中关于 Dijkstra 算法提供了 13 个函数,很多函数的功能是重复的。这里只介绍最基本的函数 dijkstra_path() 和 dijkstra_path_length()。

dijkstra_path() 用于计算从源到目标的最短加权路径,dijkstra_path_length() 用于计算从源到目标的最短加权路径长度。

dijkstra_path(G, source, target, weight='weight') dijkstra_path_length(G, source, target, weight='weight')

主要参数:

NetworkX 中关于 Bellman-Ford 算法提供了多个函数,这里只介绍最基本的函数 bellman_ford_path() 和 bellman_ford_path_length()。

bellman_ford_path() 用于计算从源到目标的最短加权路径,bellman_ford_path_length() 用于计算从源到目标的最短加权路径长度。

bellman_ford_path(G, source, target, weight='weight') bellman_ford_path_length(G, source, target, weight='weight')

主要参数:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
情侣文案英文高级浪漫87句 Love to the people don't wave.什么意思 gladtomeetyou怎么 gladtomeetyou.怎么回答 2016生肖猴运程 武汉买房88平方满50万落户政策 非武汉市户口在武汉市购买70平方总价50万的商品房,可以转户口吗... 我想在武汉买一套50万左右的新房子,谁能告诉我现在武昌,关山,江夏,有... 支付宝怎么开通步数授权? 总价50万能在武汉买一套两室一天的二手房吗? 排尿无力是怎么回事 女孩子在男人面前哭 趣学Python算法100例——1.4 百钱百鸡 出现尿无力怎么回事 手机上免费看电影的软件哪个好? 怎样能快速哭出来, 因为学校有高一新生,我们高二的要出节目在开学典礼上... 电视十大免费影视软件排行榜 甲钴胺片饭前吃还是饭后吃 微信怎样申请离婚登记 罗襟不胜五更寒,梦里不知身是客。 网上申请离婚程序 反恐精英cs1.6正版游戏介绍 罗襟印粉的解释罗襟印粉的解释是什么 祝你生日快乐用英文怎么讲 cs1.6怎么加人机器人-加人机方法 滴罗襟点点的意思是什么 反恐精英cs1.6配置要求 泪如双泉水,行堕紫罗襟。 没打预防针的狗狗可以洗澡吗 苏州叫出租车得电话是多 python回型算法求解 图论之最短路径算法及Python实现 尿无力是什么引起的 ...Dijkstra算法实现和整数规划实现(Python+gurobi) 排尿无力怎么办 求固发、防脱发的产品,哪款好? 清晨看日出的朋友圈感受句子 脱发使用哪些产品效果好?求推荐 义务兵思想汇报 今天应届毕业生去部队能考军校吗 破损的经书可以放弃在庙里吗 2024年,大事记-灾难 PPT |【课件】2024年13起典型火灾案例及消防安全知识专题培训 你好用的标点符号是? 湖景水蜜桃什么时候上市 2024年将有大灾难? - 知乎 2024年阳山水蜜桃(7月下旬晚湖景) 一次疏忽,39条人命!江西新余这场大火,给所有人敲响警钟 2024年春节湖南可以放烟花爆竹吗 湖南燃放烟花爆竹规定是怎么样的_百... 白凤桃和甜桃有什么区别?