Dijkstra算法学习笔记

借鉴了其他一些博客的案例和代码,加了自己的理解,记录一下学习这个算法的笔记

案例
案例图片
首先用这个图自己手动算了一下,对算法的理解很有帮助,建议先不要看下图,自己根据图中的思路手算,再对应图示答案。
在这里插入图片描述
了解了原理之后,再学习如何转换成Matlab语句计算
以下是加了我自己理解的一些注释,也修改了一些小地方的语句
有的地方迭代不太好理解,用了比较笨的方法,因为迭代次数不多,就也手算了一遍,完全理解后才可以不用看别人的代码,自己写出来。

function [ distance path] = Dijk( W,st,e )
%DIJK Summary of this function goes here
% W:权值矩阵   
% st:搜索的起点   
% e:搜索的终点
n=length(W);             %节点数
D = W(st,:);
visit= ones(1,n); 
visit(st)=0;
parent = zeros(1,n);     %记录每个节点的上一个节点
path =[];

for i = 1:n-1
    temp = [];
    %从起点出发,找最短距离的下一个点,每次不会重复原来的轨迹,设置visit判断节点是否访问
    for j=1:n
       if visit(j)                % 1为 True, 0为False
           temp =[temp D(j)];
       else
           temp =[temp inf];
       end
    end
    [value,index] = min(temp);    % 已经选过的点在上面的循环中,已赋值为了inf,不会再被选中为index
    visit(index) = 0;              % 使该次选为index的点,下一次不会再被选中
    
    %更新 如果经过index节点,从起点到每个节点的路径长度更小,则更新,记录前趋节点,方便后面回溯循迹
    for k=1:n
        if D(k)>D(index)+W(index,k)
           D(k) = D(index)+W(index,k);      % D矩阵在变化
           parent(k) = index;
        end
    end

distance = D(e); %最短距离
formatSpec = '第 %d 次迭代选入的节点为%d\n';
fprintf(formatSpec,i,index)
end
 
%回溯法  从尾部往前寻找搜索路径
t = e;
while t~=st && t>0
    path =[t,path];
    p=parent(t);
    t=p;
end
path =[st,path];%最短路径

end

使用上面的函数,得到任意起始点到目标点的最短距离和路径

%输入权值矩阵,起点,终点得到最短路径
clear
clc
tic
W=[0 6 3 inf inf inf
    6 0 2 5 inf inf
    3 2 0 3 4 inf 
    inf 5 3 0 2 3
    inf inf 4 2 0 5
    inf inf inf 3 5 0];

%[ distance path] = Dijk( W,st,e )
[distance,path]=Dijk(W,1,6)
toc

下一步待学:
(1)如果权值矩阵很大,手动输入很麻烦要如何自动生成。
(2)Floyd算法
(3)A*算法
(4)三种算法的比较

参考的博客链接:
案例的图片博客链接没找到了…找到后补上
参考的代码博客如下
https://blog.csdn.net/zjq2010014137/article/details/38370331

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值