A*寻路算法就是启发式探索的一个典型实践,在寻路的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中是采取估计值优先原则,估计值更优的节点会被优先遍历。
如下图区域,被简化成6*6的小方格。其中绿色表示起点,红色表示终点,黑色表示路障,不能通行。
先描述A*算法的大致过程:
- 将初始节点放入到open列表中。
- 判断open列表。如果为空,则搜索失败。如果open列表中存在目标节点,则搜索成功。
- 从open列表中取出F值最小的节点作为当前节点,并将其加入到close列表中。
- 计算当前节点的相邻的所有可到达节点,生成一组子节点。对于每一个子节点:
- 如果该节点在close列表中,则丢弃它
- 如果该节点在open列表中,则检查其通过当前节点计算得到的F值是否更小,如果更小则更新其F值,并将其父节点设置为当前节点。
- 如果该节点不在open列表中,则将其加入到open列表,并计算F值,设置其父节点为当前节点。
- 转到2步骤
概括:
1、两个集合+一个公式
* openlist\closelist --- 集合
* F=G+H --- 公式
* openlist:可达到的格子
* closelist:已经到达的格子
* G:从起点到当前格子的成本
* H:不考虑障碍的情况下,当前格子到目标格子的距离
* F:G+H
代码如下:
package com.wemew.wmgame.s