一、回溯法的基本思想
在问题的解空间树中,按深度优先策略,从根节点出发搜素解空间树。算法搜素至解空间树的任一结点时,先判断该结点是否包含问题的解,如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先策略搜索。回溯法求解问题时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。回溯法求解的一个解时,只要搜索到问题的一个解就可结束。
(1)解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。
(2)深度优先的问题状态生成法:如果对一个扩展结点 R ,一旦产生了它的一个儿子 C,就把 C 当做新的扩展结点。在完成对子树 C(以 C 为根的子树)的穷尽搜索之后,将 R 重新变成扩展结点,继续生成 R 的下一个儿子(如果存在)。
(3)回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数 (bounding function) 来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。具有限界函数的深度优先生成法称为回溯法。
二、用回溯法求解问题时的主要步骤
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
常用剪枝函数:a. 用约束函数在扩展结点处剪去不满足约束的子树;
b. 用限界函数剪去得不到最优解的子树。
用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。