算法四:回溯和分支界定
回溯:
寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个,在检查完:
所有或部分候选解后,即可找到所需要的解。理论上,当候选解数量有限并且通过检查所有或
部分候选解能够得到所需解时,上述方法是可行的。不过,在实际应用中,很少使用这种方法,
因为候选解的数量通常都非常大(比如指数级,甚至是大数阶乘),即便采用最快的计算机也
只能解决规模很小的问题。
对候选解进行系统检查的方法有多种,其中回溯和分枝定界法是比较常用的两种方法。按
照这两种方法对候选解进行系统检查通常会使问题的求解时间大大减少(无论对于最坏情形
还是对于一般情形)。事实上,这些方法可以使我们避免对很大的候选解集合进行检查,同时
能够保证算法运行结束时可以找到所需要的解。因此,这些方法通常能够用来求解规模很大
的问题。
本章集中阐述回溯方法,这种方法被用来设计货箱装船、背包、最大完备子图、旅行商和
电路板排列问题的求解算法
算法思想
分枝定界(branch and bound)是另一种系统地搜索解空间的方法,它与回溯法的主要区
别在于对E-节点的扩充方式。每个活节点有且仅有一次机会变成E-节点。当一个节点变为E-
节点时,则生成从该节点移动一步即可到达的所有新节点。在生成的节点中,抛弃那些不可
能导出(最优)可行解的节点,其余节点加入活节点表,然后从表中选择一个节点作为下一
个E-节点。从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过
程才结束。
有两种常用的方法可用来选择下一个E-节点(虽然也可能存在其他的方法):
1) 先进先出(F I F O) 即从活节点表中取出节点的顺序与加入节点的顺序相同,因此活节
点表的性质与队列相同。
2) 最小耗费或最大收益法在这种模式中,每个节点都有一个对应的耗费或收益。如果查
找一个具有最小耗费的解,则活节点表可用最小堆来建立,下一个E-节点就是具有最小耗费
的活节点;如果希望搜索一个具有最大收益的解,则可用最大堆来构造活节点表,下一个E-
节点是具有最大收益的活节点。