A* 暂时想法

  A*=BFS+排序

  目前看的关于A*的想法正如上面所表示的,首先谈下BFS,BFS的话任何一本数据结构书上总该会提到了吧。BFS是从一个点出发然后层层的展开,然后就会得到一个由起始点到目的点最近的路径。A*首先还是基于这个想法的,但是同时改进。

  先复习下BFS,对于BFS是从一个点开始展开然后遍历。我们可以把遍历的结果看成是一颗树的层次遍历,对于每一层就是BFS在每个一定的步长的条件下能走到的节点。从这里来想关于树的遍历,从根节点出发遍历该节点的孩子节点。然后来看,A*的重心:对于孩子能够走到的节点进行排序,优先走对于目标更优的节点

  与BFS不同的是,在接下来的处理中,A*对于新加入的节点是一视同仁的,不会有先加入和后加入的区别,但是对于所有的节点要考虑的是该节点对于到达目标来说是否更优

  我理解的A*:

  

  1.从遍历中取出当前花费最优的元素

  2.将直接能访问到的节点放入遍历中,这步与BFS类似,遍历当前节点的周围的元素

    ①如果发现周围的元素T已经在遍历中的集合中,那么就考虑如果通过当前节点会不会使得达到T的花费更小,如果更小则更新更小的费用

    ②如果发现周围的元素T在未遍历的集合中,那么就将元素T放入到遍历中的集合中

    ③如果发现周围的元素T在已遍历的集合中,那么就不考虑元素T

  3.将这个最优元素放入已遍历的集合中,重复上述过程直到找到目标或者遍历结束

  

  对于A*中的花费的定义,f=g+h

  f:总的花费

  g:到达这个点的花费,可以认为是步数、层数、路径上的阻碍等等……

  h:对当前节点到达目标节点的花费的预计,可以粗略的预计,比如:曼哈顿距离,或者是自己定义的耗费。但是h<=h',h'是什么?h'就是实际的耗费,但是实际的耗费谁知道呢……可能h'很复杂,但是我们可以自己定义个简单的h来代替h'使用。

  

posted @ 2014-12-30 19:59  YORU  阅读(162)  评论(0编辑  收藏  举报