回溯法
什么是回溯法
最笨的搜索法是穷举搜索,在穷举搜索的基础上,提出了一些启发式的搜索方法。
回溯法的本质就是搜索,通过剪枝策略,提高搜索的效率。回溯法也称为试探法,在搜索过程中向前试探,走不通时向后回溯。
适用回溯法求解的问题
可用回溯法求解的问题P,通常能表达为:
对于已知的由n元组(x1,x2,...,xn)组成的一个状态空间E={(x1, x2,..., xn)| xi属于Si, i=1,2,...,n},状态空间E成为问题的解空间;
回溯法的基本步骤
- 针对所给问题,定义问题的解空间;
- 确定易于搜索的解空间结构;
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
常用的剪枝函数
- 用约束函数在扩展结点处剪去不满足约束的子树;
- 用目标函数剪去得不到最优解的子树。(优化问题)
回溯的几个基本概念
- 回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中深度优先搜索问题P的所有解。树T类似于检索树,被称为状态空间树。
- 树T上任意一个结点被称为问题P的状态结点;
- 树T上任意一个叶子结点被称为问题P的一个解状态结点。
- 树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点,它对应于问题P的一个解。
- 回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
- 回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。
- 回溯法在用来求问题的最优解时,要回溯到根,且根结点的所有子树都已被搜索遍,保留问题的目标函数值最优的解。
回溯算法的分类
回溯算法有递归形式和非递归形式两种。
回溯法的应用