【路径规划】基于A星算法实现栅格地图路径规划

一、简介

1.1查找区域(The Search Area)

咱们假定或人要从 A 点移动到 B 点,可是这两点之间被一堵墙离隔。如图 1 ,绿色是 A ,赤色是 B ,中心蓝色是墙。

【途径规划】根据A星算法完成栅格地图途径规划

图 1

你应该留神到了,咱们把要查找的区域差异成了正方形的格子。这是寻路的第一步,简化查找区域,就像咱们这儿做的相同。这个特算法工程师学什么专业殊的办法把咱们的查找区域简化为了 2 维数组。数组的每一项代表一个格子,它的状态便是可走 (wal指针式万用表图片kalbe) 和不可走 (unwalka算法工程师ble) 。经过核算出从 A 到 B需求走过哪些方格,就找到了途径。一旦途径找到了,人物便从一个方格的中心移动到另一个方格的中心,直至抵达意图地。

方格的中心点咱们成为“节点 (nodes) ”。假定你读过其他关于 A*算法的时刻复杂度是指什么 寻路算法工程师学什么专业算法的文章,你会发现人们常常都在评论节教程的意思点。为什么不直接描绘为方格呢?由于咱们有教程之家app下载或许把查找区域划为为其他多变形而不是正方形,例如可所以六边形,矩形,甚至可所以任意多变形。而节点能够放在任意多边形里边,能够放在多变形的中心,也能够放在多边形的边上。咱们运用这个体系,因数组初始化为它最简略。

1.2开始查找(Starting the Search)算法工程师学什么专业

一旦咱们把查找区域简化为一组能够量化的节点后,就像上面做的相同,我数组c言语们下一步要做的便是查找最短途径。在 A* 中,咱们从起点开始,查看其相邻的方格,然后向四周扩展,直至找到方针。

咱们这样开始咱们的教程snapchat下载寻路旅途:

1. 从起点 A 开始,并把它就参加到一个由方格组成的 op指针数学en list( 敞开列表 ) 中。这个 open list 有点像是一个购物单。当然现在 o数组去重pen list 里只需一项,它便是起点 A ,后边算法规划与剖析会渐渐参加更多的项。 Open list 里数组公式的格子是途径或许会是沿途经过的,也有或许不经过。基本上 op教程诀窍2en list 是一个待查看的方格列表。

2. 查看与起点 A 相邻的方格 ( 疏忽其间墙面所占有的方格,河流所占有的方格及其他不合法地形占有的方格 ) ,把其间可走的 (walkable) 或可抵达的 (reachable) 方格也参加到 open数组去重 list 中。把起点 A 设置为这些方格的父亲 (parent node 或 parent square) 。当咱们在追寻途径时,这些父节点的内容教程英文是很重要的。稍后解说。

3. 把 A 从 open lis指针式万用表t 中移除,参加到 close list( 封闭列表 ) 中, close list 中的每个方格都是现在不需求再重视的指针式万用表图片

如下图所示,深绿色的方格为起点,它的外框是亮蓝色,标明该方格被算法工程师学什么专业参加到了 close list 。与它相邻的黑色方格是需求被查看的,他们的外框是亮绿色。每个黑方格都有一个灰色的指针指向他们的父节点,这儿是起点 A 。

【途径规划】根据A星算法完成栅格地图途径规划

图 2 。

下一步,咱们需求从 open list 中选一个与起点 A 相邻的方格,按下面描绘的相同或多或少的重复前面的进程。可是终究挑选哪个方格好呢?具有最小 F 值数组长度的那个。

1.3途径排序(Path Sorting)

核算出指针式万用表组成途径的方格的关键是下面这个等式:

F = G + H

这儿,

G = 从起点 A 移动到指定方格的移动价值,沿着抵达该方格而生成的途径。

H = 从指定的方格移动到完毕 B 的预算本钱。这个一般被称为试探法,有点让人稠浊。为什么这么叫呢,由于这是个猜测。直到咱们找到了途径咱们教程诀窍2才会知道真实的间隔,由于途中有各式各样的东西 ( 比方墙面,水等 ) 。本教程将教你一种核算 H 的办法,你也能够在网上找到其他办法。

咱们的途径是这么教程的意思发生的:重复遍历 open list ,挑选 F 值最小的方格。这个指针万用表的读法进程稍后详细算法的时刻复杂度取决于描绘。咱们仍是先看看怎样去核算上面的等式。

如上所述, G 是从起点A移动到指定方格的移动价值。在本例中,横向和纵向的移动价指针值为 10 ,对角线的移动价值为 14 。之所以运用这些数据,是由于实践的对角移动间隔是 2 的平方根,或许是近似的 1.414 倍的横向或纵向移动价值。运用 10 和 14 便是为了简略起见。份额是对的,咱们教程拼音避免了敞开和小数的核算。这并不是咱们没有这个才能或是不喜欢数学。运用这些数字也能够使核算机更快。稍后你便会发现,假定不运用这些技巧,寻路算法将很慢。

已然咱们是沿着抵达指定方格的途径来核算 G 值,那么核算出该方格的 G 值的办法便是找出其父亲的 G 值算法规划与剖析,然后按父亲是直线方向仍是斜线方向加上 10 或 14 。跟着咱们脱离起点而得到更多的方格,这个方算法的时刻复杂度取决于法会变得愈加明亮。

有许多办法能够预算 H 值。这儿咱们运用 Manhattan 办法,核算从当时方格横向或纵向算法移动抵达方针所经过的方格数,疏忽对角移动,然后把总数乘以 10 。之所以叫做 Manhattan 办法,是由于这很像核算从一个地址到另一个地址所穿过的街区数,而你不能斜向穿过街区。重要的是,核算 H 是,要疏忽途径中的阻止物。这是对剩下间隔的预算值,而指针c言语不是实践值,因而才称为试探法。

把 G 和 H 相加便得到 F 。咱们第一步的效果如下图所示。每个方格都标上了 F , G , H 的值,就像起点右边的方格那样,左上算法导论角是 F ,左下角是 G ,右下角是 H 。

【途径规划】根据A星算法完成栅格地图途径规划数组指针

图 3

好,现在让咱们看看其间的一些方格。在标有字母的方格, G = 10 。这是由于水平方向从起点到那里只需一个方格的间隔。与起点直接相教程英文邻的上方,下方,左方的方格的 G 值教程都是 10 ,对角线的方格 G 值都是 14 。

H 值经过预算起点于完毕 ( 赤色方格 ) 的 Manhattan 间隔得到,仅作横向和纵向移动,而且疏忽沿途的墙面。运用这种办法,起点右边的方格到完毕有 3 个方格的间隔,因而 H = 30 。这个方格上方的方格到完毕有 4 个方格的间隔 ( 留神只核算横向和纵向间隔 ) ,因而 H = 40 。关于其他的方格,你能够用相数组初始化同的办法知道 H 值指针式万用表图片是怎样得来的。

每个方格的 F 值,再说一次,直接把 G 值和指针的拼音 H 值相加就能够了。

1.4持续查找(Continuing the Search)

为了持续查找,咱们从 open list 中挑选 F 值最小的 ( 方格 ) 节点,然后对所选教程之家app下载择的方指针式万用表图片格作如下操作:

4. 把它从 open list 里取出,放到 close list 中。

5. 查看全部与它相邻的方格,疏忽其间在 close list 中或是不可走 (unwalkable) 的方算法的五个特性格 ( 比方墙,水,或是其他不合法地形 ) ,假定方格不在open ls教程it 中,则把它们参加到 open list 中。

把咱们数组去重选定的方格设置为这些新参加的方格的父亲。算法的有穷性是指

6. 假定某个相邻的方格现已在 open list 中,则查看这条途径是算法的有穷性是指否更优,也便是说经由当时方格 ( 咱们选中的方格 ) 抵达那个方格是否具有更小的 G 值。假定没算法有,不做任何操作。

相反,假定 G 值更小,则把那个方格的父亲设为当时方格 ( 咱们选中的方格 ) ,然后从头核算那个方格的 F 值和 G 值。假定你仍是很稠浊,请参看下图。

【途径规划】根据A星算法完成栅格地图途径规划

图 4

Ok ,让咱们看看它是怎样作业的。在咱们最初的 9 个方数组长度格中,还有 8 个在 open list 中,起点被放入了 close list 中。在这些方格中,起点右边的格子的 F 值 40 最小,因而咱们挑选这个方格作为下一个要处理的方格。它的外框用蓝线打亮。

首要,咱们把它从 open list 移到 close list 中 ( 这便是为什么用蓝线打亮的原因了 ) 。然后咱们查看与它相邻的方格。它右边的方格是墙面,咱们疏忽。它左边的方格是起点,在 close list 中,咱们也疏忽。其他 4 个相邻的方格均在 open list 中,咱们需求查看经由这个方格抵达那里的途径是否更好,运用 G 值来判定。让咱们看看上面的方格。它现在的 G 值为 14 。算法的有穷性是指假定咱们经由当时方格抵达那里, G 值将会为 20(其间 10 为抵达当时方格算法的时刻复杂度取决于的 G 值,此外还要加上从当时方格纵向移动到上面方格的 G 值 10) 。明显 20 比 14 大,因而这不是最优的途径。假定你看图你就数组会理解。直接从起点沿对角线移动到那个数组c言语方格比先横向移动再纵向移动要好。

当把 4 个现已在 open list 中的相邻方格都查看后,没有发现经由当时方格的更好途径指针的拼音,因而咱们不做任何改动。现在算法工程师咱们现已查看了当时方格的全部相邻的方格,并也对他们作了处理,是时候挑选下一个待处理的算法是什么方格了。

因而再次遍历咱们的 o数组公式pen list ,现在它只需 7 个方格了,咱们指针的拼音需求挑选 F 值最小的那个。风趣的是,这次有两个方格的 F 值都 54 ,选哪个呢?没什么联络。从速度上考虑,挑选终究参加 open list 的方格更快。这导致了在寻路进程中,当靠近方针时,优先运用新找到的方格的偏好。可是这并不重要。 ( 对相同数据的不同对数组的定义待,导致两中版别的 A* 找到等长教程snapchat下载的不同途径 ) 。

咱们挑选起点右下方的方格,如下图所示。

【途径规划】根据A星算法完成栅格地图途径规划

图 5

这次,当咱们查看相邻的方格时,咱们发现它右边的方格是墙,疏忽之数组指针。上面的也相同。

咱们把墙下面的一格也疏忽掉数组公式。为什么?由于假定不穿越墙角的话,你不能直接从其教程视频怎样制作办法时方格移教程的意思动到那个方格。你需求先往下走教程snapchat下载,然后再移动到那个方格数组去重,这样来绕过墙角。 ( 留神:穿越墙角的规则是可选的,依赖于你数组公式的节点是怎样放算法工程师置的 )

这样还剩下 5 个相邻的方格。当时方格下面的 2 个方格还没有参加 open数组排序 li教程刷点券st ,所以把它们参加,同时把当时方格设为他们的父亲。在剩下的3 个方格中,有 2 个现已在 close指针式万用表怎样读数 list 中 ( 一个是起点,一个是当时方格上面的方格算法的时刻复杂度取决于,外框被加亮的 ) ,咱们忽算法略它数组c言语们。终究一个方格,也便是当时方格算法规划与剖析左边的方格,咱们查看经由当时方格抵达那里算法导论是否具有更数组初始化数组指针的 G 值。没有。因而咱们预备从 op指针的拼音en list 中挑选教程之家app下载下一指针数组和数组指针的差异个待算法是什么处理的方格。

不断重复这个进程,直到把完毕也参加到了 open list 中,此刻如下图所示。

【途径规划】根据A星算法完成栅格地图途径规划

图 6

留神,在起点下面 2 格的方格的父亲现已与前面不同了。之前它的 G 值是 28 并算法剖析的意图是且指向它右上算法工程师学什么专业方的方格。现在它的 G 值为 20 ,而且指向它正上方的方格。这在寻路进程中的某处产教程英文生,运用新途径时 G 值经过查看而且变得更低,因而父节点被从头设置, G 和 F 值被从头核算。尽管这一改动在本例中并不重算法工程师学什么专业要,可是在许多场教程拼音合中,这种改动会导致寻路效果的数组c言语巨大改动。

那么咱们怎样样去承认实践途径呢?很简略,从完毕教程动漫人物开始,按着箭头向父节点移动,这样你就被带回到了起点,这便是你的途径。如下图所示。从起点 A 移动到完毕 B 便是简略从途径上的一个方格的中心移动到另一个方格的中心,数组c言语直至方针。便是这指针数组么简略!

【途径规划】根据A星算法完成栅格地图途径规划教程的意思

指针万用表的读法 7

1.5A数组c言语*算法总结(Summary of the A* Method)教程

Ok ,现在你现已看完了整个的介绍,现在咱们把全部进程放在一起:

1. 把起点参加 open list 。

2. 重复如下进程:

a. 遍历 open list ,查找 F 值最小的节点,把它作为当时要处理的节点。

b. 把这个节点移到 close list 。

c. 对当时方格的 8 个相邻方格的每一个方格?

◆ 假定它是不可抵达的或许它在 close list 中,疏忽它。否则,做如下操作。

◆ 假定它不在 open list 中,把它参加 op教程之家en list ,而且把当时方格设置为它的父亲,记载该方格的 F , G 和 H 值。

◆ 假定它现已在 open list 中,查看这数组指针条途径 ( 即经由当时方格抵达它那里 ) 是否更好指针式万用表图片,用 G 值作参看。更小的 G 值标明这是更好的途径。假定教程英文是这样,把它的数组排序父亲设置为当时方数组排序格,并从头核算它的 G 和 F 值。假定你的 ope数组长度n list 是按 F 值排算法的有穷性是指序的话,改动后你或许需求从头排序。

d. 中止,当你

◆ 把完毕参加到了 open list 中,此刻途径现已找到了,或许

◆ 查找完毕失利,而且 open list 是算法的时刻复杂度取决于空的,此刻没有途径。

3. 保存途径。教程之家从完毕开始,每个方格沿着父节点移动直至起点,这便是你的途径

​二、代码演示

%% 栅格地图有阻止两端的对角线不能通行,根据A星算法完成栅格途径规划
%无缺代码或许仿真咨询qq1575304183
clear教程诀窍2;
clc
close all
G= [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0;
0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0;
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0;
0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0;
0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0;
0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0;
0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
ditu.qishi=教程英文[1,1];%起点
ditu.mubiao=[20,2教程英文0];%完毕
ditu.daxiao=20;%地图栅格数量
zhangai=[];
for i=1:ditu.daxiao
for j=1:ditu.daxiao
if (G(i,j)==1)
zhangai=[zhangai;j,i];%阻止方位
end
end
end
path算法工程师=Astar(zhangai,ditu);%经过A星算法求解最短途径
b = G;
b(end+1,end+1) = 0;
figure(4);
title('根据A星算法完成栅格途径规划,无缺代码或许仿真咨询qq1575304183,有阻止两端的对角线不能通行')
colormap([1 1 1;0 0 0]);  % 创建色彩
pcolor(0.5:size(G,2) + 0.5, 0.5:size(G,1) + 0.5, b); % 赋予栅格色彩
s教程之家app下载et(gca, 'XTick', 1:size(G,1), 'YTick', 1:size(G,2));  % 设置坐标
ax教程snapchat下载is image xy;  % 沿每个坐标轴运用相同的数据单位,保持一致
hold on;
plot(path(:,1),path(:,2),'-m','linewidth',2);算法工程师
a=path(1,3);

三、仿真效果

发表评论

提供最优质的资源集合

立即查看 了解详情