💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
一、引言
路径规划问题是人工智能领域的一个重要研究方向,尤其在机器人导航、自动驾驶、地图导航等领域具有广泛的应用。A*算法和Dijkstra算法作为两种经典的路径规划算法,各自具有独特的优势和适用范围。本文将对这两种算法进行深入研究,探讨其原理、特点、实现方式及在路径规划中的应用。
二、算法原理
1. Dijkstra算法
原理概述:
Dijkstra算法是一种用于在图中找到单一起点到其他所有点的最短路径的算法。它主要基于贪心策略,通过逐步扩展已知最短路径的节点集合,直到找到所有节点的最短路径。
实现步骤:
- 初始化:设置起点s的距离为0,其他所有节点的距离为无穷大。
- 选择节点:从未处理的节点中选择距离最小的节点u。
- 更新距离:对u的每个邻居节点v,如果通过u到达v的距离比已知的更短,则更新v的距离。
- 标记节点u为已处理,并将其从未处理节点集合中移除。
- 重复步骤2-4,直到所有节点都被处理。
特点:
- 能够找到全局最短路径。
- 适用于无权图或所有边权重均为正的带权图。
- 计算复杂度较高,特别是对于大型图。
2. A*算法
原理概述:
A*算法是一种启发式搜索算法,结合了Dijkstra算法的全局最优性和贪心算法的高效性。它通过引入启发式函数来评估节点到目标点的估计成本,从而选择最有希望的节点进行扩展。
实现步骤:
- 初始化:创建两个列表,OPEN列表用于存储待考察的节点,CLOSED列表用于存储已考察的节点。
- 将起点加入OPEN列表,并计算其F值(G值+H值,G值为从起点到当前节点的实际成本,H值为启发式函数估计的从当前节点到目标点的成本)。
- 从OPEN列表中选择F值最小的节点u。
- 如果u是目标节点,则路径规划成功,回溯路径。
- 否则,将u加入CLOSED列表,并考察u的所有邻居节点v。
- 如果v不在CLOSED列表中,则计算v的G值、H值和F值,并更新OPEN列表(如果v已在OPEN列表中且新的F值更小)。
- 重复步骤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资源获取