特别大的地图A*算法优化思路

本文介绍了在游戏地图搜索优化中,如何使用优先队列实现快速搜索、设置深度限制防止卡顿、通过地图瓦块和多线程处理大规模地图、以及路径优化技术如去除Z字路线的方法。
摘要由CSDN通过智能技术生成
  • 搜索优化:

小技巧:

1.openList(用于存放可以搜索的点)使用优先队列来实现。

优先队列(小顶堆):插入一个点的复杂度为O(logN),取出一个最值点复杂度为O(1) 

2.深度限制:有时要搜的路径非常长,利用A*算法搜一次付出的代价很高,造成游戏的卡顿。那么为了保证每次搜索不会超过一定代价,可以设置深度限制,每搜一次则深度+1,搜到一定深度限制还没搜到终点,则返还失败值。

针对大地图优化:

1.把地图瓦块变大减少节点数量。

2.多线程寻路(适用于多个角色同时寻路)。

3.把大地图分块,分成n个小地图:

如果起点和终点相隔几个小地图,那么寻路流程如下:

step1:根据起点和终点的方向算出走出当前小地图出口点,用A*寻路到出口点。

(注:当前小地图出口点也就是要经过的下一个小地图的入口点)

step2:让角色向下一个小地图的入口点移动,(移动的过程中可以继续寻下个小地图的出口路径,或者到达出口点后再寻路)

step3:若下一个小地图不是终点所在的地图,那么把这个入口点作为起点重复step1:根据入口点到终点的方向计算出,当前小地图的出口点,用A*找到出口点的路径。

若一个小地图是终点所在小地图那么就再用A*寻路到终点即可。

可以走到每个小地图的入口点后再对这个小地图的出口寻路

  • 路径优化(优化Z字路线):

A*算法执行完之后找到一条路径,我们可以对这条路径进行优化:

1.如果中间的路径点四面八方都是可达的,那边可以去掉这个节点:如下图这跟红线就是优化后的路线,蓝线是A*算出来的路径

2.每个节点加一个方向属性(从上一个点到这个点的方向)如果相邻两多个节点方向相同则可以过滤调中间的节点。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: a*算法是一种常用于栅格路径规划的启发式搜索算法。它基于启发式估计函数来评估每个节点的优先级,以找到最佳路径。 a*算法栅格路径规划代码主要包括以下几个步骤: 1. 创建一个二维栅格地图,其中包含起始点和目标点,并标记障碍物或不可行走区域。 2. 初始化开放列表和关闭列表。开放列表用于存储待扩展的节点,关闭列表用于存储已经扩展过的节点。 3. 将起始点加入到开放列表,并设置起始点的代价和启发式估计值。 4. 当开放列表不为空时,进行以下操作: - 从开放列表中选择具有最小代价的节点作为当前节点。 - 如果当前节点是目标节点,则路径已找到。 - 将当前节点从开放列表移到关闭列表。 - 对当前节点的邻居节点进行遍历,计算每个邻居节点的代价和启发式估计值,并更新其父节点和总代价。 - 如果邻居节点已经在开放列表中,检查是否有更优的路径,如果有则更新其父节点和总代价。 - 如果邻居节点不在开放列表中,则将其添加到开放列表。 5. 如果开放列表为空但还未找到目标节点,则表示无法到达目标点,搜索失败。 6. 从目标点开始,通过父节点逐步回溯到起始点,即可获得最佳路径。 以上是a*算法栅格路径规划代码的基本过程。在具体的实现中,还可添加一些优化措施,如避免重复扩展节点、使用二叉堆来加速节点查找等,以提高搜索效率和减少内存占用。 ### 回答2: a*算法是一种广泛应用于栅格路径规划的搜索算法。它通过综合考虑启发式函数和已知距离来选取下一步最优的节点,以达到目标位置。 在栅格路径规划代码中,首先需要建立一个矩阵表示地图,每个格子的值表示该位置的可通行状态。接着定义节点类以及启发式函数。节点类包含了节点位置、已知距离、总距离等属性,启发式函数基于当前节点和目标节点的距离来评估下一个节点的优先级。 然后,定义a*算法函数,该函数输入起始节点和目标节点,并返回最优路径。在函数内部,首先创建一个优先队列用于存储待扩展的节点。然后,将起始节点加入队列并标记为已访问。进入循环,直到队列为空或者达到目标位置为止。在每次循环中,首先从队列中取出优先级最高的节点。如果该节点为目标节点,则路径找到。否则,通过遍历上下左右四个方向的相邻节点,计算新的已知距离和总距离,然后将新节点加入队列中。 最后,回溯从起始节点到目标节点的路径。根据节点的父节点指针,反向遍历找到路径上的节点,并将其保存到一个列表中。最后,返回该列表作为最优路径。 总而言之,a*算法栅格路径规划代码是通过综合考虑启发式函数和已知距离来选取下一步最优的节点,以找到起始节点到目标节点的最优路径。其基本流程包括建立地图矩阵、定义节点类和启发式函数、实现a*算法函数以及回溯最优路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值