各类寻路算法的可视化比较(A*,广度,深度及优化)

获取程序地址

相关基础知识:
https://blog.csdn.net/hitwhylz/article/details/23089415
https://blog.csdn.net/qq_41325698/article/details/81874529

在学习游戏迷宫生成算法的时候涉及到了很多数据结构问题,为此三胖写了可视化工具辅助记忆。
地图点击可以切换道路(白色)或墙板(灰色),点击开始寻路即可显示路径(指向父节点)

深度优先遍历

有人说深度优先搜索就是递归
就是上下左右能走就走,走不了则从上一个可以走的节点继续走,不一定是最优解
各类寻路算法的可视化比较(A*,广度,深度及优化)_第1张图片

核心思路:

  1. 创建大小相同二维数组保存路径是否走过
  2. 递归或循环按照上下左右任意排序进行下一个可走节点的查找
  3. 无解情况为递归或循环结束仍未找到节点

优化思路:

已经走过的路还是可以走,每个走过的节点记录到起点已经走了多少步(即上一个节点到起点已经走的路+1),如果第二次走到相同节点,此时计算已走长度如果减小则修改父节点为新的上一步节点,但会增加计算量
各类寻路算法的可视化比较(A*,广度,深度及优化)_第2张图片

广度优先遍历

有人说广度优先算法就是使用队列的一种搜索方法,查找路径最短且低效
各类寻路算法的可视化比较(A*,广度,深度及优化)_第3张图片

核心思路:

  1. 创建队列用于保存可以用于判定节点
  2. 队列取出节点,获取附近节点加入队列
  3. 搜索过程出现目标节点则结束查找
  4. 队列为空表示无法到达目的点
  5. 由于广度优先以上特性,广度优先寻路过程很像漾开的菱形水波

A*算法

在广度优先的基础上,A*进行了优化,巧妙利用G=F+H的方式来获取下一次行走的"可能最优解"
各类寻路算法的可视化比较(A*,广度,深度及优化)_第4张图片

核心思路:

  1. 创建arraylist替换广度优先的队列,因为list可以实现接口获取G权重最小的点
  2. 起始点加入list,获取周围可走节点加入list,且设置起始点不可再走
  3. list取出权重最小的节点,获取周围可走节点加入list,设置该节点不可走
  4. 在获取周围节点的过程中,周围某个节点已经存在于list中,此时对比G值是否降低,降低则更新节点父节点为自身
  5. 最终list中没有目标节点则无解
  6. 若有解则从目标节点依次寻找父节点完成搜索

优化思路:

二叉堆,这个在下一次的树系列可视化文章中会有更加详细介绍,目的是解决获取list最小权重的问题,核心思路即每次获取新的节点保障G最小的节点在二叉堆顶端

你可能感兴趣的:(RougeLike游戏开发)