基于A*算法、Dijkstra算法的路径规划研究(Matlab代码实现)

  💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

一、引言

二、算法原理

1. Dijkstra算法

2. A*算法

三、算法比较

四、应用实例

五、结论与展望

📚2 运行结果

2.1 A*算法

2.2 Dijkstra算法

🎉3 参考文献

🌈4 Matlab代码实现


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

一、引言

路径规划问题是人工智能领域的一个重要研究方向,尤其在机器人导航、自动驾驶、地图导航等领域具有广泛的应用。A*算法和Dijkstra算法作为两种经典的路径规划算法,各自具有独特的优势和适用范围。本文将对这两种算法进行深入研究,探讨其原理、特点、实现方式及在路径规划中的应用。

二、算法原理

1. Dijkstra算法

原理概述
Dijkstra算法是一种用于在图中找到单一起点到其他所有点的最短路径的算法。它主要基于贪心策略,通过逐步扩展已知最短路径的节点集合,直到找到所有节点的最短路径。

实现步骤

  1. 初始化:设置起点s的距离为0,其他所有节点的距离为无穷大。
  2. 选择节点:从未处理的节点中选择距离最小的节点u。
  3. 更新距离:对u的每个邻居节点v,如果通过u到达v的距离比已知的更短,则更新v的距离。
  4. 标记节点u为已处理,并将其从未处理节点集合中移除。
  5. 重复步骤2-4,直到所有节点都被处理。

特点

  • 能够找到全局最短路径。
  • 适用于无权图或所有边权重均为正的带权图。
  • 计算复杂度较高,特别是对于大型图。
2. A*算法

原理概述
A*算法是一种启发式搜索算法,结合了Dijkstra算法的全局最优性和贪心算法的高效性。它通过引入启发式函数来评估节点到目标点的估计成本,从而选择最有希望的节点进行扩展。

实现步骤

  1. 初始化:创建两个列表,OPEN列表用于存储待考察的节点,CLOSED列表用于存储已考察的节点。
  2. 将起点加入OPEN列表,并计算其F值(G值+H值,G值为从起点到当前节点的实际成本,H值为启发式函数估计的从当前节点到目标点的成本)。
  3. 从OPEN列表中选择F值最小的节点u。
  4. 如果u是目标节点,则路径规划成功,回溯路径。
  5. 否则,将u加入CLOSED列表,并考察u的所有邻居节点v。
  6. 如果v不在CLOSED列表中,则计算v的G值、H值和F值,并更新OPEN列表(如果v已在OPEN列表中且新的F值更小)。
  7. 重复步骤3-6,直到找到目标节点或OPEN列表为空。

特点

  • 搜索效率高,能够快速找到最短路径。
  • 启发式函数的设计对算法性能有重要影响。
  • 适用于存在障碍物的复杂环境。

三、算法比较

Dijkstra算法A*算法
原理基于贪心策略,逐步扩展已知最短路径结合贪心算法和启发式搜索,利用启发式函数评估节点
适用范围无权图或所有边权重均为正的带权图存在障碍物的复杂环境
特点全局最优性,但计算复杂度较高搜索效率高,启发式函数设计影响性能
优势能找到全局最短路径快速找到最短路径,适应复杂环境
劣势计算量大,不适合大型图启发式函数设计复杂,可能影响结果

四、应用实例

在实际应用中,Dijkstra算法和A算法均被广泛应用于路径规划领域。例如,在机器人导航中,可以根据环境信息选择合适的算法进行路径规划。如果环境信息完全已知且规模较小,可以选择Dijkstra算法;如果环境复杂且存在障碍物,可以选择A算法以提高搜索效率。

五、结论与展望

A*算法和Dijkstra算法作为路径规划领域的经典算法,各有其独特的优势和适用范围。在实际应用中,应根据具体场景和需求选择合适的算法。未来,随着人工智能技术的不断发展,路径规划算法也将不断优化和创新,以更好地适应复杂多变的环境。

以上是基于A*算法和Dijkstra算法的路径规划研究文档的概要内容,具体细节可根据需要进一步展开和深入。

📚2 运行结果

2.1 A*算法

2.2 Dijkstra算法

部分代码:

cmap = [1 1 1; ...%  1 - white - 空地
        0 0 0; ...% 2 - black - 障碍 
        1 0 0; ...% 3 - red - 已搜索过的地方
        0 0 1; ...% 4 - blue - 下次搜索备选中心 
        0 1 0; ...% 5 - green - 起始点
        1 1 0;...% 6 - yellow -  到目标点的路径 
       1 0 1];% 7 - -  目标点 
colormap(cmap); 
map1 = zeros(10); 
wallpercent=0.4;
% % 设置障障碍 
map1(1:5, 7) = 2;
map1(8,1:3) = 2; 
map1(2:5,3:5)=2;
%map1(ceil(10^2.*rand(floor(10*10*wallpercent),1))) =2;
%  map(ceil(10.*rand),ceil(10.*rand)) = 5; % 起始点
%map(ceil(10.*rand),ceil(10.*rand)) = 6; % 目标点
% %% 建立地图
nrows = 10; 
ncols = 10;  
start_node = sub2ind(size(map1), 10,1); 
dest_node = sub2ind(size(map1),1,4); 
map1(dest_node) = 7;
% % 距离数组初始化
distanceFromStart = Inf(nrows,ncols);  
distanceFromStart(start_node) = 0; 
distanceFromgoal = Inf(nrows,ncols);  
distanceFromgoal(dest_node) = 0; 
% % 对于每个格单元,这个数组保存其父节点的索引。 
parent = zeros(nrows,ncols); 
% % 主循环
writerObj = VideoWriter('Dijkstra.avi');
open(writerObj);
tic
 while true 
  % 画出现状图
  map1(start_node) = 5;
  map1(dest_node) = 7;
  image(1.5, 1.5, map1); 
  grid on; 
  axis image; 
  drawnow; 
   % 找到距离起始点最近的节点
  [min_dist, current] = min(distanceFromStart(:)); %返回当前距离数组(距离起点)的最小值和最小值的位置索引。
  %[min_dist1, current1] = min(distanceFromgoal(:)); %返回当前距离数组(距离目标点)的最小值和最小值的位置索引。
   if ((current == dest_node) || isinf(min_dist)) %搜索到目标点或者全部搜索完,结束循环。
         break; 
   end; 
% if((current==current1)|| isinf(min_dist)|| isinf(min_dist1))
%       break;
% end      
 map1(current) = 3; %将当前颜色标为红色。
 %map1(current1)=3;
distanceFromStart(current) = Inf;  %当前区域在距离数组中设置为无穷,表示已搜索。
%distanceFromgoal(current1) = Inf;  %当前区域在距离数组中设置为无穷,表示已搜索。
 [i, j] = ind2sub(size(distanceFromStart), current); %返回当前位置的坐标
 %[i1, j1] = ind2sub(size(distanceFromgoal), current1); %返回当前位置的坐标
 neighbor = [ 
            i-1,j;... 
            i+1,j;... 
            i,j+1;... 
             i,j-1]; %确定当前位置的上下左右区域。
% neighbor2 = [ 
%             i1-1,j1;... 
%             i1+1,j1;... 
%             i1,j1+1;... 
%              i1,j1-1]; %确定当前位置的上下左右区域。        
      neighbor1 = [ 
              i-1,j-1;...
              i+1,j+1;...
              i-1,j+1;...
              i+1,j-1]; %确定当前位置的对角区域。      
 outRangetest = (neighbor(:,1)<1) + (neighbor(:,1)>nrows) +...
                    (neighbor(:,2)<1) + (neighbor(:,2)>ncols ); %判断下一次搜索的区域是否超出限制。   
  outRangetest1 = (neighbor1(:,1)<1) + (neighbor1(:,1)>nrows) +...
                     (neighbor1(:,2)<1) + (neighbor1(:,2)>ncols ); %判断下一次搜索的区域是否超出限制。        
% outRangetest2 = (neighbor2(:,1)<1) + (neighbor2(:,1)>nrows) +...
%                    (neighbor2(:,2)<1) + (neighbor2(:,2)>ncols ); %判断下一次搜索的区域是否超出限制。
 locate = find(outRangetest>0); %返回超限点的行数。
   locate1 = find(outRangetest1>0); %返回超限点的行数。
 %locate2 = find(outRangetest2>0); %返回超限点的行数。
 neighbor(locate,:)=[]; %在下一次搜索区域里去掉超限点,删除某一行。
 neighborIndex = sub2ind(size(map1),neighbor(:,1),neighbor(:,2)); %返回下次搜索区域的索引号。
   neighbor1(locate1,:)=[]; %在下一次搜索区域里去掉超限点,删除某一行。
    neighborIndex1 = sub2ind(size(map1),neighbor1(:,1),neighbor1(:,2)); %返回下次搜索区域的索引号。
%     neighbor2(locate2,:)=[]; %在下一次搜索区域里去掉超限点,删除某一行。
%     neighborIndex2 = sub2ind(size(map1),neighbor2(:,1),neighbor2(:,2)); %返回下次搜索区域的索引号。

 for i=1:length(neighborIndex) 
 if (map1(neighborIndex(i))~=2) && (map1(neighborIndex(i))~=3 && map1(neighborIndex(i))~= 5) 
     map1(neighborIndex(i)) = 4; %如果下次搜索的点不是障碍,不是起点,没有搜索过就标为蓝色。
     if((neighborIndex(i)+1==current)||(neighborIndex(i)-1==current))
        if distanceFromStart(neighborIndex(i))> min_dist + 2  
          distanceFromStart(neighborIndex(i)) = min_dist+2; 
             parent(neighborIndex(i)) = current; %如果在距离数组里。       
        end 
     else
         if distanceFromStart(neighborIndex(i))> min_dist + 1  
          distanceFromStart(neighborIndex(i)) = min_dist+1; 
             parent(neighborIndex(i)) = current; %如果在距离数组里。 
         end
     end
  end 
 end 
%  for i=1:length(neighborIndex2) 
%  if (map1(neighborIndex2(i))~=2) && (map1(neighborIndex2(i))~=3 && map1(neighborIndex2(i))~= 5) 
%      map1(neighborIndex2(i)) = 4; %如果下次搜索的点不是障碍,不是起点,没有搜索过就标为蓝色。
%    if distanceFromgoal(neighborIndex2(i))> min_dist1 + 1  
%        distanceFromgoal(neighborIndex2(i)) = min_dist1+1; 
%          parent(neighborIndex2(i)) = current1; %如果在距离数组里,。       
%    end 
%   end 
%  end 
%pause(1);
 end
%  if(map1(neighborIndex)~= 2)
%  %if(map1(neighborIndex1)~= 2 )
%   for i=1:length(neighborIndex1) 
%    if (map1(neighborIndex1(i))~=2) && (map1(neighborIndex1(i))~=3 && map1(neighborIndex1(i))~= 5 )
%      map1(neighborIndex1(i)) = 4; %如果下次搜索的点不是障碍,不是起点,没有搜索过就标为蓝色。
%     if distanceFromStart(neighborIndex1(i))> min_dist + sqrt(2) 
%        distanceFromStart(neighborIndex1(i)) = min_dist+ sqrt(2); 
%          parent(neighborIndex1(i)) = current; %如果在距离数组里,。
%     end
%    end
%   end
%  end
%  end
   frame = getframe;
    writeVideo(writerObj,frame);
 %
if (isinf(distanceFromStart(dest_node))) 
    route = [];
else
    %提取路线坐标
  route =dest_node ;
  while (parent(route(1)) ~= 0) 
         route = [parent(route(1)), route];     
   end 
%  动态显示出路线 
        for k = 2:length(route) - 1 
 

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]顾新艳,金世俊.基于A*算法的移动机器人路径规划[J].科技信息:科学教研, 2007(34):38-39+81.DOI:10.3969/j.issn.1001-9960.2007.34.021.

[2]刘云翔,杜杰,张晴.基于路径优化的A*算法与Dijkstra算法的性能比较[J].现代电子技术, 2017, 40(13):4.DOI:10.16652/j.issn.1004-373x.2017.13.048.

🌈4 Matlab代码实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验使用Matlab编程实现了基于A*算法Dijkstra算法路径规划。两种算法都是单源最短路算法,其中Dijkstra算法能够处理带权重的图或网络,而A*算法则可在许多实际应用中更快地找到最短路线。 在本实验中,我们构建了一个9×9网格地图,其中包含3个起点和3个终点,并随机设置了不同长度的障碍物。通过A*算法Dijkstra算法遍历地图来查找从每个起点到每个终点的最短路径。 我们首先实现Dijkstra算法,它首先将起点的距离初始化为0,所有其他点的距离初始化为无限大。然后,通过遍历所有尚未确定最短路径的节点,计算从起点到该节点的距离,并更新相邻节点的最短距离。重复这个过程,直到所有节点都被遍历过。 接下来,我们实现了A*算法,它是一种启发式搜索算法。除了计算起点到每个节点的距离外,它还根据每个节点到终点的估计距离来决定下一个遍历节点。这个估计距离可以使用欧几里得距离或曼哈顿距离等方法来计算。通过使用这种启发式方法,A*算法可以减少搜索空间,从而更快地找到最短路径。 最后,我们通过比较两种算法的搜索效率和路径质量来评估它们的表现。实验结果表明,在小规模的网格地图中,两种算法的搜索效率和路径质量没有显著差异。然而,在大型网格地图中,A*算法的搜索效率要高于Dijkstra算法。 总之,本实验演示了A*算法Dijkstra算法路径规划原理,并为了更好地了解它们的表现而在Matlab中进行了比较。这将有助于选择最适合特定应用的算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值