写点什么

49 | 搜索:如何用 A* 搜索算法实现游戏中的寻路功能

作者:鲁米
  • 2023-12-15
    北京
  • 本文字数:2159 字

    阅读完需:约 7 分钟

启发式搜索算法


启发式搜索算法(Heuristic Search Algorithm)是一种通过使用启发式函数(heuristic function)来引导搜索过程,以尽可能高效地找到问题的解决方案的算法。这种算法通常应用于在大规模的搜索空间中寻找解决方案的问题,例如路径规划、游戏策略、优化问题等。


启发式函数是一种评估函数,用于估计从当前状态到目标状态的代价或距离。这个函数提供了一种启发性的估计,即尽管它可能不是精确的,但它可以帮助算法更智能地选择下一步要探索的方向。启发式函数通常基于问题的特定知识,并且设计得越好,算法搜索到解决方案的效率就越高。


一种常见的启发式搜索算法是 A 算法(A-star algorithm)。A 算法使用了一个估价函数(f(n) = g(n) + h(n))来确定每个节点的搜索顺序,其中:


  • g(n) 是从起始节点到节点 n 的实际代价;

  • h(n) 是从节点 n 到目标节点的启发式估计代价;

  • f(n) 是综合考虑实际代价和启发式估计的总代价。


A*算法以 f(n) 的值为优先级进行搜索,以期望优先选择总代价较小的路径。

1. IDA 算法(Iterative Deepening A Algorithm)**

简要介绍:IDA 是一种迭代深化的启发式搜索算法,它结合了深度优先搜索和 A 算法的思想。IDA*在每一轮迭代中限制搜索深度,逐渐增加深度,以寻找问题的解。


应用领域问题:


  • 路径规划问题: 用于在图或网络中寻找最短路径。

  • 谜题解决: 例如八数码、十五数码等谜题的解决。

2. 蚁群算法(Ant Colony Optimization)

简要介绍:蚁群算法是受到蚂蚁寻找食物路径行为启发的一种优化算法。通过模拟蚂蚁在搜索空间中的行为,算法能够找到全局最优解。


应用领域问题:


  • 旅行商问题(TSP): 寻找最短路径以访问一组城市。

  • 调度问题: 如任务调度、车辆路径规划等。

3. 遗传算法(Genetic Algorithm)

简要介绍:遗传算法是一种模拟生物进化过程的搜索算法,通过模拟自然选择、交叉和变异等过程来寻找问题的解。


应用领域问题:


  • 优化问题: 如函数优化、参数调优等。

  • 机器学习: 用于特征选择、神经网络权重优化等。

4. 模拟退火算法(Simulated Annealing)

简要介绍:模拟退火算法模拟固体退火的过程,通过在搜索空间中以概率接受较差解,避免陷入局部最优解。


应用领域问题:


  • 旅行商问题: 在 TSP 中寻找较优解。

  • 参数优化: 在机器学习中进行模型参数优化。

5.其他算法及应用领域问题:
  • 人工神经网络(ANN): 应用于模式识别、分类、回归等。

  • K 最近邻算法(K-Nearest Neighbors): 用于分类和回归问题。

  • 决策树算法: 适用于分类和回归问题,如随机森林。

  • 支持向量机(Support Vector Machine,SVM): 用于分类和回归。

  • 聚类算法(如 K 均值聚类): 用于数据分组。


我们之前讲的“迷宫问题”是否可以借助 A 算法来更快速地找到一个走出去的路线呢?如果可以,请具体讲讲该怎么来做;如果不可以,请说说原因。*


是的,A 算法是解决迷宫问题(Maze Problem)的一种有效方法,它可以帮助更快速地找到一个走出去的路线。A 算法结合了广度优先搜索和启发式搜索,通过估算每个节点到目标的代价来引导搜索,从而提高了搜索效率。


以下是使用 A*算法解决迷宫问题的一般步骤:


  1. 定义节点表示: 将迷宫中的每个格子作为一个节点。节点包括位置坐标、与起点的实际代价(通常是到达该节点的步数),以及到目标的启发式代价(通常是使用曼哈顿距离或欧几里得距离)。

  2. 初始化起点和目标: 将起点加入开放列表(open list),设置其实际代价为 0,并计算启发式代价。将目标设定为终点。

  3. 循环搜索: 重复以下步骤直到找到目标或开放列表为空:

  4. 从开放列表中选择具有最小总代价的节点。

  5. 将该节点标记为已访问,并从开放列表中移除。

  6. 如果该节点是目标节点,搜索结束,回溯路径。

  7. 否则,扩展该节点,将其邻居加入开放列表,并更新它们的实际代价和启发式代价。

  8. 回溯路径: 当找到目标节点后,通过回溯从目标到起点的路径。这就是迷宫的解。


A*算法之所以在迷宫问题中效果好,是因为它有效地在搜索空间中引导了搜索,通过评估每个节点的代价,更有可能优先选择离目标更近的路径。这种启发式搜索方法在解决迷宫问题等路径规划任务中表现出色。

6.曼哈顿距离 和 欧几里得距离的区别

曼哈顿距离(Manhattan Distance)和欧几里得距离(Euclidean Distance)是两种常用于测量空间中点之间距离的方法,它们有一些区别:


  1. 曼哈顿距离:

  2. 也称为 L1 范数或城市街区距离。

  3. 计算两点之间沿着坐标轴的距离总和。

  4. 在二维平面上,曼哈顿距离等于从一个点沿着水平和垂直方向移动到另一个点所需的步数。

  5. 曼哈顿距离的计算公式:$$

  6. 欧几里得距离:

  7. 也称为 L2 范数。

  8. 计算两点之间的直线距离,即最短路径的长度。

  9. 在二维平面上,欧几里得距离等于两点之间的直线距离。

  10. 欧几里得距离的计算公式:$$


在二维空间中,可以通过以下图示来理解这两种距离的差异:


   |         .   |         .   |         .   |         .   |         .    |         .           M (4,5)   |         .         /   |         .       /   |         .     /   |         .   /   |         . /   |         /   |-------------------------   |         .         E (1,2)   |         .          |   |         .          |   |         .          |   |         .          |   |         .          |   |         .          |
复制代码


用户头像

鲁米

关注

生活黑客35 2019-06-11 加入

起点不重要,迭代很重要,就需要保持充分的开放和积累;而信息越充分,结果越可靠,又要求随时调整、不断逼近真相。

评论

发布
暂无评论
49 | 搜索:如何用A*搜索算法实现游戏中的寻路功能_鲁米_InfoQ写作社区