路线搜索(搜索路线地图)

前沿拓展:

路线搜索

您可以直接搜索到目的地,第二点击该位置,选择搜索附近,第二选择酒店即可。在搜索到的结果中,选择投取衡矛向破常志川你想要去的酒店,第二直接导航前去即可。


我们不论在游戏还是在机器人中,经常会碰到各种路径搜索算法,或者说最短路径查找,这里做个小结。我们第一要从经典的广度优先BFS和深度优先DFS说起。

不过很多地方都会用到openlist,closelist两个表,这里做个说明,open表里面放的是待扩展节点,close表里面放的是已经扩展过的节点,通常就是一个没有搜索过的节点会先放如open表中,后面从open表中将其取出进行扩展,第二丢到close表中。

DFS深度优先搜索

这种搜索算法算是最简单的,将open表当作栈使用,将A点入栈,第二从栈顶取出一个元素x,扩展其邻域,将合规的邻域节点放入open栈中,将x丢到close表中,直到x是是终点才退出

合规的判定比较简单,一般来说就是没有搜索过的节点,即不在close表中,也不在open表中

一句话形象概括的话,就是满屏都是食物的一条贪食蛇,每吃一格食物就增长一节,从A爬到B,就胜利了。

贪心算法

DFS的缺点是取邻域中,随意一个节点进行扩展。如果我们人为加入一个预估模型,预估到终点的距离,这样就可以取邻域中离终点最近的节点进行扩展,形成贪心搜索。

预估模型是人为加入的,常用的如曼哈顿距离。这种人为加入模型影响搜索的方式又被称为启发式搜索,加入的预估模型被称为启发函数,它能根据当前位置得到一个启发值,指导后续路径的选择

BFS广度优先

这种搜索算法也比较简单,将open表当作队列使用,将A点加入队列尾部,第二从队列头部取出一个元素x,扩展其邻域,将合规的邻域节点放入open队列中,将x丢到close表中,直到x是终点才退出

实际上和DFS很相似,只不过DFS用的是后进先出的栈,由于最后进入的都是该节点的邻域,所以出来的也是邻域节点。而BFS使用的是先进先出队列,比如最早进去的是A的四个邻域,取出一个邻域扩展后又丢进队列,但是下一个取出的还是A的某个邻域点,只有该组邻域点都拿完才能轮到下一组。

一句话形容的话,就是从A点开始像浸水一样,沿着四面八方扩展,直到找到B点

Dijkstra

迪克斯特拉也比较简单,理解了BFS,基本上也就理解了Dijkstra,也可以说它是BFS的扩展:

将A点放入open表,第二从open表中取出离A点最近的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

实际上,如果节点和其邻域节点的距离是固定常数,Dijkstra便退化为了BFS,若不是固定常数,则有细微差异,BFS是直接默认相邻节点距离相等,而Dijkstra则需要判断:

若x的邻域节点P已经在open表中,且x到A的距离 + x到邻域点P的距离 > P到A的距离,则重新更新P的距离。

此外,合规的判定和之前一致,即未搜索过的点即合规,即不在open和close表中

A* 算法

A star算法也是比较常见的算法,它也是在Dijkstra的基础上,引入一个人为的AB距离估计模型:f(x)=g(x)+h(x)

启发函数f(x)由两部分构成,g(x)是位置x到起点A的距离,h(x)是位置x到终点B的距离。其中只有h(x)项是预估项,或者说启发项。

A* 算法和Dijkstra相似,只不过Dijkstra中只有g(x)这一项,而A*引入了预估项h(x),其余和Dijkstra基本一样,将A点放入open表,第二从open表中取出f(x)最小的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

D*算法

又称为动态A* 算法,它用了一个更为先进的预估模型,它的预估项h(x)是通过反向Dijkstra得到的。

首次它便使用Dijkstra进行反向搜索,从B开始,直到搜索到了A,并记录各点x到B的距离为h(x),在A*中,我们的启发函数是f(x)=g(x)+h(x),由于h(x)是准确的测量,假设机器人走到位置x,第二检查所有合规邻域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等价于找h(y)最小。在算法中我们将所有h(y)记为k(y),这样从f(y)最小演变为找k(y)最小

实际上,D* 算法用在机器人实时寻路上,比如当前位置是A,目的地是B,最开始实际上找的是A到B的最短路径,当机器人走到位置x=A+1时,实际上机器人要寻找的是当前位置x到B的最短路径,所以才有所有邻域y到x的距离g(y)=1,找f(y)=g(y)+h(y)最小等价于找h(y)最小,这便是所谓动态A*的动态之处:将A到B的最短路径变成当前位置x到离B最近的邻域y的最短路径

用反向Dijkstra计算出h(x)预估后,从当前位置x开始,取出邻域中k(y)最小的位置y,第二机器人移动到y,当前位置x=y,开启下一轮搜索

但是如果发现路径上有新的障碍点了,则需要重新更新受到影响的点的距离,所谓受到影响也就是父节点为障碍物的节点。第二使用一些算法更新那些受到影响的预估h(x)值即可。

即令属于新增障碍物的所有位置o的h(o)=∞,并将其邻域受到影响的点的h值也标为∞,放入open表,直到影响扩散至机器人当前位置x

受到影响的点分两种情况:在障碍物中间(C在**位置)、在障碍物边缘(C在橙色位置)

受到障碍影响的点,h值处于上升状态,判断标准即 k(x)<h(x),**点的邻域节点y若未受到影响即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,则将y点作为其父节点并更新其h值

实际上也就是取**点集里,按k值从小到大进行邻域扩展,更新h值。更新完该**点后,最靠近该点那个橙色点又将变成了**点

更新h后,对当前节点进行搜索邻域,进行后续的传播扩展。这里就不详细介绍了。

拓展知识:

路线搜索

使用百度地图查询出现路线的方法如下:
打开百度浏览器,第二在百度首页选中“地图”。如下所示:
点击“地图”,即可进入百度地图首页。如下图所示:
进入百度地图的首页后,可以看到搜索栏底下有三个功能:搜索、公交、驾车;左侧则是一些常见的餐饮等。
搜索目的地,查看周围环境和交通状况。
搜索出来后可以看到左侧栏目是标记地点的符号,右侧是搜索地点的放大地图,左侧的标记符号在右侧的地点会看到具体的标记位置。
点击标记点后,会弹出信息窗口,详细介绍标记点的地点名称和相关信息以及附上图片。
在搜索拦下,点击公交,即可进行两个地点的公交路线搜索查询,并在地图显示出来。这时就有了出行路线。

前沿拓展:

路线搜索

您可以直接搜索到目的地,第二点击该位置,选择搜索附近,第二选择酒店即可。在搜索到的结果中,选择投取衡矛向破常志川你想要去的酒店,第二直接导航前去即可。


我们不论在游戏还是在机器人中,经常会碰到各种路径搜索算法,或者说最短路径查找,这里做个小结。我们第一要从经典的广度优先BFS和深度优先DFS说起。

不过很多地方都会用到openlist,closelist两个表,这里做个说明,open表里面放的是待扩展节点,close表里面放的是已经扩展过的节点,通常就是一个没有搜索过的节点会先放如open表中,后面从open表中将其取出进行扩展,第二丢到close表中。

DFS深度优先搜索

这种搜索算法算是最简单的,将open表当作栈使用,将A点入栈,第二从栈顶取出一个元素x,扩展其邻域,将合规的邻域节点放入open栈中,将x丢到close表中,直到x是是终点才退出

合规的判定比较简单,一般来说就是没有搜索过的节点,即不在close表中,也不在open表中

一句话形象概括的话,就是满屏都是食物的一条贪食蛇,每吃一格食物就增长一节,从A爬到B,就胜利了。

贪心算法

DFS的缺点是取邻域中,随意一个节点进行扩展。如果我们人为加入一个预估模型,预估到终点的距离,这样就可以取邻域中离终点最近的节点进行扩展,形成贪心搜索。

预估模型是人为加入的,常用的如曼哈顿距离。这种人为加入模型影响搜索的方式又被称为启发式搜索,加入的预估模型被称为启发函数,它能根据当前位置得到一个启发值,指导后续路径的选择

BFS广度优先

这种搜索算法也比较简单,将open表当作队列使用,将A点加入队列尾部,第二从队列头部取出一个元素x,扩展其邻域,将合规的邻域节点放入open队列中,将x丢到close表中,直到x是终点才退出

实际上和DFS很相似,只不过DFS用的是后进先出的栈,由于最后进入的都是该节点的邻域,所以出来的也是邻域节点。而BFS使用的是先进先出队列,比如最早进去的是A的四个邻域,取出一个邻域扩展后又丢进队列,但是下一个取出的还是A的某个邻域点,只有该组邻域点都拿完才能轮到下一组。

一句话形容的话,就是从A点开始像浸水一样,沿着四面八方扩展,直到找到B点

Dijkstra

迪克斯特拉也比较简单,理解了BFS,基本上也就理解了Dijkstra,也可以说它是BFS的扩展:

将A点放入open表,第二从open表中取出离A点最近的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

实际上,如果节点和其邻域节点的距离是固定常数,Dijkstra便退化为了BFS,若不是固定常数,则有细微差异,BFS是直接默认相邻节点距离相等,而Dijkstra则需要判断:

若x的邻域节点P已经在open表中,且x到A的距离 + x到邻域点P的距离 > P到A的距离,则重新更新P的距离。

此外,合规的判定和之前一致,即未搜索过的点即合规,即不在open和close表中

A* 算法

A star算法也是比较常见的算法,它也是在Dijkstra的基础上,引入一个人为的AB距离估计模型:f(x)=g(x)+h(x)

启发函数f(x)由两部分构成,g(x)是位置x到起点A的距离,h(x)是位置x到终点B的距离。其中只有h(x)项是预估项,或者说启发项。

A* 算法和Dijkstra相似,只不过Dijkstra中只有g(x)这一项,而A*引入了预估项h(x),其余和Dijkstra基本一样,将A点放入open表,第二从open表中取出f(x)最小的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

D*算法

又称为动态A* 算法,它用了一个更为先进的预估模型,它的预估项h(x)是通过反向Dijkstra得到的。

首次它便使用Dijkstra进行反向搜索,从B开始,直到搜索到了A,并记录各点x到B的距离为h(x),在A*中,我们的启发函数是f(x)=g(x)+h(x),由于h(x)是准确的测量,假设机器人走到位置x,第二检查所有合规邻域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等价于找h(y)最小。在算法中我们将所有h(y)记为k(y),这样从f(y)最小演变为找k(y)最小

实际上,D* 算法用在机器人实时寻路上,比如当前位置是A,目的地是B,最开始实际上找的是A到B的最短路径,当机器人走到位置x=A+1时,实际上机器人要寻找的是当前位置x到B的最短路径,所以才有所有邻域y到x的距离g(y)=1,找f(y)=g(y)+h(y)最小等价于找h(y)最小,这便是所谓动态A*的动态之处:将A到B的最短路径变成当前位置x到离B最近的邻域y的最短路径

用反向Dijkstra计算出h(x)预估后,从当前位置x开始,取出邻域中k(y)最小的位置y,第二机器人移动到y,当前位置x=y,开启下一轮搜索

但是如果发现路径上有新的障碍点了,则需要重新更新受到影响的点的距离,所谓受到影响也就是父节点为障碍物的节点。第二使用一些算法更新那些受到影响的预估h(x)值即可。

即令属于新增障碍物的所有位置o的h(o)=∞,并将其邻域受到影响的点的h值也标为∞,放入open表,直到影响扩散至机器人当前位置x

受到影响的点分两种情况:在障碍物中间(C在**位置)、在障碍物边缘(C在橙色位置)

受到障碍影响的点,h值处于上升状态,判断标准即 k(x)<h(x),**点的邻域节点y若未受到影响即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,则将y点作为其父节点并更新其h值

实际上也就是取**点集里,按k值从小到大进行邻域扩展,更新h值。更新完该**点后,最靠近该点那个橙色点又将变成了**点

更新h后,对当前节点进行搜索邻域,进行后续的传播扩展。这里就不详细介绍了。

拓展知识:

路线搜索

使用百度地图查询出现路线的方法如下:
打开百度浏览器,第二在百度首页选中“地图”。如下所示:
点击“地图”,即可进入百度地图首页。如下图所示:
进入百度地图的首页后,可以看到搜索栏底下有三个功能:搜索、公交、驾车;左侧则是一些常见的餐饮等。
搜索目的地,查看周围环境和交通状况。
搜索出来后可以看到左侧栏目是标记地点的符号,右侧是搜索地点的放大地图,左侧的标记符号在右侧的地点会看到具体的标记位置。
点击标记点后,会弹出信息窗口,详细介绍标记点的地点名称和相关信息以及附上图片。
在搜索拦下,点击公交,即可进行两个地点的公交路线搜索查询,并在地图显示出来。这时就有了出行路线。

前沿拓展:

路线搜索

您可以直接搜索到目的地,第二点击该位置,选择搜索附近,第二选择酒店即可。在搜索到的结果中,选择投取衡矛向破常志川你想要去的酒店,第二直接导航前去即可。


我们不论在游戏还是在机器人中,经常会碰到各种路径搜索算法,或者说最短路径查找,这里做个小结。我们第一要从经典的广度优先BFS和深度优先DFS说起。

不过很多地方都会用到openlist,closelist两个表,这里做个说明,open表里面放的是待扩展节点,close表里面放的是已经扩展过的节点,通常就是一个没有搜索过的节点会先放如open表中,后面从open表中将其取出进行扩展,第二丢到close表中。

DFS深度优先搜索

这种搜索算法算是最简单的,将open表当作栈使用,将A点入栈,第二从栈顶取出一个元素x,扩展其邻域,将合规的邻域节点放入open栈中,将x丢到close表中,直到x是是终点才退出

合规的判定比较简单,一般来说就是没有搜索过的节点,即不在close表中,也不在open表中

一句话形象概括的话,就是满屏都是食物的一条贪食蛇,每吃一格食物就增长一节,从A爬到B,就胜利了。

贪心算法

DFS的缺点是取邻域中,随意一个节点进行扩展。如果我们人为加入一个预估模型,预估到终点的距离,这样就可以取邻域中离终点最近的节点进行扩展,形成贪心搜索。

预估模型是人为加入的,常用的如曼哈顿距离。这种人为加入模型影响搜索的方式又被称为启发式搜索,加入的预估模型被称为启发函数,它能根据当前位置得到一个启发值,指导后续路径的选择

BFS广度优先

这种搜索算法也比较简单,将open表当作队列使用,将A点加入队列尾部,第二从队列头部取出一个元素x,扩展其邻域,将合规的邻域节点放入open队列中,将x丢到close表中,直到x是终点才退出

实际上和DFS很相似,只不过DFS用的是后进先出的栈,由于最后进入的都是该节点的邻域,所以出来的也是邻域节点。而BFS使用的是先进先出队列,比如最早进去的是A的四个邻域,取出一个邻域扩展后又丢进队列,但是下一个取出的还是A的某个邻域点,只有该组邻域点都拿完才能轮到下一组。

一句话形容的话,就是从A点开始像浸水一样,沿着四面八方扩展,直到找到B点

Dijkstra

迪克斯特拉也比较简单,理解了BFS,基本上也就理解了Dijkstra,也可以说它是BFS的扩展:

将A点放入open表,第二从open表中取出离A点最近的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

实际上,如果节点和其邻域节点的距离是固定常数,Dijkstra便退化为了BFS,若不是固定常数,则有细微差异,BFS是直接默认相邻节点距离相等,而Dijkstra则需要判断:

若x的邻域节点P已经在open表中,且x到A的距离 + x到邻域点P的距离 > P到A的距离,则重新更新P的距离。

此外,合规的判定和之前一致,即未搜索过的点即合规,即不在open和close表中

A* 算法

A star算法也是比较常见的算法,它也是在Dijkstra的基础上,引入一个人为的AB距离估计模型:f(x)=g(x)+h(x)

启发函数f(x)由两部分构成,g(x)是位置x到起点A的距离,h(x)是位置x到终点B的距离。其中只有h(x)项是预估项,或者说启发项。

A* 算法和Dijkstra相似,只不过Dijkstra中只有g(x)这一项,而A*引入了预估项h(x),其余和Dijkstra基本一样,将A点放入open表,第二从open表中取出f(x)最小的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

D*算法

又称为动态A* 算法,它用了一个更为先进的预估模型,它的预估项h(x)是通过反向Dijkstra得到的。

首次它便使用Dijkstra进行反向搜索,从B开始,直到搜索到了A,并记录各点x到B的距离为h(x),在A*中,我们的启发函数是f(x)=g(x)+h(x),由于h(x)是准确的测量,假设机器人走到位置x,第二检查所有合规邻域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等价于找h(y)最小。在算法中我们将所有h(y)记为k(y),这样从f(y)最小演变为找k(y)最小

实际上,D* 算法用在机器人实时寻路上,比如当前位置是A,目的地是B,最开始实际上找的是A到B的最短路径,当机器人走到位置x=A+1时,实际上机器人要寻找的是当前位置x到B的最短路径,所以才有所有邻域y到x的距离g(y)=1,找f(y)=g(y)+h(y)最小等价于找h(y)最小,这便是所谓动态A*的动态之处:将A到B的最短路径变成当前位置x到离B最近的邻域y的最短路径

用反向Dijkstra计算出h(x)预估后,从当前位置x开始,取出邻域中k(y)最小的位置y,第二机器人移动到y,当前位置x=y,开启下一轮搜索

但是如果发现路径上有新的障碍点了,则需要重新更新受到影响的点的距离,所谓受到影响也就是父节点为障碍物的节点。第二使用一些算法更新那些受到影响的预估h(x)值即可。

即令属于新增障碍物的所有位置o的h(o)=∞,并将其邻域受到影响的点的h值也标为∞,放入open表,直到影响扩散至机器人当前位置x

受到影响的点分两种情况:在障碍物中间(C在**位置)、在障碍物边缘(C在橙色位置)

受到障碍影响的点,h值处于上升状态,判断标准即 k(x)<h(x),**点的邻域节点y若未受到影响即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,则将y点作为其父节点并更新其h值

实际上也就是取**点集里,按k值从小到大进行邻域扩展,更新h值。更新完该**点后,最靠近该点那个橙色点又将变成了**点

更新h后,对当前节点进行搜索邻域,进行后续的传播扩展。这里就不详细介绍了。

拓展知识:

路线搜索

使用百度地图查询出现路线的方法如下:
打开百度浏览器,第二在百度首页选中“地图”。如下所示:
点击“地图”,即可进入百度地图首页。如下图所示:
进入百度地图的首页后,可以看到搜索栏底下有三个功能:搜索、公交、驾车;左侧则是一些常见的餐饮等。
搜索目的地,查看周围环境和交通状况。
搜索出来后可以看到左侧栏目是标记地点的符号,右侧是搜索地点的放大地图,左侧的标记符号在右侧的地点会看到具体的标记位置。
点击标记点后,会弹出信息窗口,详细介绍标记点的地点名称和相关信息以及附上图片。
在搜索拦下,点击公交,即可进行两个地点的公交路线搜索查询,并在地图显示出来。这时就有了出行路线。

前沿拓展:

路线搜索

您可以直接搜索到目的地,第二点击该位置,选择搜索附近,第二选择酒店即可。在搜索到的结果中,选择投取衡矛向破常志川你想要去的酒店,第二直接导航前去即可。


我们不论在游戏还是在机器人中,经常会碰到各种路径搜索算法,或者说最短路径查找,这里做个小结。我们第一要从经典的广度优先BFS和深度优先DFS说起。

不过很多地方都会用到openlist,closelist两个表,这里做个说明,open表里面放的是待扩展节点,close表里面放的是已经扩展过的节点,通常就是一个没有搜索过的节点会先放如open表中,后面从open表中将其取出进行扩展,第二丢到close表中。

DFS深度优先搜索

这种搜索算法算是最简单的,将open表当作栈使用,将A点入栈,第二从栈顶取出一个元素x,扩展其邻域,将合规的邻域节点放入open栈中,将x丢到close表中,直到x是是终点才退出

合规的判定比较简单,一般来说就是没有搜索过的节点,即不在close表中,也不在open表中

一句话形象概括的话,就是满屏都是食物的一条贪食蛇,每吃一格食物就增长一节,从A爬到B,就胜利了。

贪心算法

DFS的缺点是取邻域中,随意一个节点进行扩展。如果我们人为加入一个预估模型,预估到终点的距离,这样就可以取邻域中离终点最近的节点进行扩展,形成贪心搜索。

预估模型是人为加入的,常用的如曼哈顿距离。这种人为加入模型影响搜索的方式又被称为启发式搜索,加入的预估模型被称为启发函数,它能根据当前位置得到一个启发值,指导后续路径的选择

BFS广度优先

这种搜索算法也比较简单,将open表当作队列使用,将A点加入队列尾部,第二从队列头部取出一个元素x,扩展其邻域,将合规的邻域节点放入open队列中,将x丢到close表中,直到x是终点才退出

实际上和DFS很相似,只不过DFS用的是后进先出的栈,由于最后进入的都是该节点的邻域,所以出来的也是邻域节点。而BFS使用的是先进先出队列,比如最早进去的是A的四个邻域,取出一个邻域扩展后又丢进队列,但是下一个取出的还是A的某个邻域点,只有该组邻域点都拿完才能轮到下一组。

一句话形容的话,就是从A点开始像浸水一样,沿着四面八方扩展,直到找到B点

Dijkstra

迪克斯特拉也比较简单,理解了BFS,基本上也就理解了Dijkstra,也可以说它是BFS的扩展:

将A点放入open表,第二从open表中取出离A点最近的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

实际上,如果节点和其邻域节点的距离是固定常数,Dijkstra便退化为了BFS,若不是固定常数,则有细微差异,BFS是直接默认相邻节点距离相等,而Dijkstra则需要判断:

若x的邻域节点P已经在open表中,且x到A的距离 + x到邻域点P的距离 > P到A的距离,则重新更新P的距离。

此外,合规的判定和之前一致,即未搜索过的点即合规,即不在open和close表中

A* 算法

A star算法也是比较常见的算法,它也是在Dijkstra的基础上,引入一个人为的AB距离估计模型:f(x)=g(x)+h(x)

启发函数f(x)由两部分构成,g(x)是位置x到起点A的距离,h(x)是位置x到终点B的距离。其中只有h(x)项是预估项,或者说启发项。

A* 算法和Dijkstra相似,只不过Dijkstra中只有g(x)这一项,而A*引入了预估项h(x),其余和Dijkstra基本一样,将A点放入open表,第二从open表中取出f(x)最小的位置x,进行邻域扩展,第二将合规的邻域节点丢入open表中,第二将x丢入close表

D*算法

又称为动态A* 算法,它用了一个更为先进的预估模型,它的预估项h(x)是通过反向Dijkstra得到的。

首次它便使用Dijkstra进行反向搜索,从B开始,直到搜索到了A,并记录各点x到B的距离为h(x),在A*中,我们的启发函数是f(x)=g(x)+h(x),由于h(x)是准确的测量,假设机器人走到位置x,第二检查所有合规邻域y,由于的g(y)都相等g(y)=g(x)+1,所以找f(y)=g(y)+h(y)最小等价于找h(y)最小。在算法中我们将所有h(y)记为k(y),这样从f(y)最小演变为找k(y)最小

实际上,D* 算法用在机器人实时寻路上,比如当前位置是A,目的地是B,最开始实际上找的是A到B的最短路径,当机器人走到位置x=A+1时,实际上机器人要寻找的是当前位置x到B的最短路径,所以才有所有邻域y到x的距离g(y)=1,找f(y)=g(y)+h(y)最小等价于找h(y)最小,这便是所谓动态A*的动态之处:将A到B的最短路径变成当前位置x到离B最近的邻域y的最短路径

用反向Dijkstra计算出h(x)预估后,从当前位置x开始,取出邻域中k(y)最小的位置y,第二机器人移动到y,当前位置x=y,开启下一轮搜索

但是如果发现路径上有新的障碍点了,则需要重新更新受到影响的点的距离,所谓受到影响也就是父节点为障碍物的节点。第二使用一些算法更新那些受到影响的预估h(x)值即可。

即令属于新增障碍物的所有位置o的h(o)=∞,并将其邻域受到影响的点的h值也标为∞,放入open表,直到影响扩散至机器人当前位置x

受到影响的点分两种情况:在障碍物中间(C在**位置)、在障碍物边缘(C在橙色位置)

受到障碍影响的点,h值处于上升状态,判断标准即 k(x)<h(x),**点的邻域节点y若未受到影响即:h(y)<=k(y),且可以降低其h值:h(y)+c(x,y)<h(x) ,则将y点作为其父节点并更新其h值

实际上也就是取**点集里,按k值从小到大进行邻域扩展,更新h值。更新完该**点后,最靠近该点那个橙色点又将变成了**点

更新h后,对当前节点进行搜索邻域,进行后续的传播扩展。这里就不详细介绍了。

拓展知识:

路线搜索

使用百度地图查询出现路线的方法如下:
打开百度浏览器,第二在百度首页选中“地图”。如下所示:
点击“地图”,即可进入百度地图首页。如下图所示:
进入百度地图的首页后,可以看到搜索栏底下有三个功能:搜索、公交、驾车;左侧则是一些常见的餐饮等。
搜索目的地,查看周围环境和交通状况。
搜索出来后可以看到左侧栏目是标记地点的符号,右侧是搜索地点的放大地图,左侧的标记符号在右侧的地点会看到具体的标记位置。
点击标记点后,会弹出信息窗口,详细介绍标记点的地点名称和相关信息以及附上图片。
在搜索拦下,点击公交,即可进行两个地点的公交路线搜索查询,并在地图显示出来。这时就有了出行路线。

原创文章,作者:九贤生活小编,如若转载,请注明出处:http://www.wangguangwei.com/29341.html