搜索——最佳优先搜索

        最佳优先搜索时宽度优先搜索的扩展,基本思想是将节点表按据目标的距离进行排序,再以节点的估计距离为标准选择待扩展的节点。

        算法步骤:
         1. 用N表示已经排序的初始结点表(从小到大)
         2. 如果N为空集,则退出并给出失败信号
         3. n取为N的首结点,并在N中删除结点n,放入已访问结点列表
         4. 如果n为目标结点,则退出并给出成功信号
         5. 否则,将n的后继结点加到N中,记为N’,对N’中的结点按距目标的估计距离排序,并返回2步

          在搜索的过程中一般会用到评估函数f(n),表示从初始节点S经过n到达目的节点t的最佳路径代价f*(n)的估计:

          从S到n的最佳代价g*(n)的估计g(n),g(n) ≥ g*(n),即局部最小≥ 全局最小
          从n到t 的最佳代价h*(n)的估计h(n),若对所有结点n,都有h(n)≤h*(n),则算法A一定能找到一条到达目标结点的最佳路径,此时算法A称为算法A*。

          f(n) = g(n) + h(n)作为f*(n) = g*(n) + h*(n)的估计,估计值越小的点希望越高,应该优先扩展。

 

         图搜索过程(A算法)
         1. 建立一个只由初始结点S组成的搜索图G,open=(S); closed=() 空表
         2. If open为空表then 退出并给出失败信息
         3. n = first(open); remove(n, open); add(n, closed);
         4. If n为目标结点then 退出(成功) (可给出S到n的路径)
         5. 否则,扩展结点n,生成不是n的祖先的后继结点集M={m} 把每个m作为n的后继结点加入G
         6. If m没有在open和closed表中出现过Then add(m, open)
         7. If m在open表中有重复结点k,且g(m)<g(k)Then remove(k,open); add(m, open)
         8. If m在closed表中有重复结点k,且g(m)<g(k) then
                  ①将closed表中的结点k改为结点m(只需修改主链指针和f、g)
                  ②按后继元素,修改k在open表和closed表中的后继元素f,g的值
         9. 按f值,自小到大对open表中的结点重新排序,并返回2步

 

        例:九宫格问题

       在3×3的井子九宫格棋盘上摆有8个将牌,分别标有1-8个数码。棋盘上尚有一个空格,允许其周围的将牌向空格移动。这个通过移动将牌就可以变换将牌的布局。现给定如下两种布局,一种为初始状态,一种为目标状态,问如何移动将牌,以将初始状态变换为目标状态?

       搜索策略
       一、广度优先搜索
              取g(n)=d(n),h(n)=0;其中d(n)为结点n的深度。为了加快搜索进程,目标结点一旦生成就立即放在open表中。需要生成47个结点。


       二、A*算法
            ①取g(n)=d(n),h(n)=w(n),其中w(n)表示以目标为基准,结点n的状态中不在位将牌的个数。由于从结点n转换成目标结点至少需要w(n)步,所以对任意n,恒有

w(n) ≤h*(n)。搜索树见P.85,需生成14个结点。


           ②取g(n)=d(n),h(n)=p(n),其中p(n)表示结点n的每一将牌与其目标位置之间的距离总和。易见, w(n)≤p(n) ≤ h*(n) 。p(n)比w(n)更具启发能力,只需要生成12个结点便可以完成搜索。请自己编程实现。

          

 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值