当前位置:首页 » 操作系统 » 寻路算法有哪些

寻路算法有哪些

发布时间: 2023-08-31 09:57:54

A. 星际争霸2的寻路算法思路是怎样的

首先地图整体开始前,会用多层可达矩阵算法,算出路径关键点
2,创建关键节点可达矩阵
3,再每个兵当前位置对关键节点进行路径计算
这样可以最小化资源占用就可以完成路径计算了,高数的离散数学,挺容易解的

B. 即时战略游戏中实用的寻路算法都有哪些

Potential Field,它是将地图用一个矩阵来表示,矩阵储存着大小不同的电势(整数)。例如,正电势表示吸引,负电势表示排斥。而游戏中的单位本身是一个负电势,游戏以一个数组储存所有单位的电势和位置。这样,在计算一个单位需要怎么从A点到B点时,我们可以用一个新的矩阵将目的地B点设成正电势,并以不同方式(如圆形、四边形等)辐射开来,离B点越远电势越低,直到0。然后将地图矩阵,目的地矩阵,和所有单位数组的电势相加,得出一个新的、反映当前游戏世界的电势矩阵,然后单位再选择周围所有电势点中的最高电势点去走。不过这里坑很多,因为它本质上是Greedy Algorithm,所以它未必能找出解。然而在某些设定中,例如在没有过于复杂地形,并且需要单位自动不相互覆盖的情况下,Potential Field还是可以完成任务。

Flocking Behavior,在对于一大群单位的寻路,计算量是很大的,而且往往会有很多的重复,这些都是可以避免的。如果单位的移动是利用Steering Behavior来实现的话,那么就可以为其中一个单位,称之为Leader,计算路径(例如用导航网格),然后其他单位按照以下Flocking原则来移动:1. 分离,避开相邻单位2. 一致,和整体的移动方向一致,这里应该是Leader的移动方向3. 聚合,向整体的平均位置靠拢这样的话,就可以降低寻路的计算量,并且得到更加真实的群体单位行进效果。

C. A星寻路算法和Unity自带的寻路相比有什么优势

在理解Navigation的时候,首先要明确两个知识点:

AStar:AStar是路点寻路算法中的一种,同时AStar不属于贪婪算法,贪婪算法适合动态规划,寻找局部最优解,不保证最优解。AStar是静态网格中求解最短路最有效的方法。也是耗时的算法,不宜寻路频繁的场合。一般来说适合需求精确的场合。

性能和内存占用率都还行,和启发式的搜索一样,能够根据改变网格密度、网格耗散来进行调整精确度。

A Star一般使用场景:

  • 策略游戏的策略搜索

  • 方块格子游戏中的格子寻路

Navigation:网格寻路算法,严格意义上它属于”拐角点算法”,效率是比较高的,但是不保证最优解算法。Navigation相对来说消耗内存更大,性能的话还不错。

Navigation一般使用场景:

  • 游戏场景的怪物寻路

  • 动态规避障碍

它们二者事件的实现方式和原理都不同。


AStar的话,

D. 梦幻西游自动寻路的寻路算法怎么算

A*寻路算法 A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索过程:
创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->
While(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点) break;
else
{
if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于OPEN表的估价值 )
更新OPEN表中的估价值; //取最小路径的估价值
if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于CLOSE表的估价值 )
更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
if(X not in both)
求X的估价值;
并将X插入OPEN表中; //还没有排序
}
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
启发式搜索其实有很多的算法,比如:局部择优搜索法、最好优先搜索法等等。当然A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。象局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的
节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。最好优先就聪明多了,他在搜索时,便没有舍弃节点(除非该节点是死节点),在每一步的估价
中都把当前的节点和以前的节点的估价值比较得到一个“最佳的节点”。这样可以有效的防止“最佳节点”的丢失。那么A*算法又是一种什么样的算法呢?其实A*算法也是一种最
好优先的算法。只不过要加上一些约束条件罢了。由于在一些问题求解时,我们希望能够求解出状态空间搜索的最短路径,也就是用最快的方法求解问题,A*就是干这种事情的!
我们先下个定义,如果一个估价函数可以找出最短的路径,我们称之为可采纳性。A*算法是一个可采纳的最好优先算法。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值,h'(n)是n到目标的最断路经的启发值。由于这个f'(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做
近似。g(n)代替g'(n),但 g(n)>=g'(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h'(n),但h(n)<=h'(n)才可(这一点特别的重要)。可以证明应用这样的估价
函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A*算法。哈。你懂了吗?肯定没懂。接着看。
举一个例子,其实广度优先算法就是A*算法的特例。其中g(n)是节点所在的层数,h(n)=0,这种h(n)肯定小于h'(n),所以由前述可知广度优先算法是一种可采纳的。实际也是
。当然它是一种最臭的A*算法。
再说一个问题,就是有关h(n)启发函数的信息性。h(n)的信息性通俗点说其实就是在估计一个节点的值时的约束条件,如果信息越多或约束条件越多则排除的节点就越多,估价函
数越好或说这个算法越好。这就是为什么广度优先算法的那么臭的原因了,谁叫它的h(n)=0,一点启发信息都没有。但在游戏开发中由于实时性的问题,h(n)的信息越多,它的计
算量就越大,耗费的时间就越多。就应该适当的减小h(n)的信息,即减小约束条件。但算法的准确性就差了,这里就有一个平衡的问题。
}

E. 有哪些应用于移动机器人路径规划的算法

机器人家上了解到,在二维二值地图(FREE or OCCUPIED)场景下进行路径规划的方法。我看之前有同学在回答的时候配上了这幅图:

这幅图上的算法罗列的还是很全面的,体现了各个算法的出生顺序。但是并不能很好的对他们进行一个本质的分类。刚刚那位同学说的graph-based和sampling-based的分类方法我感觉有点概念重叠不能够对规划算法进行这样的分类,下面通过自己这一年多的研究和实践对规划算法进行一个简单的分类:

这幅图上的算法罗列的还是很全面的,体现了各个算法的出生顺序。但是并不能很好的对他们进行一个本质的分类。刚刚那位同学说的graph-based和sampling-based的分类方法我感觉有点概念重叠不能够对规划算法进行这样的分类,下面通过自己这一年多的研究和实践对规划算法进行一个简单的分类:

两大类:
1. 完备的(complete)
2. 基于采样的(sampling-based)又称为概率完备的

一 完备的规划算法

A*算法

所谓完备就是要达到一个systematic的标准,即:如果在起始点和目标点间有路径解存在那么一定可以得到解,如果得不到解那么一定说明没有解存在。
这一大类算法在移动机器人领域通常直接在occupancy grid网格地图上进行规划(可以简单理解成二值地图的像素矩阵)以深度优先寻路算法、广度优先寻路算法、Dijkstra(迪杰斯特拉)算法为始祖,以A*算法(Dijstra算法上以减少计算量为目的加上了一个启发式代价)最为常用,近期的Theta*算法是在A*算法的基础上增加了line-of-sight优化使得规划出来的路径不完全依赖于单步的栅格形状(答主以为这个算法意义不大,不就是规划了一条路径再简单平滑了一下么)。
完备的算法的优势在与它对于解的捕获能力是完全的,但是由此产生的缺点就是算法复杂度较大。这种缺点在二维小尺度栅格地图上并不明显,但是在大尺度,尤其是多维度规划问题上,比如机械臂、蛇形机器人的规划问题将带来巨大的计算代价。这样也直接促使了第二大类算法的产生。

二 基于采样的规划算法

RRT-connect算法
这种算法一般是不直接在grid地图进行最小栅格分辨率的规划,它们采用在地图上随机撒一定密度的粒子来抽象实际地图辅助规划。如PRM算法及其变种就是在原始地图上进行撒点,抽取roadmap在这样一个拓扑地图上进行规划;RRT以及其优秀的变种RRT-connect则是在地图上每步随机撒一个点,迭代生长树的方式,连接起止点为目的,最后在连接的图上进行规划。这些基于采样的算法速度较快,但是生成的路径代价(可理解为长度)较完备的算法高,而且会产生“有解求不出”的情况(PRM的逢Narrow space卒的情况)。这样的算法一般在高维度的规划问题中广泛运用。

三 其他规划算法
除了这两类之外还有间接的规划算法:Experience-based(Experience Graph经验图算法)算法:基于经验的规划算法,这是一种存储之前规划路径,建立知识库,依赖之进行规划的方法,题主有兴趣可以阅读相关文献。这种方法牺牲了一定的空间代价达到了速度与完备兼得的优势。此外还有基于广义Voronoi图的方法进行的Fast-marching规划,类似dijkstra规划和势场的融合,该方法能够完备地规划出位于道路中央,远离障碍物的路径。答主最近也在研究此类算法相关的工作。

APF(人工势场)算法

至于D* 、势场法、DWA(动态窗口法)、SR-PRM属于在动态环境下为躲避动态障碍物、考虑机器人动力学模型设计的规划算法。

F. 从头理解JPS寻路算法

本文的思路受到博客: http://blog.sina.com.cn/s/blog_4a5c75d40102wo5l.html
和论文: http://www.doc88.com/p-6099778647749.html 的启发和借鉴。
JPS(jump point search)算法实际上是对A 寻路算李祥桐法的一个改进,即在扩展搜索节点时,提出了更优化的策略,A 在扩展节点时会把节点所有邻居都考虑进去,这样openlist中点的数量会很多,搜索效率较慢。JPS算法通过寻找跳点的方式,排除了大量不感兴趣的点,减少了openlist中搜索的点的数量,速度大大提高。

水平(垂直)搜索:如图右边部分描述,点1和4如果经过x到达,还不如从点p(x)到达,所以不用考虑点1,4,同理继续向右搜索时,点2,5和点3,6,都是类似的情况,直到遇到黑色的障碍,没有发现感兴趣的点,x处水平方向搜索完成,垂直方向搜索类似。如图左边部分描述,在点x处向右搜索至点y时,点y有一个强迫邻居(点7),因此y是从点x处沿水平方向搜索的一个跳点,需要将y加入到openlist中。水平搜索结束。

对角搜索:斜向搜索时,需要先在当前点的水平和垂直方向搜索一下,看能否找到感兴趣的点,如果找到,则将当前点加到openlist,结束斜向搜索,如果找不到,则继续宴卜斜向多走一步,继续,直到找到感兴趣的点或者斜向方向遇到障碍。

一条完整路线的搜索过程:

搜索算法:

下面两张对比图,摘自上面的论文,可以看出,JPS算法实在优秀。

github链接

上图中红色块为节点x,基于前节点为P(x)的情况下的自然邻居节点。而被迫邻居则是图中绿色的方块(其对称情况未画出)。x被迫邻居包含三层隐藏含义:首先被迫邻居的位置是基于P(x)、x、阻挡块的相对关系定的,如第三个图所示,如果第三个图中,P(x)的位置在节点6的位置,那么绿色方块就不是x的被迫邻居了。其次,被迫邻居一点是考察非自然邻居的节点。最后被迫邻居一定是P(x)经过x到达才能取得最短路径的点。

起点S,终点T,黑色块为阻挡黄色块为跳点,红色箭头是搜索方向,但是没有找到跳点,绿色箭头表示找到跳点。横坐标A-N,纵坐标1-10。

起始位置S,将A10加入openlist里,开始算法流程。
从openlist里取出代价最小的节点(现在为S),当前节点没有方向,所以需要搜索8个方向,只有右上方B9点是跳点。因为根据跳点定义iii,斜向搜索时,需要在两个分量方向查找跳点,右方是墙壁,略过,上方B8点有强迫邻居点C7,所以B8是跳点(根据跳点定义ii),所以B9是跳点。将B9加入openlist里。A10处理完后,将其从openlist中移除,加入closelist里。

从openlist中取出B9点,该点的父亲是S,所以搜索方向为右斜上,需要在右斜上,右方,上方搜索跳点,只有B8满足要求,将B8加入openlist。处理完B9点将其移到closelist。

从openlist取出B8点,该点搜索哪坦方向为上,B8有被邻居C7点,在斜上方搜索跳点,可以看出D8是C7的被迫邻居,所以C7是跳点,B8处继续向上搜索结束。

从openlist中取出C7点。需要搜索右上,右,上三个方向。水平搜索时发现被迫邻居D8,加入openlist。右上搜索时发现跳点G3(因其在上方搜索时发现具有被迫邻居节点的G2),将G3加入openlist。C7点处理结束。

取出G3点(为啥是G3,而不是D8点呢,因为从总代价来说G3比D8更小,总代价=已经走过的距离 + 估值,估值可采用曼哈顿距离或者高斯距离),需要搜索右上,右,上三个方向。向上搜索到跳点G2。

其余点路径在图上标注,就不再重复了。

(1) 若current方向是直线
i. 如果current左后方不可走且左方可走,则沿current左前方和左方寻找跳点。
ii. 如果current当前方向可走,则沿current方向寻找跳点。
iii. 如果current右后方不可走且右方可走,则沿current右前方和右方寻找跳点。
(2) 若current方向是斜线
i. 如果当前方向的水平分量可走,则沿current方向的水平分量方向寻找跳点。
ii. 如果当前方向可走,沿current方向寻找跳点。
iii. 如果当前方向的垂直分量可走,则沿current方向的垂直分量方向寻找跳点。

上述算法流程是建立在斜向不可穿过阻挡基础上。

G. 寻路算法和逻辑算法之间异同点有哪些

寻路算法和逻辑算法之间异同点:
寻路算法也可以通过深度优先遍历 dfs 实现,寻找图 graph 从起始 s 点到其他点的路径稿顷,在上一小节的实现类中添加全局变量 from数组记录路径,from[i] 表示查找的路径上i的上一个节点。
逻辑算法又称布尔运算,通常用来键旦陆测试真假值,由于布迟祥尔在符号逻辑运算中的特殊贡献,很多计算机语言中将逻辑运算称为布尔运算,用来判断是否该离开循环或继续执行循环内的指令,并由二维逻辑运算发展到三维图形的逻辑运算。

热点内容
电脑配置够但为什么打lol掉帧 发布:2025-02-01 01:37:08 浏览:315
21款朗逸哪个配置比较划算 发布:2025-02-01 01:35:32 浏览:975
建筑动画片脚本 发布:2025-02-01 01:35:21 浏览:469
管家婆如何用阿里云服务器 发布:2025-02-01 01:29:09 浏览:648
解压耳放 发布:2025-02-01 01:20:18 浏览:175
cars算法 发布:2025-02-01 01:02:26 浏览:176
数据库超载 发布:2025-02-01 00:57:15 浏览:32
fgo安卓如何玩日服 发布:2025-02-01 00:49:40 浏览:715
sql2000服务管理器 发布:2025-02-01 00:48:02 浏览:678
荣耀畅玩什么配置 发布:2025-02-01 00:36:35 浏览:458