回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
1、回溯法的一般描述
可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,…,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。
解问题P的最朴素的方法就是枚举法,即对E中的所有n元组逐一地检测其是否满足D的全部约束,若满足,则为问题P的一个解。但显然,其计算量是相当大的。
我们发现,对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,…,xi)满足D中仅涉及到x1,x2,…,xi的所有约束意味着j(j<i)元组(x1,x2,…,xj)一定也满足D中仅涉及到x1,x2,…,xj的所有约束,i=1,2,…,n。换句话说,只要存在0≤j≤n-1,使得(x1,x2,…,xj)违反D中仅涉及到x1,x2,…,xj的约束之一,则以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)一定也违反D中仅涉及到x1,x2,…,xi的一个约束,n≥i>j。因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…,xj)违反D中仅涉及x1,x2,…,xj的一个约束,就可以肯定,以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)都不会是问题P的解,因而就不必去搜索它们、检测它们。回溯法正是针对这类问题,利用这类问题的上述性质而提出来的比枚举法效率更高的算法。
回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中搜索问题P的所有解。树T类似于检索树,它可以这样构造:设Si中的元素可排成xi(1) ,xi(2) ,…,xi(mi-1) ,|Si| =mi,i=1,2,…,n。从根开始,让T的第I层的每一个结点都有mi个儿子。这mi个儿子到它们的双亲的边,按从左到右的次序,分别带权xi+1(1) ,xi+1(2) ,…,xi+1(mi) ,i=0,1,2,…,n-1。照这种构造方式,E中的一个n元组(x1,x2,…,xn)对应于T中的一个叶子结点,T的根到这个叶子结点的路径上依次的n条边的权分别为x1,x2,…,xn,反之亦然。另外,对于任意的0≤i≤n-1,E中n元组(x1,x2,…,xn)的一个前缀I元组(x1,x2,…,xi)对应于T中的一个非叶子结点,T的根到这个非叶子结点的路径上依次的I条边的权分别为x1,x2,…,xi,反之亦然。特别,E中的任意一个n元组的空前缀(),对应于T的根。
因而,在E中寻找问题P的一个解等价于在T中搜索一个叶子结点,要求从T的根到该叶子结点的路径上依次的n条边相应带的n个权x1,x2,…,xn满足约束集D的全部约束。在T中搜索所要求的叶子结点,很自然的一种方式是从根出发,按深度优先的策略逐步深入,即依次搜索满足约束条件的前缀1元组(x1i)、前缀2元组(x1,x2)、…,前缀I元组(x1,x2,…,xi),…,直到i=n为止。
在回溯法中,上述引入的树被称为问题P的状态空间树;树T上任意一个结点被称为问题P的状态结点;树T上的任意一个叶子结点被称为问题P的一个解状态结点;树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点,它对应于问题P的一个解
用回溯法解题的一般步骤:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
来自:http://c.chinaitlab.com/200909/794370.html
分享到:
相关推荐
回溯法是一种在尝试解决问题时,通过试探性地做出选择并逐步构造可能的解,当发现当前选择不能导致有效解时,就撤销该选择并尝试其他路径的搜索算法。它通常用于解决组合优化问题,如圆排列问题、装载问题等。在本...
回溯法是一种重要的算法策略,尤其在解决计算机科学中的优化问题和搜索问题时十分常见,如ACM程序设计和算法竞赛中就常常被用到。它通常用于在约束条件下寻找问题的所有解或某个最优解。回溯法的核心思想是通过试探...
批处理作业调度回溯法java实现 批处理作业调度回溯法是一种解决作业调度问题的算法,它通过回溯法来搜索所有可能的解决方案,以找到最佳的作业调度方式。在这个Java实现的批处理作业调度程序中,我们使用回溯法来...
【回溯法实验报告】 本实验报告主要围绕回溯法这一算法进行,旨在深入理解和掌握回溯法的基本思想和应用。回溯法是一种基于试探性的解决问题的算法,它通过逐步构造可能的解并检查这些解的合法性来寻找问题的正确...
在这个“哈密顿回路 回溯法——C++代码”的项目中,我们看到的是使用C++编程语言来实现的回溯法求解哈密顿回路。C语言和C++虽然在语法上有一定差异,但C++是在C语言基础上发展起来的,因此,此处的描述中提到的...
n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...
回溯法是一种在解决问题时通过试探性地做出选择并逐步构造解决方案的方法,如果发现当前选择无法得到有效的解,则撤销该选择,尝试其他可能的选择,这一过程就像沿着一条路径探索直至找到答案或者证明无解,然后返回...
在这个场景中,回溯法是一种常用的解决策略,它是一种试探性的解决问题的方法,通过尝试所有可能的解决方案并逐步构建答案,当发现当前路径无法导出有效解时,会撤销最近的选择,退回一步重新尝试其他路径。...
回溯法是一种基于试探性的深度优先搜索的算法,常用于解决约束满足问题。在这个实验报告中,回溯法被应用于解决装载问题,具体是经典的N皇后问题,即在N×N的棋盘上放置N个皇后,使得每行、每列以及对角线上的皇后...
这个问题可以通过多种方法解决,其中回溯法是一种常用的算法策略。 回溯法是一种通过深度优先搜索解决问题的算法,它尝试构建解决方案的候选树,并在发现无法找到有效解时撤销最近的选择,返回上一层继续探索其他...
回溯法是一种强大的算法策略,常用于解决组合优化问题,如子集和问题。这个问题的目标是从给定的一组整数中找出所有可能的子集,使得这些子集的元素和等于一个特定的目标值。在本案例中,我们将深入探讨如何使用回溯...
在0-1背包问题中,回溯法通过构建所有可能的物品选取组合,并在过程中不断剪枝,避免无效的搜索,来寻找最优解。 以下是0-1背包问题回溯法求解的详细步骤: 1. **定义状态**:通常用一个二维数组`dp[i][w]`表示前i...
标题中的“实验四 用回溯法求解跳马问题”是一个典型的计算机科学与编程相关的课题,主要涉及的问题是利用回溯法解决棋盘游戏中的马的移动路径问题。回溯法是一种通过试探性的解决问题的方法,当遇到不符合条件的...
### 回溯法解数独问题 #### 一、数独简介 数独是一种起源于18世纪瑞士的数字逻辑游戏,它不仅是一项娱乐活动,也是一种极佳的智力锻炼工具。标准的数独由9个3×3的小方格组成的大九宫格构成,共计81个格子。游戏...
圆排列问题-回溯法-排列集 圆排列问题是一种经典的NP难问题,它是指在一个圆形的排列中,找到一个最佳的排列,使得圆形的总长度最小。这是一个非常复杂的问题,需要使用高级的算法来解决。在这个问题中,我们使用的...
回溯法是一种通过递归试错来寻找问题所有解决方案的算法,它的基本思想是:在尝试解决一个问题时,如果发现已不满足求解条件,就回退到上一步或上几步重新尝试其他可能的解,直到找到所有正确解或确定无解为止。...
回溯法是一种试探性的解决问题的方法,通过尝试所有可能的解决方案,并在不合适时撤销上一步操作,从而避免无效的搜索。在01背包问题中,回溯法可以用来枚举所有可能的物品选取状态,找到最优解。 以下是使用C语言...