【回溯法】01 - 回溯法的算法框架
回溯法以深度优先策略搜索解空间树。
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 - 回溯法的算法框架相关推荐
- (转)回溯法-算法框架及基础
好,顶 原文地址:(转)回溯法-算法框架及基础作者:jinyang6655 转自http://lilongfei1030.blog.163.com/blog/static/86015282008720 ...
- 【算法】回溯法——0-1背包问题
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 回溯法 回溯法是一种非常有效的方法,有"通用的解题法"之称 ...
- 回溯法 —— 算法框架及应用
回溯法: 思想:走不通退回走别的路 在包含问题的所有解的空间树中,按照深度优先搜索策略,从根节点出发搜索解空间树. 活结点:自身已生成但其孩子结点没有全部生成的结点 扩展结点:指正在产生孩子结点的结点 ...
- 几个常见的简单的算法(暴力法,递推法,枚举法,递归法,分治法,贪心法,回溯法)
最近在学习算法相关知识. 通过买的视频教程了解到了一些简单的算法,为了加深感悟,同时也为了理解,将这几个常见的算法的定义进行记录. 算法是程序的灵魂,也可以认为是程序最重要的部分. 在通过算法解决问题 ...
- 回溯法之递归回溯和迭代回溯
回溯法有通用解题法之称,它可以系统的搜索一个问题的所有解或者任意解.它在问题的解空间树中,按深度优先策略从根节点出发搜索解空间树,算法搜索至解空间树的任意一个结点时,先判断该节点如(子树)是否包含 ...
- 分治法、动态规划法、回溯法、贪心法简单叙述
1.分治法特征:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决:否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问 ...
- Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 如何找回四舍五入法?...
Math.Round默认采用的不是四舍五入法, 而是四舍六入的银行家算法, 也就是四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一, 这个算法比四舍五入更精确些. R ...
- 基于倒谱法、自相关法、短时幅度差法的基音频率估计算法(MATLAB及验证)
基音频率检测 一.概念 何为基音周期?人在发音时,根据声带是否振动可以将语音信号分为清音和浊音两种.浊音携带大量的能量,因此又被称为有声语音,其在时域上有明显的周期性.而清音类似于白噪声,没有明显的周 ...
- 排序算法(一)--插入排序法折半插入排序法
约定: 假设数据中有n个数据元素(关键字).排列算法中,将序列中各关键字值依次存放于类型为keytype的数组元素K[1], K[2], K[3], -, K[n]中. 排序结果按照数据元素(关键字) ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
最新文章
- dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
- ubuntu挂载移动硬盘
- gulp-autoprefixer报Promise is not defined错误
- 【PP主数据】工作中心介绍
- 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
- STL 之find,find_if,find_end,find_first_of
- 数据结构---邻接表的DFS
- Hadoop入门(五)IO操作
- 第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统
- 旅游服务商Bikego完成A轮融资,共建创投、马蜂窝投资
- Spring Boot中通过Accept-Language头信息设置国际化内容
- JavaScript基础知识(一)
- kettle使用经验01
- 小米max刷鸿蒙,用了小米Max2,这简直是浪费我一天一夜的时间!
- Visa在全球范围内增加对女足的投入
- 汪光焘:中国城市交通问题、对策与理论需求
- 沈阳市委书记邀请深兰科技赴沈建厂,助力东北振兴
- matlab书籍(数学建模,信号处理,智能优化,统计分析)
- 华为南研所机考练习2 -求最大递增数
- 如何辨别数清冲突域和广播域
热门文章
- (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块
- python打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...
- Spring系列(七)、Spring与MyBatis框架整合
- 如何用纯 CSS 创作一个晃动的公告板
- 悦刻空弹回收计划首个乡村振兴项目建设完成,2022年再开回收新城
- 培养良好的亲子关系,你要学会这几点教育方法
- python列表去重并删除重复那个_Python实现去除列表中重复元素的方法总结【7种方法】...
- 物理CPU,CPU核数,逻辑CPU
- IDEA中为什么CSS内容修改了,浏览器中没有更新(已解决)
- Java 8 Optional:优雅地避免 NPE