借鉴了其他一些博客的案例和代码,加了自己的理解,记录一下学习这个算法的笔记
案例
首先用这个图自己手动算了一下,对算法的理解很有帮助,建议先不要看下图,自己根据图中的思路手算,再对应图示答案。
了解了原理之后,再学习如何转换成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