MATLAB图论合集(三)Dijkstra算法计算最短路径

本贴介绍最短路径的计算,实现方式为迪杰斯特拉算法;对于弗洛伊德算法,区别在于计算了所有结点之间的最短路径,考虑到MATLAB计算的便捷性,计算时只需要反复使用迪杰斯特拉即可,暂不介绍弗洛伊德的实现


迪杰斯特拉算法的思想,通俗的归纳来说就是:从当前结点出发,寻找一个未与当前简历连接------且路径最小的点作为下一个寻找到的地址。有关结点是否建立连接,需要一个如下的矩阵来辅助记录。

若还未建立连接,则将前驱标记为-1,距离记录为无穷~

至于Distance内,存放的是起点到当前结点的最短距离,这一距离可能会不断更新,直到寻找到最短的路径为止~

实现的具体底代码:

  • 第一种:
Matlab 复制代码
[P,d] = shortestpath(G, 9, 4)

如上代码中,P表示的9与4节点之间最短路径经过的结点,而d保存的是最短路径值的总和~

  • 第二种:
Matlab 复制代码
D = distances(G);
D(1,2);
D(9,4);

如上代码中,D是一个存储了任意两结点之间最短路径的矩阵,通过索引访问的方式,即可求出任意两点的最短路径~

此外,如下是计算求出指定节点指定距离内部的全部结点的实现方式:

Matlab 复制代码
[nodeIDs,dist] = nearest(G, 2, 10); 

注意,上述几个函数从2017a版本后才能全部使用

如下是创建图并计算图的具体实现方式:

Matlab 复制代码
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
Matlab 复制代码
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 

set( gca, 'XTick', [], 'YTick', [] );

[P,d] = shortestpath(G, 9, 4);

myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2); 
highlight(myplot, P, 'EdgeColor', 'g') ; 

结果如下,绿色即为最短路径:

相关推荐
Liangwei Lin3 分钟前
洛谷 P10471 最大异或对 The XOR Largest Pair
算法
sin_hielo4 分钟前
leetcode 3652(定长滑动窗口/前缀和)
数据结构·算法·leetcode
AI科技星4 分钟前
质量定义方程中条数概念的解析与经典例子计算
数据结构·人工智能·经验分享·算法·计算机视觉
啊阿狸不会拉杆5 分钟前
《数字图像处理》第8章-图像压缩和水印
图像处理·人工智能·算法·计算机视觉·数字图像处理
智航GIS6 分钟前
ArcGIS大师之路500技---034重采样算法选择
人工智能·算法·arcgis
子夜江寒6 分钟前
决策树与回归树简介:原理、实现与应用
算法·决策树·回归
TL滕9 分钟前
从0开始学算法——第十九天(并查集)
笔记·学习·算法
Swift社区12 分钟前
LeetCode 451 - 根据字符出现频率排序
算法·leetcode·ssh
JoannaJuanCV12 分钟前
自动驾驶—CARLA仿真(17)invertedai_traffic demo
人工智能·算法·自动驾驶·carla
浔川python社15 分钟前
C++小程序编写系列(2)
c++·算法·图论