基于MATLAB的Dijkstra与Floyd算法最短路径求解系统
项目介绍
本项目是一个专门用于求解图论中复杂网络最短路径问题的MATLAB仿真平台。系统完整集成了两种经典的图论搜索算法:Dijkstra算法与Floyd-Warshall算法。通过该平台,用户可以输入自定义的加权邻接矩阵,系统将自动计算并显示特定节点间的最短距离、完整的路径节点序列,并通过图形化界面直观地展示网络拓扑结构及最优路径的分布情况。该系统具备处理有向图、无向图以及不连通图的能力,适用于交通规划、物流运输及通信路由优化等科研与应用场景。
功能特性
- 双算法集成求解:同时提供单源最短路径算法(Dijkstra)和全图所有对最短路径算法(Floyd-Warshall),支持结果的对比与验证。
- 复杂网络建模:支持通过邻接矩阵灵活定义图结构,包括边权重的设置、无限大权重(表示不连通)的逻辑处理。
- 自动化路径回溯:系统能够根据算法运行过程中存储的前驱节点或后继节点矩阵,自动逆向或正向推导并输出完整的路径节点序列。
- 可视化交互演示:利用MATLAB的图形对象功能,动态生成网络拓扑图,并以醒目的颜色(如红色加粗)突出显示计算出的最短路径。
- 鲁棒性判断:具备识别不可达节点的功能,当起始点与目标点之间不存在连接路径时,系统会给出明确的中文提示。
实现逻辑说明
项目代码严格遵循以下逻辑流程:
- 数据初始化:
首先清理工作区环境,定义一个 6x6 的加权邻接矩阵来模拟 6 个节点的网络。使用 MATLAB 的
inf 表示节点间无直接连接。设定计算的起点和终点。
- Dijkstra 算法逻辑实现:
*
贪心搜索:初始化起始点到所有节点的距离为无穷大,起点自身距离为0。
*
节点松弛:在每一轮迭代中,从未访问的节点集中选取距离起点最近的节点作为当前中心。
*
距离更新:遍历该中心的邻接节点,如果通过当前中心到达邻接节点的距离更短,则更新该邻接节点的距离值,并记录当前中心为其前驱节点。
*
路径回溯:从目标节点开始,根据记录的前驱节点数组逆向寻找,直到回到起点,形成完整的路径数组。
- Floyd-Warshall 算法逻辑实现:
*
动态规划:将初始邻接矩阵作为距离矩阵,并初始化一个路径矩阵用于存储节点的跳转关系。
*
三层迭代:外层循环遍历所有可能的中转点 k,内层两层循环遍历所有起点 i 和终点 j。如果路径 i -> k -> j 的权重之和小于 i -> j 的当前权重,则更新距离和路径矩阵。
*
全图覆盖:该算法执行完毕后,会获得图中任意两点之间的最短距离矩阵。
- 路径提取与展示:
* 对于 Floyd 算法,系统专门设计了路径重建逻辑,根据路径矩阵中的后继节点记录,正向递归提取出指定两点间的完整路径序列。
* 在控制台按格式化输出最短路径长度、路径节点序列以及全图的距离矩阵。
- 可视化渲染:
系统将邻接矩阵转换为 MATLAB 的
graph 图论对象,使用
force 布局提取节点坐标。通过绘图函数生成白色背景的图像,并在图像中用红色高亮显示最短路径经过的边和节点。
关键函数与算法细节分析
- 单源路径搜索函数:实现了 Dijkstra 算法的核心。它不仅仅计算距离,还通过
parent 数组维护了整颗最短路径树。其内部带有提前终止优化逻辑,即一旦确认了目标节点的最短路径,即可跳出循环以提高效率。 - 全图路径迭代函数:实现了 Floyd 算法。其特征是空间复杂度为 $O(n^2)$,时间复杂度为 $O(n^3)$。该函数通过更新
P(i, j) = P(i, k) 的方式保留了路径的连续性。 - 路径重构工具:专门针对 Floyd 算法生成的后继矩阵进行处理。它通过
while 循环不断查找中间跳转节点,直到终点,解决了 Floyd 算法无法直接输出节点序列的问题。 - 图形化绘图工具:封装了 MATLAB 的
plot 与 highlight 命令。它支持自动标注边权重(EdgeLabel),并能根据计算结果动态调整节点和边的样式(颜色、线宽、点大小)。
使用方法
- 参数配置:打开
main.m 文件,根据实际需求修改 adjMatrix 矩阵中的权重值,或修改 startNode 与 endNode 变量。 - 运行程序:在 MATLAB 编辑器中点击“运行”或在命令行窗口输入文件名并回车。
- 结果查看:
*
命令行窗口:查看 Dijkstra 和 Floyd 算法得出的路径长度、路径序列以及全图距离矩阵。
*
弹出界面:观察生成的“最短路径可视化”窗口,红色标注的线路即为计算出的最优路径。
系统要求
- 软件版本:MATLAB R2015b 及以上版本(需支持
graph 和 plot 函数)。 - 工具箱:无需特殊工具箱,使用基础版 MATLAB 即可运行。