回溯法论文-回溯法的分析与应用
- 格式:docx
- 大小:168.18 KB
- 文档页数:27
回溯法简介回溯法(探索与回溯法)是⼀种选优搜索法,按选优条件向前搜索,以达到⽬标。
但当探索到某⼀步时,发现原先选择并不优或达不到⽬标,就退回⼀步重新选择,这种⾛不通就退回再⾛的技术为回溯法,⽽满⾜回溯条件的某个的点称为“回溯点”。
有许多问题,当需要找出它的解集或者要求回答什么解是满⾜某些约束条件的最佳解时,往往要使⽤回溯法。
回溯法的基本做法是搜索,或是⼀种组织得井井有条的、能避免不必要搜索的穷举式搜索法。
这种⽅法适⽤于解⼀些组合数相当⼤的问题。
回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。
算法搜索⾄解空间树的任意⼀点时,先判断该结点是否包含问题的解:如果肯定不包含,则跳过对该结点为根的⼦树的搜索,逐层向其祖先结点回溯;否则,进⼊该⼦树,继续按深度优先策略搜索。
问题的解空间应⽤回溯法解问题时,⾸先应明确定义问题的解空间。
问题的解空间应⾄少包含问题的⼀个(最优)解。
问题的解向量:回溯法希望⼀个问题的解能够表⽰成⼀个n元式(x1,x2,…,xn)的形式显约束:对分量xi的取值限定隐约束:为满⾜问题的解⽽对不同分量之间施加的约束解空间:对于问题的⼀个实例,解向量满⾜显式约束条件的所有多元组,构成了该实例的⼀个解空间注意:同⼀个问题可以有多种表⽰,有些表⽰⽅法更简单,所需表⽰的状态空间更⼩(存储量少,搜索⽅法简单)例如,对于有n种可选物品的0-1背包问题,其解空间由长度为n的0-1向量组成状态空间树的动态搜索 可能解----》可⾏解---》最优解可能解:解空间的⼀个⼦集。
可⾏解:满⾜约束条件的解最优解:使⽬标函数取极值的最优解。
在背包问题中,有2^n中可能解,其中有些是可⾏解,有些不是可⾏解。
在可⾏解中,也只有⼀个或⼏个是最优解。
有些问题不需要寻找最优解,例如后⾯的⼋后问题和图的着⾊问题,只要找出满⾜约束条件的可⾏解即可。
回溯法的基本步骤:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先⽅式搜索解空间,并在搜索过程中⽤剪枝函数避免⽆效搜索。
一、实验目的1. 理解回溯法的概念和原理;2. 掌握回溯法的基本算法设计思想;3. 通过实例验证回溯法的正确性和效率;4. 深入了解回溯法在实际问题中的应用。
二、实验内容1. 实验一:八皇后问题2. 实验二:0/1背包问题3. 实验三:数独游戏三、实验原理回溯法是一种在解空间树中搜索问题解的方法。
其基本思想是:从问题的起始状态开始,通过尝试增加约束条件,逐步增加问题的解的候选集,当候选集为空时,表示当前路径无解,则回溯到上一个状态,尝试其他的约束条件。
通过这种方法,可以找到问题的所有解,或者找到最优解。
四、实验步骤与过程1. 实验一:八皇后问题(1)问题描述:在一个8x8的国际象棋棋盘上,放置8个皇后,使得任意两个皇后都不在同一行、同一列和同一斜线上。
(2)算法设计:- 定义一个数组,用于表示棋盘上皇后的位置;- 从第一行开始,尝试将皇后放置在第一行的每一列;- 检查当前放置的皇后是否与之前的皇后冲突;- 如果没有冲突,继续将皇后放置在下一行;- 如果冲突,回溯到上一行,尝试下一列;- 重复上述步骤,直到所有皇后都放置完毕。
(3)代码实现:```pythondef is_valid(board, row, col):for i in range(row):if board[i] == col or abs(board[i] - col) == abs(i - row):return Falsereturn Truedef solve_n_queens(board, row):if row == len(board):return Truefor col in range(len(board)):if is_valid(board, row, col):board[row] = colif solve_n_queens(board, row + 1):return Trueboard[row] = -1return Falsedef print_board(board):for row in board:print(' '.join(['Q' if col == row else '.' for col in range(len(board))]))board = [-1] 8if solve_n_queens(board, 0):print_board(board)2. 实验二:0/1背包问题(1)问题描述:给定一个背包容量为W,n件物品,每件物品的重量为w[i],价值为v[i],求在不超过背包容量的前提下,如何选取物品,使得总价值最大。
回溯法一、回溯法:回溯法是一个既带有系统性又带有跳跃性的的搜索算法。
它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。
算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。
如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。
否则,进入该子树,继续按深度优先的策略进行搜索。
回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。
这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。
二、算法框架:1、问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。
问题的解空间应到少包含问题的一个(最优)解。
2、回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始结点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的活结点,并成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。
换句话说,这个结点不再是一个活结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。
运用回溯法解题通常包含以下三个步骤:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索;3、递归回溯:由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现回溯法如下:procedure try(i:integer);varbeginif i>n then 输出结果else for j:=下界 to 上界 dobeginx[i]:=h[j];if 可行{满足限界函数和约束条件} then begin 置值;try(i+1); end;end;end;说明:i 是递归深度;n 是深度控制,即解空间树的的高度;可行性判断有两方面的内容:不满约束条件则剪去相应子树;若限界函数越界,也剪去相应子树;两者均满足则进入下一层;二、习题:1、0-1背包:n=3,w=[16,15,15],p=[45,25,25],c=302、旅行售货员问题:某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。
回溯法方法简介
回溯法是一种基于深度优先搜索的算法,用于求解问题的所有解或任意解。
它通过递归探索所有可能的解路径,并在此过程中剪枝无效的解路径。
当遇到一个不满足约束条件的解时,回溯法会回溯到上一个状态,并尝试其他可能的解。
回溯法的基本思想是将问题的解空间转化成图或者树的结构表示,然后使用深度优先搜索策略进行遍历。
在搜索过程中,记录和寻找所有可行解或者最优解。
回溯法的应用非常广泛,包括组合优化、人工智能、机器学习等领域。
它是一种通用解题法,可以系统地搜索一个问题的所有解或任一解。
回溯法的优点是可以找到所有可能的解,并且在某些情况下可以找到最优解。
但是,它的缺点是对于大规模问题可能会非常慢,因为它的时间复杂度是指数级的。
因此,在实际应用中,通常需要结合其他算法和优化技巧来提高回溯法的效率和可扩展性。
文献回溯法
文献回溯法是一种研究方法,用于检索、整理和评估特定主题的相关文献。
它运用了文献检索技术,以确定特定课题的概念框架和研究有关的文献,能够帮助研究者获得更完善的研究结果。
文献回溯法分为4步:第一步是主题明确,研究者需要确定关注的问题,比如什么样的内容需要研究;第二步是文献检索,研究者根据确定的问题,在相关的数据库进行检索,选择出符合要求的文章;第三步是数据分析,将检索出来的文献进行分析,提取主题研究所需要的重要信息;第四步是结论性评述,对于提取出来的重要信息,进行一定的分析和总结,做出结论。
文献回溯法可以有效地检索、整理和分析文献,并使研究者能够更加轻松地获得有价值的研究结果。
它还可以帮助研究者发掘新的研究方向,从而让研究者更加轻松的实现学术成果。
回溯法方法简介回溯法(backtracking)是一种常用于解决组合优化问题和搜索问题的算法。
它通过逐步建立解决方案的过程,并在某一步发现不满足条件时回溯到前一步,尝试其他可能的选择,直至找到满足条件的解决方案或者确定无解。
回溯法的思想类似于穷举搜索,但通过一些剪枝等优化策略,可以提高搜索效率。
回溯法是许多经典算法问题的核心思想,如八皇后问题、0-1背包问题、图的着色问题等。
回溯法的过程通常包括五个步骤:1. 选择解空间;2. 约束条件;3. 判断当前解是否满足约束条件;4. 如果满足条件则记录当前解,否则回溯到前一步;5. 继续遍历其他分支,直至找到最终解或确定无解。
回溯法通常使用递归的方式来实现,其中递归函数包括参数表示当前搜索深度、当前解决方案、约束条件等信息。
在递归函数中,根据约束条件和当前解决方案,判断是否需要继续搜索或者回溯。
通过不断调用递归函数,可以逐步构建解空间,并寻找满足条件的解决方案。
回溯法的优点在于可以找到问题的所有解(或满足条件的解),适用于许多组合优化问题和搜索问题。
回溯法的搜索过程中可以使用剪枝等策略来提高效率,避免不必要的搜索。
回溯法的缺点在于可能需要遍历整个解空间,并且在某些情况下可能会导致比较大的时间复杂度。
回溯法在实际应用中有许多经典问题的解决方案。
八皇后问题是回溯法的典型案例。
八皇后问题是一个经典的棋盘游戏问题,要求在8×8的国际象棋棋盘上放置8个皇后,使得彼此之间不能相互攻击。
通过回溯法逐步尝试不同的布局,可以找到所有满足条件的解决方案。
同样,回溯法在解决0-1背包问题、图的着色问题、旅行推销员问题等组合优化问题中也有广泛的应用。
除了组合优化问题,回溯法也常用于搜索问题的解决。
在图的遍历中,可以使用回溯法来寻找从起点到终点的路径。
在人工智能领域,回溯法也常用于解决逻辑推理、规划等问题。
通过对搜索空间进行回溯和剪枝,可以高效地找到问题的解决方案。
回溯法是一种重要的算法思想,适用于解决组合优化问题和搜索问题。
第5章回溯法回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。
当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。
如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。
在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。
扩大当前候选解的规模,以继续试探的过程称为向前试探。
回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始结点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的活结点,并成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。
换句话说,这个结点不再是一个活结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法即·96· ACM 程序设计培训教程以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。
运用回溯法解题通常包含以下三个步骤: (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构;(3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索;5.1〖案例1〗组合问题找出从自然数1、2、……、n 中任取r 个数的所有组合。
例如n=5,r=3的所有组合为:(1)1、2、3 (2)1、2、4 (3)1、2、5 (4)1、3、4 (5)1、3、5 (6)1、4、5 (7)2、3、4 (8)2、3、5 (9)2、4、5 (10)3、4、5则该问题的状态空间为:E={(x1,x2,x3)∣xi ∈S ,i=1,2,3},其中:S={1,2,3,4,5} 约束集为:x1<x2<x3显然该约束集具有完备性。
回溯法的使用条件和基本方法
回溯法是一种基于试错的搜索算法,它的使用条件是问题具有明确的求解步骤,并且可以通过逐步求解来逼近最终答案。
基本方法包括以下步骤:
1. 定义问题的解空间:确定问题的解空间,即问题的可能解的集合。
解空间通常是一个图或树,其中每个节点表示问题的一个状态,每个边表示从一个状态转移到另一个状态的操作。
2. 确定问题的约束条件:确定问题的约束条件,即限制问题解的规则。
约束条件可以帮助缩小解空间,减少搜索的规模。
3. 搜索解空间:从解空间的根节点(通常是最初始状态)开始搜索,按照一定的搜索策略(如深度优先搜索、广度优先搜索等)遍历解空间。
在搜索过程中,如果遇到未访问过的节点,就扩展该节点,并递归地搜索其子节点。
如果遇到已经访问过的节点,则回溯到上一个节点,继续搜索其他分支。
4. 判断是否找到解:在搜索过程中,如果找到了满足约束条件的解,就停止搜索并返回该解。
如果搜索完整个解空间都没有找到解,则说明该问题无解。
5. 优化搜索效率:为了提高搜索效率,可以采用一些启发式搜索策略,如A 搜索算法、模拟退火算法等。
这些策略可以在一定程度上减少搜索的路径数量,加速搜索过程。
以上是回溯法的基本使用条件和基本方法。
在实际应用中,可以根据问题的特点选择适合的回溯法变种或改进方法,以获得更好的求解效果。
回溯法——装载问题问题描述: 有⼀批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量是wi,且不能超,即Σwi<=c1+c2。
算法思想: ——在给定的装载问题有解的情况下 最优装载⽅案:⾸先将第⼀艘轮船尽可能的装满; 然后将剩余的集装箱装上第⼆艘轮船。
将第⼀艘轮船尽可能的装满等价于选取全体集装箱的⼀个⼦集,使该⼦集中集装箱重量之和最接近c1。
算法设计: 先考虑装载⼀艘轮船的情况,依次讨论每个集装箱的装载情况,共分为两种,要么装(1),要么不装(0),因此很明显其解空间树可以⽤⼦集树来表⽰。
在算法Maxloading中,返回不超过c的最⼤⼦集和,但是并没有给出到达这个最⼤⼦集和的相应⼦集,稍后完善。
在算法Maxloading中,调⽤递归函数Backtrack(1)实现回溯搜索。
Backtrack(i)搜索⼦集树中的第i层⼦树。
在算法Backtrack中,当i>n时,算法搜索到叶结点,其相应的载重量为cw,如果cw>bestw,则表⽰当前解优于当前的最优解,此时应该更新bestw。
算法Backtrack动态地⽣成问题的解空间树。
在每个结点处算法花费O(1)时间。
⼦集树中结点个数为O(2^n),故Backtrack所需的时间为O(2^n)。
另外Backtrack还需要额外的O(n)的递归栈空间。
算法描述:1 template <class Type>2class Loading3 {4 friend Type MaxLoading(Type [],Type,int);5private:6void Backtrack(int i);7int n; //集装箱数⽬8 Type * w, //集装箱重量数组9 c, //第⼀艘轮船的载重量10 cw, //当前载重量11 bestw; //当前最优载重量12 };1314 template <class Type>15void Loading<Type>::Backtrack(int i) //回溯搜索16 { //搜索第i层结点17if(i>n) //到达叶结点18 {19if(cw>bestw)20 bestw = cw;21return;22 }23if(cw+w[i] <= c) //搜索⼦树24 {25 cw += w[i]; //当前载重量增加正考虑对象的重量26 Backtrack(i+1); 27 cw -= w[i]; //递归返回上⼀层时,记得减去刚考虑对象的集装箱重量28 }29 Backtrack(i+1); //递归搜索第i+1层30 }3132 template <class Type>33 Type MaxLoading(Type w[],Type c,int n) //返回最优载重量34 {35 Loading<Type> X; //初始化36 X.w = w;37 X.c = c;38 X.n = n;39 X.bestw = 0; //当前最优载重量的初值赋为040 X.cw = 0;41 X.Backtrack(1); //计算最优载重量————调⽤递归函数,实现回溯搜索42return X.bestw;43 }上界函数: 引⼊剪枝函数,⽤于剪去不含最优解的⼦树:即当cw(当前载重量)+r(未考察对象的总重量)<bestw(当前的最优载重量)时当前⼦树不可能包含最优解,直接减掉。
一、实验目的1. 理解回溯法的概念和基本原理。
2. 掌握回溯法的应用场景和实现方法。
3. 通过具体实例,验证回溯法在解决实际问题中的有效性。
二、实验内容本次实验主要围绕回溯法进行,通过以下实例来验证回溯法在解决实际问题中的有效性:1. 八皇后问题2. 0/1背包问题3. 数独游戏三、实验步骤1. 八皇后问题(1)定义问题:在8×8的国际象棋棋盘上,放置8个皇后,使得它们不能相互攻击。
(2)设计回溯算法:① 初始化棋盘为全空状态。
② 从第一行开始,尝试将皇后放置在每一列。
③ 如果某一列放置皇后后,不会与已放置的皇后发生冲突,则继续在下一行尝试放置。
④ 如果某一列放置皇后后,与已放置的皇后发生冲突,则回溯至上一个放置皇后的行,尝试在下一列放置。
⑤ 当所有行都放置了皇后,则找到一个解。
(3)实现代码:```pythondef is_valid(board, row, col):for i in range(row):if board[i] == col or \board[i] - i == col - row or \board[i] + i == col + row:return Falsereturn Truedef solve_n_queens(board, row):if row == len(board):return Truefor col in range(len(board)):if is_valid(board, row, col):board[row] = colif solve_n_queens(board, row + 1):return Trueboard[row] = -1return Falsedef print_board(board):for row in board:print(' '.join(['Q' if x == row else '.' for x in range(len(board))]))def n_queens():board = [-1] 8if solve_n_queens(board, 0):print_board(board)else:print("No solution exists")n_queens()```2. 0/1背包问题(1)定义问题:给定n个物品,每个物品有重量和价值,背包容量为W,求出能够装入背包的物品组合,使得背包内物品的总价值最大。
算法——回溯法回溯法回溯法有“通⽤的解题法”之称。
⽤它可以系统地搜索⼀个问题的所有解或任⼀解。
回溯法是⼀种即带有系统性⼜带有跳跃性的搜索算法。
它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。
算法搜索⾄解空间树的任⼀结点时,先判断该节点是否包含问题的解。
如果不包含,则跳过对以该节点为根的⼦树的搜索,逐层向其它祖先节点回溯。
否则,进⼊该⼦树,继续按照深度优先策略搜索。
回溯法求问题的所有解时,要回溯到根,且根节点的所有⼦树都已被搜索遍才结束。
回溯法求问题的⼀个解时,只要搜索到问题的⼀个解就可结束。
这种以深度优先⽅式系统搜索问题的算法称为回溯法,它是⽤于解组合数⼤的问题。
问题的解空间⽤回溯法解问题时,应明确定义问题的解空间。
问题的解空间⾄少包含问题的⼀个(最优)解。
例如对于有n种可选择物品的0-1背包问题,其解空间由长度为n的0-1向量组成。
该解空间包含对变量的所有可能的0-1赋值。
例如n=3时,其解空间是{(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)}定义了问题的解空间后,还应该将解空间很好地组织起来,使得能⽤回溯法⽅便地搜索整个解空间。
通常将解空间组织成树或者图的形式。
例如,对于n=3时的0-1背包问题,可⽤⼀颗完全的⼆叉树表⽰其解空间,如下图。
解空间树的第i层到第i+1层边上的标号给出了变量的值。
从树根到叶⼦的任⼀路径表⽰解空间中的⼀个元素。
例如,从根节点到节点H的路径相当与解空间中的元素(1,1,1)。
回溯法的基本思想确定了解空间的组织结构后,回溯法从根节点出发,以深度优先搜索⽅式搜索整个解空间。
回溯法以这种⼯作⽅式递归地在解空间中搜索,直到找到所要求的解或解空间所有解都被遍历过为⽌。
回溯法搜索解空间树时,通常采⽤两种策略避免⽆效搜索,提⾼回溯法的搜索效率。
其⼀是⽤约束函数在当前节点(扩展节点)处剪去不满⾜约束的⼦树;其⼆是⽤限界函数剪去得不到最优解的⼦树。
算法创新与实践论文
I
沈阳理工大学
算法实践与创新论文
题目 回溯法的分析与应用
学生姓名: 学号:
学生姓名: 学号:
学生姓名: 学号:
算法创新与实践论文
1
摘要
对于计算机科学来说,算法的概念是至关重要的,算法是一系列解决问题的清晰指
令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。为了更加的
了解算法,本篇论文中,我们先研究一个算法---回溯法。
回溯法是一种常用的重要的基本设计方法。它的基本做法是在可能的范围之内搜索,
适于解一些组合数相当大的问题。圆排列描述的是在给定n个大小不等的圆 C1,C2,„,Cn,
现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求
从n个圆的所有排列中找出有最小长度的圆排列。图着色问题用数学定义就是给定一个
无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为K个颜
色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的
K值。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含
的“+”和“-”的个数相同。
在本篇论文中,我们将运用回溯法来解决着图的着色问题,符号三角形问题,图排
列问题,将此三个问题进行深入的探讨。
关键词: 回溯法 图的着色问题 符号三角形问题 图排列问
题
I
算法创新与实践论文
1
目录
第1章 引言 ........................................................................................................................................... 1
第2章 回溯法的背景 ......................................................................................................................... 2
第3章 图的着色问题 ........................................................................................................................... 4
3.1 问题描述 ................................................................................................................................... 4
3.2 四色猜想 ................................................................................................................................... 4
3.3 算法设计 ................................................................................................................................... 5
3.4 源代码 ....................................................................................................................................... 6
3.5 运行结果图 ............................................................................................................................. 10
第4章 符号三角形问题 ................................................................................................................... 11
4.1 问题描述 ................................................................................................................................. 11
4.2 算法设计 ................................................................................................................................. 11
4.3 源代码 ..................................................................................................................................... 12
4.4 运行结果图 ............................................................................................................................. 16
第5章 圆的排列问题 ....................................................................................................................... 17
5.1 问题描述 ................................................................................................................................. 17
5.2 问题分析 ................................................................................................................................. 17
5.3 源代码 ..................................................................................................................................... 18
5.4 运行结果图 ............................................................................................................................. 22
结论 ....................................................................................................................................................... 23
参考文献 ............................................................................................................................................... 24
II
算法创新与实践论文
1
第1章 引言
在现实世界中,有相当一类问题试求问题的全部解或求问题的最优解。最基本的方
法是通过枚举法搜索问题的解空间。但许多问题解空间的大小随问题规模n的增长呈指
数规律增长,这就使问题理论上可解而实际不可行。为了使搜索空间减少到尽可能小,
就需要采用良好的搜索技术。回溯法就是一种较好的搜索技术。
回溯法又称为试探法,它是一种有效的试探回溯搜索技术。即运用回溯法求解问题
不是基于某种确定的法则,而是通过大量反复的试探和回溯。它的基本做法是搜索,能
避免不必要搜素的穷举式搜索。回溯法在问题的解空间树中按深度优先策略,从根结点
出发搜索解空间树,算法搜索至解空间树的任意一点时,先判断该节点是否包含问题的
解,如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否
则,进入该子树,继续按深度优先策略搜索。简单地说,采用回溯法求解问题的整个过
程贯穿了搜索---试探—决定回溯或前进这三种基本运算。
通过运用回溯法,可以解决很多问题,譬如我们所熟知的“八皇后问题”,“0/1背
包问题”,这只是在教学阶段中的运用,在实际运用中也产生很大的作用在学习过程中,
我们会遇到这样的问题,让我们去寻找给定问题的解集或者让我们找出满足某些约束条
件的最优解,这时候我们就可以采用回溯法来解决这一类的问题。通过运用回溯法,可
以解决很多问题,譬如我们所熟知的“八皇后问题”,“0/1背包问题”,这只是在教学阶
段中的运用,在实际运用中也产生很大的作用回溯法的优点是容易理解,可行性比较强。
[1]