学习常用算法之(3)回溯法
一、 回溯的基本思想是:
从一个给定的起始位置,我们希望到达一个目的位置。
我们重复地进行选择(可能是猜测)下一个位置应当是什么。如果一个给定的选择是有效
的, 即新的位置可能位于通向目的位置的途径中,则前进到这个新的位置,然后继续。 如
果一个给定的选择通向了死胡同 ,则回到前面的位置,进行其他的选择。
回溯就是通过一系列位置选择到达目的位置,并且在不能到达目的位置时反向退回的策略
通俗的讲法:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
算法书上可能这样说:回溯法是在包含问题的所有解的解空间树 (或森林)中,按照深度优
先的策略,从根结点出发搜索解空间树。 算法搜索至解空间树的任一结点时,总是先判断
该结点是否满足问题的约束条件。如果满足进入该子树,继续 按照深度优先的策略进行搜
索。否则,不去搜索以该结点为根的子树,而是逐层向其祖先结点回溯。
回溯法在用来求解问题的所有解时,要回溯到根,且根结点的所有可行的子树都已被搜
索遍才结束。而回溯法在用来求解问题的任一解时,只要搜索到问题的一个解就可以结束
适用于解决一些最优化问题。
二. 算法设计过程
(1) 确定问题的解空间
应用回溯法解决问题时,首先应明确定义问题的解空间。问题的解空间应至少包含问题的
一个最优解。
(2) 确定结点的扩展规则
约束条件。
(3) 搜索解空间
回溯算法从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就
成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移
至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的
扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时,应该往回移动
(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工
作方式递归地在解空间中
搜索,直至找到所要求的解或解空间中已没有活结点时为止。
三. 算法框架
(1) 问题框架