双向广搜(内含八数码题解
双向广度优先搜索算法的步骤如下:
1)定义状态结点
与广度优先搜索算法相同。
2)确定结点扩展规则
与广度优先搜索算法也相同。但需要定义两个队列,一个存储(从初始结点向目标结点)正向扩展的结点,另一个存储(从目标结点向初始结点)反向扩展的结点。
3)搜索策略
(1)从正向扩展的队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。
(2)检查新生成的结点,看它是否已在正向扩展的队列中存在,如果新结点已经在队列中出现过,就放弃这个结点。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。
(3)检查新结点是否在反向扩展的队列中出现过,如果是,则两个队列在新结点处相遇,搜索成功,程序结束;若新不是,则继续。
(4)对反向扩展的队列按(1)、(2)、(3)的步骤进行相同的处理。
(5)未找到目标结点(两个队列位相遇)时回到第(1)步,再从队列头取出结点进行扩展......。
1)定义状态结点
与广度优先搜索算法相同。
2)确定结点扩展规则
与广度优先搜索算法也相同。但需要定义两个队列,一个存储(从初始结点向目标结点)正向扩展的结点,另一个存储(从目标结点向初始结点)反向扩展的结点。
3)搜索策略
(1)从正向扩展的队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。
(2)检查新生成的结点,看它是否已在正向扩展的队列中存在,如果新结点已经在队列中出现过,就放弃这个结点。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。
(3)检查新结点是否在反向扩展的队列中出现过,如果是,则两个队列在新结点处相遇,搜索成功,程序结束;若新不是,则继续。
(4)对反向扩展的队列按(1)、(2)、(3)的步骤进行相同的处理。
(5)未找到目标结点(两个队列位相遇)时回到第(1)步,再从队列头取出结点进行扩展......。
这篇博客也不错的:搜索入门
(脑阔疼 T_T
Orz