赞
踩
A*搜索是启发式搜索的代表,其使用f(n) = g(n) +w h(n) 作为估价函数。其中g(n)为从初始状态到当前状态的成本,h(n)为从当前结点到目标结点的估计成本,即启发式函数。在搜索时,通过计算估价函数值,选择较优的路径,从而达到剪枝的目的(因为A*搜索是基于BFS实现的)。在实现时,我们一般使用OPEN表和CLOSED表,其中OPEN表用来存储待扩展的状态,CLOSED 表用来存储已经扩展的状态。在扩展状态时,通过遍历OPEN表和CLOSED 表,从而避免生成重复状态。在实现时,我们通过调整w值,对搜索的倾向进行调整。从相关研究上看,当w值随着搜索深度的增加而减小时,搜索的效果会比较好。也就是说,我们在搜索较浅的时候,应尽量使用启发值,在搜索较深的时候更倾向与BFS,以保证得到一个到达目标状态的路径。
以下是A*搜索的算法:
初始化OPEN表(优先队列)
初始化CLOSED表
将初始状态存入OPEN表
WHILE OPEN不为空
从OPEN表中取出最佳结点(即f值最小的结点)(PARENT)
如果PARENT是目标结点,程序结束
将PARENT存入CLOSED表中
对PARENT进行扩展(ADJ_NODE)
如果ADJ_NODE在CLOSED 表中
舍弃ADJ_NODE,并进行下一哥扩展
如果ADJ_NODE在OPEN 表中
比较两者g值,如果比OPEN表中优
抛弃OPEN表中结点
计算ADJ_NODE的f,g,h值
修改状态的父亲结点,为PARENT
将ADJ_NODEF放入OPEN表中
进入下次循环
否则,计算ADJ_NODE的f,h值
设置ADJ_NODE的父亲结点为PARENT
将ADJ_NODE放入OPEN表中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。