- 44
- 0
- 约1.13万字
- 约 41页
- 2018-05-13 发布于浙江
- 举报
第九章分支-限界法 9.1 一般方法 分支-限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。但二者搜索方式不同。 分支-限界法 生成当前E-结点全部儿子之后,再生成其他活结点的儿子, 使用限界函数帮助避免生成不包含答案结点子树的状态空间 根据对状态空间数中结点检索次序的不同,可将分支-限界的设计策略分为: FIFO检索,活结点采用一张先进先出表(队列) LIFO检索,活结点采用一张先进后出表(堆栈) 例9.1 4-皇后问题 例9.1 4-皇后问题 9.1.1 LC-检索 问题: 在LIFO和FIFO分支-限界法中,对下一个E-节点的选择规则相当死板,在某种意义上是盲目的。对于可能快速检索到答案结点的结点没有给出任何优先权。 解决: 对活结点使用一个“有智力的”排序函数c(.)来选取下一个E-结点,往往可以加快到达一答案结点的速度。 9.1.1 LC-检索 要对活结点计算优先次序,必然要附加计算工作,即付出代价。对于任意结点X,要付出的代价可以用两种标准来度量: 9.1.1 LC-检索 c(.):“有智力的”排序函数,称为“节点的成本函数”: 状态空间树的根结点到X的成本 若X是答案结点 c(X)= ? 若X不是答案结点且子树X不包含任何答案结点 子树X中具有最小成本的答案结点的成本 否则 Note:要得到结点成本函数c(.)所用的计算工作量与解原问题具有相同的复杂度,所以要得到精确的成本函数一般是不现实的。 9.1.1 LC-检索 解决:在算法中检测活结点的次序通常根据能大致估计结点成本的函数?(.)来排出。 ?(X): 由X到达一个答案结点所需做的附加工作的估计函数。 单纯使用函数?(.)会导致算法偏向于做纵深检查。 若?(.)=c(X),可以用最小成本达到离根最近的答案结点,其它子树的结点无需生成。 但通常情况下, ?(X)只是精确成本的一个估计值,因此偏于纵深检查可能会丢失掉更靠近根的答案结点。导致结果不理想。 9.1.1 LC-检索 改进: 不仅考虑结点X到一个答案结点的估计成本值?(.),还应考虑由根结点到结点X的成本h(X) ?(X)=f(h(X))+ ?(X) f(.)是一个非降函数,使f(.)不等于0,可以减少算法作偏向于纵深检查的可能性,使算法优先检索更靠近答案结点且又离根较近的结点。 9.1.1 LC-检索 9.1.2 15-谜问题 9.1.2 15-谜问题 9.1.2 15-谜问题 9.1.2 15-谜问题 9.1.2 15-谜问题 尝试1:FIFO,找到离根最近的答案结点,但移动是千篇一律的,检索是呆板而盲目的。 尝试2:深度优先,不管开始格局如何,总是采取由根开始的那条最左路径,有可能远离目标。 尝试3:具有一定“智能”的检索方法。 给状态空间树的每个结点X赋予一定的成本值c(X):由根出发到最近目标结点路径上的每个结点X赋予这条路径长度作为他们的成本值,其余结点的成本值赋予?。 9.1.2 15-谜问题 切合实际的做法:给出一个便于计算成本估计值的函数?(X)=f(X)+?(X) , f(X):由根到结点X的路径长度 ?(X):以X为根的子树中由X到目标状态的一条最短路径长度的估计值。 因此, ?(X)至少应是能把状态X转换成目标状态所需的最小移动数。 一种可能的选择: ?(X) =不在其目标位置的非空白牌数目 9.1.3 LC-检索的抽象化控制 设T是一棵状态空间树,c(.)是T中结点的成本函数。如果c(X)是根为X的子树中任一答案结点的最小成本,则c(T)是T中最小成本答案结点的成本。 由于函数c(.)不容易实现,所以使用一个对c(.)估值的启发性函数?(.) 来代替。 这个启发函数应易于计算并具有如下性质:如果X是一个答案结点或者是一个叶结点,则c(X)=? (X)。 算法9.1 LC-检索 Line procedure LC(T,?) if T是答案结点 then 输出T; return end if E?T // E-结点 // 将活结点表初始化为空 loop for E 的每个儿子X do if X是答案结点 then 输出从X到T的那条路径 return; end if call ADD(X) // X是新的活结点 // PARENT(X)?E repeat if 不再有活结点 then print(‘no answer node
原创力文档

文档评论(0)