问题求解
- 状态空间表示
- 状态改变:算符和重写规则
状态空间搜索方法
- BF–Breadth First
open表 close表
open表是一个队列,close起记录的作用 - DF–Depth First
open表是一个栈
深度限制 - (和数据结构里学的一个不同是,数据结构中强调被访问过就不再访问,就没有找父节点判断是否是祖先的问题)
- 等费用搜索
BF的推广,在每一层的时候,选择队列中费用最小的路径扩展
找到到目标节点G的最短路径–发展G的一个子节点时停止 - 爬山法
扩展open表中距离目标节点的结点(曼哈顿距离)
连续问题上适合单峰函数的寻优,因为它强调每次的下一步都比当前这步要离目标节点更近(局部最优)。 - 启发式搜索
- 优先考虑最有希望的节点加以扩展
- 考虑已经走过的路和距离目标节点的路的总的带价值
- A*算法中注意事项:
如果当前待加入的节点 ni 已经在open表中,则比较 f(ni) ,若新节点的比较小,则代替原来节点,改变指针方向
如果当前待加入的节点 ni 已经在close表中,则比较,若新节点的比较小,则把该节点移回open表
不注意这点会导致内存占用大(open表长)以及算法复杂度高。
- BF–Breadth First
算法的性质
- 完备性
- 可采纳性
- 影响A*算法搜索性能的因素
- 扩展节点数目
- h(n) 的计算量
算法举例:重排九宫
h(n)=P(n)+3S(n)
- P(n) 是每一张牌距离其目标位置的距离的和
-
S(n)
是所有牌的分数之和。
- 对于非中心位置的牌 i <script type="math/tex" id="MathJax-Element-5">i</script>,顺着一个方向检查,如果其后面的牌和目标状态中相应牌之间顺序不一致,则给分数2,否则给分数0
- 中心有牌给分1,没牌给分0