下载
下载
第1 7章 分 枝 定 界
任何美好的事情都有结束的时候。现在我们学习的是本书的最后一章。幸运的是,本章用
到的大部分概念在前面各章中已作了介绍。类似于回溯法,分枝定界法在搜索解空间时,也经
常使用树形结构来组织解空间(常用的树结构是第 1 6章所介绍的子集树和排列树)。然而与回
溯法不同的是,回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先或最小耗
费方法来搜索这些树。本章与第 1 6章所考察的应用完全相同,因此,可以很容易比较回溯法与
分枝定界法的异同。
相对而言,分枝定界算法的解空间比回溯法大得多,因此当内存容量有限时,回溯法成功
的可能性更大。
17.1 算法思想
分枝定界(branch and bound )是另一种系统地搜索解空间的方法,它与回溯法的主要区
别在于对E-节点的扩充方式。每个活节点有且仅有一次机会变成 E-节点。当一个节点变为 E-
节点时,则生成从该节点移动一步即可到达的所有新节点。在生成的节点中,抛弃那些不可
能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一
个E-节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过
程才结束。
有两种常用的方法可用来选择下一个E-节点(虽然也可能存在其他的方法):
1) 先进先出(F I F O ) 即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活节
点表的性质与队列相同。
2) 最小耗费或最大收益法 在这种模式中,每个节点都有一个对应的耗费或收益。如果查
找一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个 E-节点就是具有最小耗费
的活节点;如果希望搜索一个具有最大收益的解,则可用最大堆来构造活节点表,下一个 E-
节点是具有最大收益的活节点。
例17-1 [迷宫老鼠] 考察图16-3a 给出的迷宫老鼠例子和图 1 6 - 1的解空间结构。使用F I F O分枝
定界,初始时取( 1,1)作为E-节点且活动队列为空。迷宫的位置( 1 , 1)被置为1,以免再次
返回到这个位置。(1,1)被扩充,它的相邻节点( 1,2 )和(2 ,1)加入到队列中(即活节
点表)。为避免再次回到这两个位置,将位置( 1,2 )和(2 ,1)置为1。此时迷宫如图1 7 - 1 a
所示,E-节点( 1,1)被删除。
1 1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 0 0
a ) b ) c )
图17-1 迷宫问题的F I F O分枝定界方法
第 1 7章 分 枝 定 界 5 1 7
下载
节点(1,2 )从队列中移出并被扩充。检查它的三个相邻节点(见图1 6 - 1的解空间),只有
(1,3 )是可行的移动(剩余的两个节点是障碍节点),将其加入队列,并把相应的迷宫位置置
为1,所得到的迷宫状态如图 17-1b 所示。节点( 1,2 )被删除,而下一个E-节点(2 ,1)将
会被取出,当此节点被展开时,节点(3,1)被加入队列中,节点(3,1)被置为1,节点(2 ,
1)被删除,所得到的迷宫如图17-1c 所示。此时队列中包含( 1,3 )和(3,1)两个节点。随
后节点(1,3 )变成下一个E-节点,由于此节点不能到达任何新的节点,所以此节点即被删除,
节点(3 ,1)成为新的E-节点,将队列清空。节点( 3 ,1)展开,(3 ,2 )被加入队列中,而
(3,1)被删除。(3 ,2 )变为新的E-节点,展开此节点后,到达节点(3,3 ),即迷宫的出口。
使用F I F O搜索,总能找出从迷宫入口到出