A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

A*算法改进——Any-Angle Path Planning的Theta*算法与Lazy Theta*算法

大家好,又见面了,我是全栈君。

本文是该篇文章的归纳http://aigamedev.com/open/tutorial/lazy-theta-star/#Nash:07 。

871155-20170208112240760-1421237203.png

传统的A*算法中,寻找出来的路径只能是沿着给出的模型(比如TileMap、网格模型)上的路径依次行走。(上图上半)

在游戏中寻路的场合下,这种路径看起来是十分不自然的。与之相对的“自然的”寻路称为Any-Angle Path Planning。(上图下半)

对于A*的一个简单的修正是,在生成路径之后,检测路径上隔开的两个点之间是否有line of sight(即视线,以下简称LOS),有的话便可以把中间的点删除,让人物直接穿过。这种方法称之为A* with post-smoothed paths。依据如何选取这两个点,最终优化的效果不同。但是要注意的是这种修正得到的路径的质量和效率是需要取舍的。

另外,本文介绍的算法都不保证寻找的路径是最佳的。不要尝试用来刷题233。

Theta*

修正的第二种办法,即Theta*算法。这种算法是A*的一种改进,关键在于其打开一个节点s,然后更新周围的节点s’时,会检查s’与parent(s)的可见性。如果可见,则把s’的父节点设置成parent(s)。

871155-20170208111318807-1517171879.png
左边是\A*算法,中间是Theta*算法,右边是等下介绍的Lazy Theta*。

可以看到在Theta*中,除了ComputeCost函数之外,其他的内容和A*算法是相同的。

在ComputeCost中,A*算法计算一个点s’的新的g,如果比原来的更好,则将原来的parent和g换成新的。

在Theta*中,则在计算前,先去计算s’s的parent有无视线。如果有视线,则把s’的parent和gs的parent为parent进行更新。否则跟A*一样处理。

然而,Theta*有一个很大的问题,就是需要做大量的line of sight检查。有多少个点进入过open列表,就有多少次检查。在较为细致的网格中这个数量是十分巨大的。

Lazy Theta*

这里就引出了Theta*的一种优化,即Lazy Theta*。

871155-20170208112051369-758210801.png
两种算法进行的LOS检查数。

Lazy Theta*的核心思想在于,将line of sight检查延迟到打开该节点为止。

871155-20170208112425354-1523539550.png
示例,注意右上图(第二步)中B2指向的是start而不是B3,因为B2尚未打开,我们可以乐观认为B2和父节点B3的父节点有LOS。这一假设在左下图(第三步)中,B2打开时才得到修正。

在Theta*中,检查视线的时机发生于一个点进入open列表的时候。但是实际上,有很多进入open列表的点最终不在路径中,这意味着LOS检查是无效的。因此Lazy Theta*选择把LOS检查放到打开该节点的时候进行。

当然,进入open列表的点,我们需要设置它的g值和parent。在Lazy Theta*中,我们乐观地认为在这里LOS检查永远成立的,因此g值和parent值得的设置按照Theta*中LOS检查成立一般地进行设置。

随后,在打开一个节点时,我们对这个点调用SetVertex方法。该方法中我们对该点和它的父节点进行真正的LOS检查。如果成立,那么我们之前的假设是对的,那就继续进行下去。如果没有LOS,那么我们还需要为这个点找到一个正确的parent。

对点s找到正确的parent的方法稍微繁杂一点。首先我们要知道什么点能成为s的parent,答案是在close表里的点。其次还应该是和s有LOS关系的点。如果有的选择的话,我们还要选择g(parent) + c(parent,s)最小的。

当然,如果我们对close表里的点全部做一遍LOS检查那就是本末倒置了。在这里我们直接取s的相邻点作为parent的候选。然后和close表做个交集,在其中选择最好的点即可。

Lazy Theta*的优化

这个优化是在A*中就存在的,优化的A*叫做Weighted A*,即带权重的A*。

所谓权重是加给启发函数的。原本的估值函数F(s) = G(s) + H(s),加入权重后变成F(s) = G(s) + weight * H(s) 。

这意味着比起从出发点到当前点的距离,当前点到终点的距离的估值影响更大(当weight > 1时)。

可以简单的理解为weight越大,会“更想接近终点”。

在Lazy Theta*中也可以直接套用这个优化。同时比起普通的weighted A*,Lazy Theta*中的这项优化更加有价值。具体的就不在这里叙述了,在原文中有提到。

下一篇文章中我会简单叙述一下我在unity/C#中实现的Lazy Theta*寻路。

转载于:https://www.cnblogs.com/yangrouchuan/p/6373285.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108671.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手把手教你配置阿里云服务器搭建网站

    手把手教你配置阿里云服务器搭建网站出于好奇,我用学生优惠租了一台阿里云服务器,打算做一些Javaweb的开发,但是毕竟是第一次接触这样的东西,还是比较懵逼,在这个过程中遇到了一些问题(肯定会遇到问题的),但是呢,在网上搜解决办法的时候,总是历经波折才能找到我最后想要的东西,所以我想把我配置阿里云的时候踩过的坑填一下,如果你按照我的方法成功解决的问题,别忘了给我点个赞

    2022年6月29日
    36
  • xampp linux_xampp安装出错

    xampp linux_xampp安装出错xampp是一套很好使用的web服务器组合软件,这里教大家如何在linux安装搭建xampp,希望能帮助到你首先下载xampp安装包Linux版xampp-linux-1.8.3.5-install.run用root用户登录到Linux系统,不是root用户的,用su命令切换下windows系统下百度搜索xampp,下载完成后可以用SSH工具将下载的文件上传到Linux系统中linux系统下,可以…

    2025年6月9日
    1
  • 激光slam与视觉slam优缺点_摄影光学与镜头

    激光slam与视觉slam优缺点_摄影光学与镜头介绍Slam:同步定位与建图,就是在定位的同时,建立环境地图。主要思路是根据运动学模型计算位姿,并通过传感得到的环境信息,对估计位姿调整优化,从而得到准确位姿,根据定位及感知数据绘制地图。下图为slam主流框架:传感器感知*在视觉SLAM中主要为传感信息的读取和预处理。前端里程计(Radar/VisualOdometry)。特征点匹配及运动估计。后端优化(Optimization)。后端接受不同时刻里程计测量位姿,以及回环检测的信息,对估计轨迹及环境信息进行全局优化。回环检测(Loop

    2022年8月23日
    11
  • oracle查询用户密码命令,Oracle数据库用户密码问题[通俗易懂]

    oracle查询用户密码命令,Oracle数据库用户密码问题[通俗易懂]场景一:在重置一些系统sys和system用户密码(已过期)时(还是使用原密码,根据user$中的password修改重置),在user$查看sys和system用户信息时发现这两个用户的PASSWORD为空,如下:SQL>selectname,passwordfromuser$wherenamein(‘SYS’,’SYSTEM’);NAME…

    2022年7月28日
    14
  • idea 设置maven资源的自动导入,auto import

    idea 设置maven资源的自动导入,auto importidea设置maven资源的自动导入,autoimport

    2022年9月29日
    4
  • 网页设计与制作毕业论文(解析ip数据包课程设计)

    PAGE单位代码学号分类号毕业设计(论文)基于HTML5的P2P流媒体传输技术的设计与实现院(系)名称专业名称计算机科学与技术学生姓名指导教师2014年6月北京航空航天大学毕业设计(论文)第PAGE\*ROMANI页基于HTML5的P2P流媒体传输技术的设计与实现摘要P2P流媒体传输技术是一项基于对等网络的大规模流媒体实时直播技术。P2P流媒体传输技术使…

    2022年4月15日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号