jeremy的路径规划学习:Dijkstra算法

规划算法和控制算法入门思维导图

声明:图片及内容基于:https://www.bilibili.com/video/BV19T4y1M7uR
在这里插入图片描述
设G=(V,E)是一个带权有向图,把图中节点集合V分成两组,第一组为已求出最短路径的节点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将该节点加入到集合S中,直到全部节点都加入到S中,算法就结束了);第二组为其余未确定最短路径的节点集合(用U表示),按最短路径长度的递增次序依次把第二组的节点加入S中。在加入的过程中,总保持从源点v到S中各节点的最短路径长度不大于从源点v到U中任何节点的最短路径长度。 此外,每个节点对应一个距离,S中的节点的距离就是从v到此节点的最短路径长度,U中的节点的距离,是从v到此节点只包括S中的节点为中间节点的当前最短路径长度。

算法思想

在这里插入图片描述
以这个图举例:
初始时,S只包含起点s;U包含除s外的其他节点,且U中节点的距离为"起点s到该节点的距离"[例如,U中节点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
从U中选出"距离最短的节点k",并将节点k加入到S中;同时,从U中 移除节点k。
更新U中各个节点到起点s的距离。之所以更新U中节点的距离,是由于上一步中确定了k是求出最短路径的节点,从而可以利用k来更新其它节点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。  重复步骤(2)和(3),直到遍历完所
有节点。
在这里插入图片描述
在这里插入图片描述

加入个人理解与代码

D算法是广度优先算法,要把所有都遍历,相等于能找都每一个点作为重点的最短距离

%% 图定义
% 根据节点的邻近节点表及字母节点-数字节点对应表,构造节点元胞数组
%{节点,[周边临节点],[到临节点距离]}
nodes_dist = cell(0);
nodes_dist(1,:) = {1, [2, 6, 7], [12, 16, 14]};
nodes_dist(2,:) = {2, [1, 3, 6], [12, 10, 7]};
nodes_dist(3,:) = {3, [2, 4, 5, 6], [10, 3, 5, 6]};
nodes_dist(4,:) = {4, [3, 5], [3, 4]};
nodes_dist(5,:) = {5, [3, 4, 6, 7], [5, 4, 2, 8]};
nodes_dist(6,:) = {6, [1, 2, 3, 5, 7], [16, 7, 6, 2, 9]};
nodes_dist(7,:) = {7, [1, 5, 6], [14, 8, 9]};

%% 算法初始化
% S/U的第一列表示节点编号
% 对于S,第二列表示从源节点到本节点已求得的最小距离,不再变更;
% 对于U,第二列表示从源节点到本节点暂时求得的最小距离,可能会变更
S = [4, 0];
U(:,1) = [1, 2, 3, 5, 6, 7];
U(:,2) = [inf, inf, 3, 4, inf, inf];

% 最优路径(完全确定)及暂时最优路径的初始化
%用cell可以储存不同长度的数据
path_opt = cell(7,2);
% 下面:[节点,父节点]
path_opt(4,:) = {4, 4};
%path_temp(节点,:)={该节点,[父节点,权重]}
path_temp = cell(7,2);
path_temp(3,:) = {3, [4, 3]};
path_temp(4,:) = {4, 4};
path_temp(5,:) = {5, [4, 5]};

%% 循环遍历所有节点
% ~代表非(我觉得应该是U中没有目标点就行)
while ~isempty(U)
    
    % 在U集合找出当前最小距离值及对应节点,并移除该节点至S集合中
    %min可以找出最小值和索引值
    [dist_min, idx] = min(U(:,2));
    node_min = U(idx, 1);
    %下一步就是把最小的从U放入S,U中删除该节点
    S(end+1,:) = [node_min, dist_min];
    U(idx,:) = [];
    
    % 将最小距离值的节点添加到最优路径集合
    path_opt(node_min,:) = path_temp(node_min,:);
    
    %% 依次遍历最小距离节点的邻节点,判断是否在U集合中更新邻节点的距离值
    for i = 1:length(nodes_dist{node_min, 2})
        
        % 需要判断的节点
        node_temp = nodes_dist{node_min, 2}(i);
        
        % 找出U集合中节点node_temp的索引值
        idx_temp = find(node_temp == U(:,1));
        
        % 判断是否更新
        if ~isempty(idx_temp)
            if dist_min + nodes_dist{node_min, 3}(i) < U(idx_temp, 2)
                U(idx_temp, 2) = dist_min + nodes_dist{node_min, 3}(i);
                
                % 更新暂时最优路径
                path_temp{node_temp, 1} = node_temp;
                path_temp{node_temp, 2} = [path_opt{node_min, 2}, node_temp];                
            end
        end
    end
end
        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值