Dijkstra算法是最基本的路径搜索算法,适用于距离信息为正的图搜索。
demo on matlab
%距离信息
dis_matrix=[ 0, 4, inf, inf, inf, inf, inf, 8, inf;
4, 0, 8, inf, inf, inf, inf, 11, inf;
inf, 8, 0, 7, inf, 4, inf, inf, 2;
inf,inf, 7, 0, 9, 14, inf, inf, inf;
inf,inf, inf, 9, 0, 10, inf, inf, inf;
inf,inf, 4, 14, 10, 0, 2, inf, inf;
inf,inf, inf,inf,inf, 2, 0, 1, 6;
8, 11, inf,inf,inf, inf, 1, 0, 7;
inf,inf, 2, inf,inf, inf, 6, 7, 0;
];
starting_index=1;%出发点
ending_index=5;%终点
closed_set=false(1,length(dis_matrix));% close表 标记 已经找到达到该节点的最优路径 的点
%初始化
dis_start2other=inf(1,length(dis_matrix));%初始化出发点到所有点的距离为无穷
dis_start2other(starting_index)=0; %初始化开始节点到所有节点的距离,到自身是0
opt_forward_node=zeros(1,length(dis_matrix));%初始化到达某个节点的最优路径上的前面节点
while sum(closed_set)<length(dis_matrix)%终止条件是访问的节点数等于总数
%寻找到出发点最近的点(不包括close中的)
mini_dis=inf;%每次遍历的初始值,一定会被更改。
mini_index=1;%每次遍历的初始值,一定会被更改。
for i=1:length(dis_matrix)
%遍历距离list,得到总距离最近的点和索引,初始一定是出发点
if closed_set(i)== false && dis_start2other(i)<mini_dis
mini_dis=dis_start2other(i);
mini_index=i;
end
end
%标记,表示已经找到最优路径,加入close。每次遍历一定有一个最小的。
closed_set(mini_index)=true;
%考察 刚加入节点的子节点,经过上述节点到达子节点的总距离,和已有的距离比较:
%更新 除了 close中的所有节点到出发点的最短路径
for i=1:length(dis_matrix) %其实只是遍历子节点 (不能到达的都表示成距离inf了,自身已经加入close了)
%如果未访问的节点中,可达节点(相邻),经过上面已经找到最优路径的节点,到达起点的距离更小,则更新这些相邻节点的距离
if closed_set(i)== false &&dis_matrix(i,mini_index)+dis_start2other(mini_index)< dis_start2other(i)
%更新最小距离
dis_start2other(i)=dis_matrix(i,mini_index)+dis_start2other(mini_index);
%更新 前向节点信息
opt_forward_node(i)=mini_index;
end
end
end
%最短路径长度
dis_start2other;
%输出路径点
node = ending_index;
while node~=starting_index
disp(node);
node=opt_forward_node(node);
end
disp(node);
说明
整个算法主要进行两项工作:
1、遍历节点,标记距离出发点最近的节点,下一次不再参与对比(每次必有新节点)
2、对于刚刚选定的节点,提供了新路径,考察经过此节点到达其他节点的距离会不会比已有的距离更短,有则更新和记录
为什么说“要收录的节点已经找到了最优路径”
如果1——4最短,要收录4节点,这时却有1——2——4路径更短于1——4,则可以推出1——2比1——4更短,应该收录的是2节点,矛盾。
加入close表的顺序实际是,各个节点距离出发点由远及近的顺序