两点之间最短路径算法(Single-Dijkstra-shortest path)

摘要

本文主要讲述最短路径算法,一个主要原因是网上的“基于Matlab实现的两点之间最短路径算法”存在各种实现错误,目前为止还没有找到一个完全正确的。所以,本人改正相关错误,上传个正确的版本,即:采用Matlab实现的两点之间Dijkstra(single path)算法。


1. Matlab源文件(dijkstra.m)

function [distance,path]=dijkstra(A,s,e)
%% 参数说明
%  邻接矩阵A
%  起点:s
%  终点:e
%  路径长: distance
%  路径:path

%% 算法主体
n=size(A,1);        
D=A(s,:);           
path=[];            
visit=ones(1,n);    
visit(s)=0;        
parent=zeros(1,n);  
for i=1:n-1         
    temp=zeros(1,n);
    count=0;
    for j=1:n
        if visit(j)
            temp=[temp(1:count) D(j)];
        else
            temp=[temp(1:count) inf];
        end
        count=count+1;
    end
    [value,index]=min(temp);
    j=index; visit(j)=0;
    for k=1:n
        if D(k)>D(j)+A(j,k)
            D(k)=D(j)+A(j,k);
            parent(k)=j;
        end
    end
end

%% 结果输出(回溯法)
t = e;  %最短路径  
while t~=s && t>0  
    path =[t,path];  
    p=parent(t);t=p;  
end  
path =[s,path];

if length(path)==1 % 最短路径长度
    distance = A(s,e);
else
    distance=D(e);
end

end  

2. 测试

>> metrix=[
Inf     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     1
     1   Inf     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     1
   Inf     1   Inf     1   Inf   Inf   Inf   Inf   Inf     1   Inf   Inf
   Inf   Inf     1   Inf     1   Inf   Inf     1   Inf   Inf   Inf   Inf
   Inf   Inf   Inf     1   Inf     1   Inf   Inf   Inf   Inf   Inf   Inf
   Inf   Inf   Inf   Inf     1   Inf     1   Inf   Inf   Inf   Inf   Inf
   Inf   Inf   Inf   Inf   Inf     1   Inf     1   Inf   Inf   Inf   Inf
   Inf   Inf   Inf     1   Inf   Inf     1   Inf     1     1   Inf   Inf
   Inf   Inf   Inf   Inf   Inf   Inf   Inf     1   Inf   Inf   Inf   Inf
   Inf   Inf     1   Inf   Inf   Inf   Inf     1   Inf   Inf     1   Inf
   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     1   Inf     1
     1     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     1   Inf]
>> [distance, route]=dijkstra(metrix,1,1)
distance =
   Inf
route =
     1
>> [distance, route]=dijkstra(metrix,1,2)
distance =
     1
route =
     1     2
>> [distance, route]=dijkstra(metrix,1,7)
distance =
     5
route =
     1     2     3     4     8     7




迪杰斯特拉算法是一种用于求解带权有向图中单源最短路径问题的算法。它采用贪心策略,逐步确定从起点到其他点的最短路径。迪杰斯特拉算法包括以下步骤: 1. 初始化:设定起点为源点,将起点的距离设为0,将其他点的距离设为无穷大。 2. 选择:从尚未访问的节点中选择当前距离最短的节点,并标记为已访问。 3. 松弛:对于被选择的节点,计算经过该节点到达相邻节点的距离,如果计算的距离小于当前已知的最短距离,则更新最短距离。 4. 重复:重复步骤2和步骤3,直到所有节点都被访问过或者没有可选节点为止。 5. 最短路径:根据最短距离和前驱节点信息,可以确定从起点到其他节点的最短路径。 在MATLAB中实现迪杰斯特拉算法可以按照以下步骤: 1. 构建带权有向图:使用图对象或者矩阵表示有向图的节点和边,并为每条边赋予权重。 2. 初始化距离列表和访问状态:创建两个向量分别用于存储起点到各节点的最短距离和节点的访问状态。 3. 进行迭代:使用循环迭代的方式,选择距离最短的节点,并更新其相邻节点的最短距离。 4. 输出最短路径:根据最短距离和前驱节点信息,确定从起点到其他节点的最短路径,并输出。 在MATLAB中,可以利用矩阵和向量的运算特性来简化代码实现迭代过程,提高算法的效率。同时,使用图形化界面可以更直观地展示最短路径网图和路径搜索过程。 总结来说,迪杰斯特拉算法在MATLAB中的实现主要包括图的构建、初始化距离和状态、迭代更新和最短路径输出等步骤。利用MATLAB的矩阵运算特性和图形化界面,可以更加方便高效地实现该算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值