纯文字总结,不会涉及具体代码。
A*寻路,其实本质上就是Dijkstra寻路的一种加料版。
所以,可以先看看什么是Dijkstra寻路。
此寻路中,连通的节点间存在着通过的消耗值(泥泞的土地消耗就比平坦的道具大)
而节点本身拥有一个代表从起点到此节点本身之间所有的消耗值。
流程如下:
每次观察当前节点周围可抵达的节点,计算并赋予每个邻居他的消耗总值(当前节点的总消耗加上通过的消耗),并把他们加入一个待选集合(算法从来没有观察到过的邻居节点总是需要加入的,或者是第二次被当作了邻居节点且花费比上次少时)(集合一般是优先队列)
下一次从集合中拿出一个总花费最少的节点,重复以上步骤(基于这样一个事实,当前可能的最佳路径永远是从当前花费最少的节点开始的),直到邻居节点中出现了终点。
而A*加料版只是在节点被加入待选集合时,给他再加上另一个参考值,也就是该节点与终点横纵坐标的差的和。(直观上过滤掉了明显反向于终点的可选节点)
而所谓的广度优先,深度优先搜索,其实就是这种寻路的特化版:
不考虑权重且
广度优先的待选节点集合为队列 / 深度优先的待选节点集合为栈