Beam搜素算法

Beam搜素算法的伪代码(Beam Search Algorithm)
Beam算法是干什么的?他是搜索算法。大家知道,搜索算法可谓万能算法,问题只要有解,使用搜索算法在问题的解空间中搜索解,总可以找到问题的解。典型的搜索算法使用open表记录待搜索的状态,close表记录已经考察过的状态。BEAM算法中使用一个容量受限的open表,这里称作BEAM存储待搜索状态。具体算法如下,请看伪代码:
/*初始化 */
g = 0;//步数
hash_table = { start };//hash表,用于标记所有已经访问过的节点。类似于close表
BEAM = { start };//BEAM 一个容量受限的open表,也就是在初始化时,需要指定open表的容量


while(BEAM ≠ ∅){// 循环直到BEAM为空,也就是没有需要考察的节点了
  SET = ∅;// 设置集合为空

  for(each state in BEAM){ //对于BEAM中的每个状态state
    for(each successor of state){ // 对于state的每个后继successor
      if(successor == goal) return g + 1;// 如果后继就是目标节点,那么找到了一个路径。
      SET = SET ∪ { successor }; // 否则,后继加入到集合中
    }
  }//for

  BEAM = ∅; // 因为open表中的内容已经处理完毕,清空open表
  g = g + 1; // 又访问了一层

  /* fill the BEAM for the next loop */
  while((SET ≠ ∅) AND (B > |BEAM|)){ // 集合不空并且open表没有满 BEAM是容量为B的open表
    state = successor in SET with smallest h value; //从集合中选出最好的点 h参考备注1
    SET = SET \ { state }; // 从集合中删除该节点
    if(state ∉ hash_table){ // 该状态还没有考察过 则state不在hash_table中
      if(hash_table is full) return ∞; // hash表满了 算法已经没法执行下去 当然没能找到路径
      hash_table = hash_table ∪ { state }; //state已经考虑过 添加到hash_table中
      BEAM = BEAM ∪ { state }; //state添加到BEAM中等待判断
    }//if
  }//while


// 注意 有可能集合不空 但是BEAM已经满了
// 根据算法 集合会被清空 集合中的点将不再考虑
// 因此该算法不是完备的
// 也就是说 有可能原问题有解,但是由于这里舍弃了一些中间过程
// 导致最终无法获得解


}//while

// goal was not found, and BEAM is empty - Beam Search failed to find the goal
return ∞;//没能找到路径 
该算法和常用的搜索算法不同的是限制了open表的容量。如果能够找到解,那么这个方法会比普通方法速度快。但是这个算法不是完备的。既然不完备了为什么还要提出这个算法呢?我们发下之所以不完备是因为BEAM的容量有限。如果我们有一个容量无限的open表,那么显然该算法和普通的搜素算法等价了。我们不能乐观认为我们有一个容量无限的open表,这个受到计算机寻址空间限制。我们的open表总是有限的。因此该算法的思路就是当资源有限时,我们尽力寻找解。因为资源有限,因此普通的搜索算法也只能是理论上的,实际中还是一个BEAM算法。该算法还有一个好处是,尽早的进行了剪枝,BEAM中的状态都是可能性比较大的,因此在资源有限的时候有可能解决普通搜索算法无法完成的任务。

综上,BEAM算法是在资源受限系统上运行的,处理大规模搜索问题的算法。
原文参考 点击打开链接
备注 1 忘了h的定义了。是从开始到当前节点的代价,还是从当前节点到目标的估计代价。忘了,=_=!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值