A*寻路算法

A*寻路算法

A*寻路算是游戏开发中很常见的一种寻路算法,网络上相关的介绍也非常多,这次从其他寻路算法谈起,来看一看A星算法是如何诞生的,本文所有寻路算法使用TypeScript实现

算法默认权重不为负数

广度优先搜索

广度优先搜索,就如同洪水一样,从搜索起点不断往外扩张

搜索实现

  1. 构建一个搜索队列searchList,列表中的节点就是等待搜索的节点,初始化时将起点加入到列表中; 构建一个searchRecord记录被搜索过的节点
  2. 从searchList搜索队列中取出一个节点,获取到该节点的临近节点(这里取上下左右4个节点),若临近节点没有被搜索过,将临近节点加入到searchList中
  3. 重复步骤2,直到搜索完所有节点

提前结束

上面的搜索步骤是地图中所有节点进行遍历,实际上寻路都存在一个或多个目标,当搜索到目标就可以停止算法,避免不必要的查询

关于searchRecord

serachRecord用来记录搜索过的节点,当寻找到最终目标,最终的搜索路径就通过serachRecord构建出来, 我这里使用的是一个Dictionay来实现的,key是由节点的xy值构成的一个字符串,以表示一个唯一的节点,
比如,当我们以(5,5)为起点,[(4, 5), (5, 4), (5, 6), (6, 5)]这四个点将会被搜索,那么searchReocrd的结构就是这样的

searchRecord = {
    '4_5': Node(5, 5),
    '5_4': Node(5, 5),
    '5_6': Node(5, 5),
    '6_5': Node(5, 5)
}

这样的结构表明了key与value的父子关系: (5, 5) -> (4, 5), 当搜索继续下去,可能会出现下面的结果

searchRecord = {
    '4_5': Node(5, 5),
    '3_5': Node(4, 5),
    '2_5': Node(3, 5),
    '1_5': Node(2, 5),
    ......
}

假如(1, 5)是我们的终点,那么根据searchRecord我们可以轻松构建出最终的搜索路径: (5, 5) -> (4, 5) -> (3, 5) -> (2, 5) -> (1, 5)
在这里插入图片描述

核心代码实现

    let searchQueue: Array<Node> = [star
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A*寻路算法是一种常用的路径搜索算法,通过对搜索空间中的节点进行评估和排序,可以找到最优路径。它结合了启发式搜索和贪婪搜索的思想,具有高效性和准确性。 算法的核心思想是通过使用一个启发函数,对每个节点进行估价,以选择最有希望的节点进行搜索。启发函数一般使用曼哈顿距离或欧几里得距离来评估节点与目标节点的距离。同时,A*算法还维护了一个开放列表和一个关闭列表,用于保存已搜索和待搜索的节点。 首先,将起点节点加入到开放列表中,并初始化各个节点的启发函数值和代价值。然后,从开放列表中选取具有最小代价值的节点,进行扩展。扩展过程中,评估每个相邻节点的代价值,并更新节点的父节点和代价值。将扩展完成的节点加入到关闭列表中。 重复上述步骤,直到找到目标节点或者开放列表为空。如果找到目标节点,可以通过回溯从目标节点到起点节点,得到最优路径。如果开放列表为空,则表示无法找到路径。 以下是使用Python实现A*寻路算法的基本步骤: 1. 定义节点类,包括节点坐标、启发函数值、代价值等属性,并实现比较运算符以便排序。 2. 初始化起点节点和目标节点,并将起点节点加入到开放列表中。 3. 进入循环,遍历开放列表中的节点。 4. 从开放列表中选取代价值最小的节点,并将其从开放列表中移除,加入到关闭列表中。 5. 对选中的节点进行扩展,生成所有相邻节点,并计算它们的代价值和启发函数值。 6. 遍历所有相邻节点,并更新它们的父节点和代价值。 7. 检查相邻节点是否在开放列表或关闭列表中,若不在,则加入开放列表。 8. 重复步骤3到7,直到找到目标节点或开放列表为空。 9. 如果找到目标节点,可以通过回溯从目标节点到起点节点,得到最优路径。 10. 如果开放列表为空,则表示无法找到路径。 总之,A*寻路算法是一种高效而准确的路径搜索算法,通过合理的启发函数和排序策略,可以找到最优路径,并且在实践中常被广泛应用。使用Python实现该算法时,需要定义节点类、初始化起点和目标节点、维护开放列表和关闭列表,并进行节点的评估和更新。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值