Dijkstra搜索算法

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表的顺序实际是,各个节点距离出发点由远及近的顺序

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值