5.1回溯法的算法框架
- 格式:ppt
- 大小:690.50 KB
- 文档页数:18
回溯算法回溯算法是程序设计中最重要的基础算法之一,也是搜索算法中的一种控制策略,回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,选择另外一条路再走。
它是从初始状态出发,运用题目给出的条件、规则,按照深度优先搜索的顺序扩展所有可能情况,从中找出满足题意要求的解答。
回溯法是求解特殊型计数题或较复杂的枚举题中使用频率最高的一种算法。
一、回溯算法说明1.算法定义回溯算法是搜索算法中的一种控制策略。
它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。
算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解,如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。
否则进入该子树,继续按深度优先的策略进行搜索。
回溯算法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。
回溯算法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。
这种以深度优先的方式系统地搜索问题的解的算法称为回溯算法。
2.算法描述回溯算法描述如下:procedure run(当前状态);vari:integer;beginif当前状态为边界then beginif 当前状态为最佳目标状态then记下最优结果;exit;{回溯}end;{then}for i←算符最小值to 算符最大值dobegin算符i作用于当前状态,扩展出一个子状态;if (子状态满足约束条件) and (子状态满足最优性要求)then run(子状态);end;{for}end;{run}二、经典例题分析[问题描述]八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
该问题由19世纪著名的数学家高斯于1850年提出:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
回溯算法框架回溯算法就是将每⼀种可能遍历⼀遍,⽽且每⼀种结果都不相同解决⼀个回溯问题,实际上就是解决⼀个决策树的遍历过程我们需要思考三个问题:路径:已经做出的选择,将来要存储到结果的路径选择列表:当前可以做的选择结束条件:就是遍历到达末尾时候的条件解决回溯算法有⼀个框架:LinkedList<LinkedList<元素类型>> 结果集 = new LinkedList<>();private void backtrack(路径, 选择列表) {for (元素类型 o : 选择列表) {if (到达末尾) {将选择列表添加到结果集中;}做选择;backtrack(路劲, 选择列表);撤销选择;}}回溯算法的最核⼼的框架就是这段伪代码了,在循环中进⾏递归,在递归前做选择,在递归结束后撤销选择,到达末尾就将所做的选择添加到结果集中利⽤回溯,可以实现全排列问题:import java.util.LinkedList;public class Test {private static LinkedList<LinkedList<Integer>> res = new LinkedList<>();public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5, 6, 7, 8};LinkedList<LinkedList<Integer>> list = permutation(nums);System.out.println(list.size());}private static LinkedList<LinkedList<Integer>> permutation(int[] nums) {LinkedList<Integer> track = new LinkedList<>();backtrack(nums, track);return res;}private static void backtrack(int[] nums, LinkedList<Integer> track) {// 如果到达了末尾就将结果添加到res链表中if (nums.length == track.size()) {res.add(new LinkedList<>(track));return;}for (int i : nums) {//如果遍历过了就跳过if (track.contains(i)) {continue;}track.add(i);backtrack(nums, track);track.removeLast();}}}。
回溯法的三种框架
回溯法的三种框架分别是:
1.非递归回溯框架:对应的解空间是所有可能的解的集合,全局变量x[n]表示解向量,全局变量i表示当前处理的解的层次。
2.递归回溯框架:对应的解空间是所有可能的解的集合,递归函数表示回溯过程,通过递归的方式实现。
3.约束满足问题的回溯法:对应的解空间是满足约束条件的解的集合,约束条件是问题的限制条件,通过回溯的方式搜索满足条件的解。
以上信息仅供参考,如有需要,建议咨询专业程序员。