回溯法以深度优先策略搜索解空间树。

1. 用回溯法解题时,要明确定义问题的解空间树。

2. 通常将解空间树组织成树或图的形式。

回溯法求解问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索到才结束;

回溯法求解问题的一个解时,只要搜索到问题的一个解就可以结束。

回溯法适合求解 组合数较大的问题。

回溯法的基本思想:(节点 => 结点)

活结点:从根节点出发,以深度优先的方式搜索整个解空间,开始节点即成为活节点,同时也是当前扩展节点;

扩展结点:向纵深方向移动到一个新节点,则这个新节点成为新的活节点,并成为当前的扩展节点;

死结点:如果在当前扩展节点不能再往纵深方向扩展,则当前扩展节点成为死节点

[旅行售货员问题是一个NP完全问题]

回溯法的剪枝策略:

1. 用约束函数在扩展节点处剪去不满足约束的子树;

2. 用限界函数剪去得不到最优解的子树。

【Tips :】

1. 进入左子树时,优先考虑约束(因为上界与父节点相同);

2. 进入右子树时,优先考虑最优值(即上界是否更优),以便于剪枝。

回溯法解题步骤:

1. 针对所给问题,定义问题的解空间;

2. 确定易于搜索的解空间结构;

3. 以深度优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索;

递归回溯 伪代码如下:

    void BackTrace(int t){if (t>n){Output(x);   }else{for (int i = f(n, t); i < g(n, t); i++) {x[t] = h(i);if (Constraint(t) && Bound(t)){BackTrace(t+1);}}}}

t:递归深度

n:控制递归深度

Output():输出可行解

Constraint():约束函数

Bound():限界函数

迭代回溯 伪代码如下:

void InterativeBackTrace(){int t = 1;while(t>0){if (f(n,t) <= g(n,t)){for (int i = f(n,t); i <g(n,t) ; i++) {x[t] = h(i);if (Constraint(t)&&Bound(t)){if (Solution(t)){Output(x);}else{t++;}}}}else {t--;}}}

Solution():当前扩展节点处是否已得到问题的可行解

f(n,t):当前扩展节点处 未搜索过的子树的起始编号

g(n,t):当前扩展节点处 未搜索过的子树的终止编号

h(i):当前扩展节点处 x[t]的第i个可选值

(限界函数和约束函数同上)

子集树:

当所给的问题是,从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为 "子集树";

    void BackTrace(int t){if (t>n){Output(x);}else{for (int i = 0; i < 1; i++) {x[t] = i;if (Constraint(t) && Bound(t)){BackTrace(t+1);}}}}

排列树:

当所给的问题是,确定n个元素满足某种性质的排列时,相应的解空间树称为 "排列树";

排列树通常有 n! 个叶结点,故遍历排列树需要 Ω(n!) 的计算时间。

    void BackTrace(int t){if (t>n){Output(x);}else{for (int i = t; i <= n; i++) {Swap(x[t],x[i]);if (Constraint(t) && Bound(t)){BackTrace(t+1);}Swap(x[t],x[i]);}}}

【回溯法】01 - 回溯法的算法框架相关推荐

  1. (转)回溯法-算法框架及基础

    好,顶 原文地址:(转)回溯法-算法框架及基础作者:jinyang6655 转自http://lilongfei1030.blog.163.com/blog/static/86015282008720 ...

  2. 【算法】回溯法——0-1背包问题

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 回溯法        回溯法是一种非常有效的方法,有"通用的解题法"之称 ...

  3. 回溯法 —— 算法框架及应用

    回溯法: 思想:走不通退回走别的路 在包含问题的所有解的空间树中,按照深度优先搜索策略,从根节点出发搜索解空间树. 活结点:自身已生成但其孩子结点没有全部生成的结点 扩展结点:指正在产生孩子结点的结点 ...

  4. 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)

    最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...

  5. 回溯法之递归回溯和迭代回溯

      回溯法有通用解题法之称,它可以系统的搜索一个问题的所有解或者任意解.它在问题的解空间树中,按深度优先策略从根节点出发搜索解空间树,算法搜索至解空间树的任意一个结点时,先判断该节点如(子树)是否包含 ...

  6. 分治法、动态规划法、回溯法、贪心法简单叙述

    1.分治法特征:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决:否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问 ...

  7. Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...

    Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法,  也就是四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一, 这个算法比四舍五入更精确些. R ...

  8. 基于倒谱法、自相关法、短时幅度差法的基音频率估计算法(MATLAB及验证)

    基音频率检测 一.概念 何为基音周期?人在发音时,根据声带是否振动可以将语音信号分为清音和浊音两种.浊音携带大量的能量,因此又被称为有声语音,其在时域上有明显的周期性.而清音类似于白噪声,没有明显的周 ...

  9. 排序算法(一)--插入排序法折半插入排序法

    约定: 假设数据中有n个数据元素(关键字).排列算法中,将序列中各关键字值依次存放于类型为keytype的数组元素K[1], K[2], K[3], -, K[n]中. 排序结果按照数据元素(关键字) ...

  10. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

最新文章

  1. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
  2. ubuntu挂载移动硬盘
  3. gulp-autoprefixer报Promise is not defined错误
  4. 【PP主数据】工作中心介绍
  5. 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
  6. STL 之find,find_if,find_end,find_first_of
  7. 数据结构---邻接表的DFS
  8. Hadoop入门(五)IO操作
  9. 第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统
  10. 旅游服务商Bikego完成A轮融资,共建创投、马蜂窝投资
  11. Spring Boot中通过Accept-Language头信息设置国际化内容
  12. JavaScript基础知识(一)
  13. kettle使用经验01
  14. 小米max刷鸿蒙,用了小米Max2,这简直是浪费我一天一夜的时间!
  15. Visa在全球范围内增加对女足的投入
  16. 汪光焘:中国城市交通问题、对策与理论需求
  17. 沈阳市委书记邀请深兰科技赴沈建厂,助力东北振兴
  18. matlab书籍(数学建模,信号处理,智能优化,统计分析)
  19. 华为南研所机考练习2 -求最大递增数
  20. 如何辨别数清冲突域和广播域

热门文章

  1. (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块
  2. python打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...
  3. Spring系列(七)、Spring与MyBatis框架整合
  4. 如何用纯 CSS 创作一个晃动的公告板
  5. 悦刻空弹回收计划首个乡村振兴项目建设完成,2022年再开回收新城
  6. 培养良好的亲子关系,你要学会这几点教育方法
  7. python列表去重并删除重复那个_Python实现去除列表中重复元素的方法总结【7种方法】...
  8. 物理CPU,CPU核数,逻辑CPU
  9. IDEA中为什么CSS内容修改了,浏览器中没有更新(已解决)
  10. Java 8 Optional:优雅地避免 NPE