【算法分析与设计】回溯法(下)

目录

  • 一、符号三角形问题
  • 二、N皇后问题
  • 三、0-1背包问题
  • 四、最大团问题
    • 4.1 进一步改进
  • 五、图的m着色问题
  • 5.1 算法设计
  • 六、旅行售货员问题
  • 七、连续邮资问题
  • 八、回溯法效率分析
  • 九、重排原理
  • 十、回溯法的效率分析
  • 十一、Monte Carlo方法
  • 附一、四后问题的搜索树
  • 附二、随机选择路径
  • 附三、估计结果
  • 十一、小结


一、符号三角形问题

  下图是由14个“+”和14个“-”组成的符号三角形。2个同号下面都是“+”,2个异号下面都是“-”。
在这里插入图片描述
  在一般情况下,符号三角形的第一行有n个符号。符号三角形问题要求对于给定的n,计算有多少个不同的符号三角形,使其所含的“+”和“-”的个数相同
  解向量:用n元组x[1:n]表示符号三角形的第一行。
  可行性约束函数:当前符号三角形所包含的“+”个数与“-”个数均不超过n*(n+1)/4
  无解的判断:n * (n+1)/2为奇数
在这里插入图片描述

void Triangle::Backtrack(int t)
{if ((count>half)||(t*(t-1)/2-count>half)) return;if (t>n) sum++;elsefor (int i=0;i<2;i++) {p[1][t]=i;count+=i;for (int j=2;j<=t;j++) {p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];count+=p[j][t-j+1];}Backtrack(t+1);for (int j=2;j<=t;j++)count-=p[j][t-j+1];count-=i;}}

  复杂度分析:
  计算可行性约束需要O(n)时间在最坏情况下有 O(2n)个结点需要计算可行性约束,故解符号三角形问题的回溯算法所需的计算时间为 O(n2n)。


二、N皇后问题

  在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上
在这里插入图片描述
  解向量:(x1, x2, … , xn)
  显约束:xi=1,2, … ,n
  隐约束
  1)不同列:xixj
  2)不处于同一正、反对角线:|i-j||xi-xj|

bool Queen::Place(int k)
{for (int j=1;j<k;j++)if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;return true;
} void Queen::Backtrack(int t)
{if (t>n) sum++;elsefor (int i=1;i<=n;i++) {x[t]=i;if (Place(t)) Backtrack(t+1);}}

三、0-1背包问题

  左子树可行进入,否则不进
  右子树可能包含最优解才进,否则不进
  cp(当前价值)+r(剩余物品价值和)<=bestp(当前最优价值)
  可以先排序,再计算得出非整数解,作为最优解的“天花板”
  将物品按照单位重量价值从大到小排序,然后按顺序考察各物品

  解空间:子集树
  可行性约束函数:在这里插入图片描述
  上界函数:cp(当前价值)+r(剩余物品价值和)<=bestp(当前最优价值)

template<class Typew, class Typep>
Typep Knap<Typew, Typep>::Bound(int i)
{// 计算上界Typew cleft = c - cw;  // 剩余容量Typep b = cp;// 以物品单位重量价值递减序装入物品while (i <= n && w[i] <= cleft) {cleft -= w[i];b += p[i];i++;}// 装满背包if (i <= n) b += p[i]/w[i] * cleft;return b;
}

在这里插入图片描述
  N=4 C=7
  P={9,10,7,4}
  W={3,5,2,1}
  最优解x={1,0,1,1}
  重量为6,价值为20
  复杂度分析
  0-1背包问题的回溯算法所需的计算时间为O(n2n)


四、最大团问题

  给定无向图G=(V,E),求G的最大团
  G的子图:G’=(V’,E’),其中V’V,E’E
  G的补图:G=(V,E’),E’是E关于完全图边集的补集
  G中的团:G的完全子图(任意)
  G的最大团:顶点数最多的团

  G的点独立集:G的顶点子集A,且任取两点u,v,其连线都不在E中。
  最大点独立集:顶点最多的点独立集。

  U是G的最大团当且仅当U是G的最大点独立集。
在这里插入图片描述
在这里插入图片描述
  解空间:子集树
  可行性约束函数:顶点i到已选入的顶点集中每一个顶点都有边相连。
  上界函数:有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。

void Clique::Backtrack(int i)
{// 计算最大团if (i > n) {// 到达叶结点for (int j = 1; j <= n; j++) bestx[j] = x[j];bestn = cn;   return;}// 检查顶点 i 与当前团的连接int OK = 1;for (int j = 1; j < i; j++)if (x[j] && a[i][j] == 0) {// i与j不相连OK = 0;  break;}if (OK) {// 进入左子树x[i] = 1;  cn++;Backtrack(i+1);x[i] = 0; cn--;}if (cn + n - i > bestn) {// 进入右子树x[i] = 0;Backtrack(i+1);}
}

在这里插入图片描述
  复杂度分析
  最大团问题的回溯算法backtrack所需的计算时间显然为O(n2n)。


4.1 进一步改进

  选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。例如在搜索之前可以将顶点按度从小到大排序。这在某种意义上相当于给回溯法加入了启发性。
  定义Si={vi,vi+1,…,vn},依次求出Sn,Sn-1,…,S1的解。从而得到一个更精确的上界函数,若cn+Si<=max则剪枝。同时注意到:从Si+1到Si,如果找到一个更大的团,那么vi必然属于找到的团,此时有Si=Si+1+1,否则Si=Si+1。因此只要max的值被更新过,就可以确定已经找到最大值,不必再往下搜索了。


五、图的m着色问题

  给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色这个问题是图的m可着色判定问题若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为**图的m可着色优化问题**。
在这里插入图片描述
  由于用m种颜色为无向图G=(V, E)着色,其中,V的顶点个数为n,可以用一个n元组C=(c1, c2, …, cn)来描述图的一种可能着色,其中,ci∈{1, 2, …, m}(1≤i≤n)表示赋予顶点i的颜色。例如,5元组(1, 2, 2, 3, 1)表示对具有5个顶点的无向图的一种着色,顶点1着颜色1,顶点2着颜色2,顶点3着颜色2,如此等等。 如果在n元组C中,所有相邻顶点都不会着相同颜色,就称此n元组为可行解,否则为无效解


5.1 算法设计

  搜索树:m叉树
  约束条件:在结点<c1,c2,…,ck>处,顶点c+1的邻接表中结点已用过的颜色不能再用
  如果邻接表中结点已用过m种颜色,则结点c+1没法着色,从该结点回溯到其父结点,满足多米诺性质
  策略:深度优先

  回溯法求解图着色问题,首先把所有顶点的颜色初始化为0,然后依次为每个顶点着色。在图着色问题的解空间树中,如果从根结点到当前结点对应一个部分解,也就是所有的颜色指派都没有冲突,则在当前结点处选择第一棵子树继续搜索,也就是为下一个顶点着颜色1,否则,对当前子树的兄弟子树继续搜索,也就是为当前顶点着下一个颜色,如果所有m种颜色都已尝试过并且都发生冲突,则回溯到当前结点的父结点处,上一个顶点的颜色被改变,依此类推
在这里插入图片描述
  解向量:(x1, x2, … , xn)表示顶点i所着颜色x[i]
  可行性约束函数:顶点i与已着色的相邻顶点颜色不重复。

void Color::Backtrack(int t)
{if (t>n) {sum++;for (int i=1; i<=n; i++)cout << x[i] << ' ';cout << endl;}elsefor (int i=1;i<=m;i++) {x[t]=i;if (Ok(t)) Backtrack(t+1);}
}
bool Color::Ok(int k)
{// 检查颜色可用性for (int j=1;j<=n;j++)if ((a[k][j]==1)&&(x[j]==x[k])) return false;return true;
}

在这里插入图片描述
  复杂度分析
  图m可着色问题的解空间树中内结点个数是 在这里插入图片描述
  对于每一个内结点,在最坏情况下,用ok检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。因此,回溯法总的时间耗费在这里插入图片描述


六、旅行售货员问题

  解空间:排列树。

template<class Type>
void Traveling<Type>::Backtrack(int i)
{if (i == n) {if (a[x[n-1]][x[n]] != NoEdge && a[x[n]][1] != NoEdge &&(cc + a[x[n-1]][x[n]] + a[x[n]][1] < bestc || bestc == NoEdge)) {for (int j = 1; j <= n; j++) bestx[j] = x[j];bestc = cc + a[x[n-1]][x[n]] + a[x[n]][1];}}else {for (int j = i; j <= n; j++)// 是否可进入x[j]子树?if (a[x[i-1]][x[j]] != NoEdge &&(cc + a[x[i-1]][x[i]] < bestc || bestc == NoEdge)) {// 搜索子树Swap(x[i], x[j]);cc += a[x[i-1]][x[i]];Backtrack(i+1);cc -= a[x[i-1]][x[i]];Swap(x[i], x[j]);}}
}

  复杂度分析:
  算法backtrack在最坏情况下可能需要更新当前最优解O((n-1)!)次,每次更新bestx需计算时间O(n),从而整个算法的计算时间复杂性为O(n!)


七、连续邮资问题

  假设国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题 要求对于给定的n和m的值给出邮票面值的最佳设计,在1张信封上可贴出从邮资1开始,增量为1的最大连续邮资区间
  例如,当n=5和m=4时,面值为(1,3,11,15,32)的5种邮票可以贴出邮资的最大连续邮资区间是1到70。
  面值为(1,6,10,20,30)的5种邮票只能贴出1-4,5无法贴出,不可取。
求给定n和m后,可以贴出连续邮资区间达到最大的最佳设计!
在这里插入图片描述
  解向量:用n元组x[1:n]表示n种不同的邮票面值,并约定它们从小到大排列。x[1]=1是唯一的选择。
  可行性约束函数:已选定x[1:i-1],最大连续邮资区间是[1:r],接下来x[i]的可取值范围是[x[i-1]+1:r+1]。
  如何确定r的值?
  计算X[1:i]的最大连续邮资区间在本算法中被频繁使用到,因此势必要找到一个高效的方法。考虑到直接递归的求解复杂度太高,我们不妨尝试计算用不超过m张面值为x[1:i]的邮票贴出邮资k所需的最少邮票数y[k]。通过y[k]可以很快推出r的值。事实上,y[k]可以通过递推在O(n)时间内解决:

for (int j=0; j<= x[i-2]*(m-1);j++)if (y[j]<m)for (int k=1;k<=m-y[j];k++)if (y[j]+k<y[j+x[i-1]*k]) y[j+x[i-1]*k]=y[j]+k;while (y[r]<maxint) r++;

八、回溯法效率分析

  通过前面具体实例的讨论容易看出,回溯算法的效率在很大程度上依赖于以下因素:
  (1)产生x[k]的时间
  (2)满足显约束的x[k]值的个数
  (3)计算约束函数constraint的时间
  (4)计算上界函数bound的时间
  (5)满足约束函数和上界函数约束的所有x[k]的个数
  好的约束函数能显著地减少所生成的结点数。但这样的约束函数往往计算量较大。因此,在选择约束函数时通常存在生成结点数与约束函数计算量之间的折衷


九、重排原理

  对于许多问题而言,在搜索试探时选取x[i]的值顺序是任意的。在其它条件相当的前提下,让可取值最少的x[i]优先。从图中关于同一问题的2棵不同解空间树,可以体会到这种策略的潜力。
在这里插入图片描述
在这里插入图片描述
  图(a)中,从第1层剪去1棵子树,则从所有应当考虑的3元组中一次消去12个3元组。对于图(b),虽然同样从第1层剪去1棵子树,却只从应当考虑的3元组中消去8个3元组。前者的效果明显比后者好。


十、回溯法的效率分析

  解空间的结构一经选定,影响回溯法的前三个因素就可以确定
  生成结点的数目是可变的(做文章)
  当问题实例的规模n较大时,回溯法能用很少的时间求得问题的解
  很难估计出回溯法在解具体实例时所产生的结点数
  但有近似估计的方法,准确度相当高


十一、Monte Carlo方法

  从根开始,随机选择一条路径,直到不能分支为止。即从x1,x2,…,依次对xi赋值,每个xi的值是从当时的Si中随机选取,直到向量不能扩张为止
  假定搜索树的其它|Si|-1个分支与以上随机选出的路径一样,计数搜索树的点数
  重复上两个步骤,将结点数进行概率平均


附一、四后问题的搜索树

  只需访问17个结点
在这里插入图片描述


附二、随机选择路径

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


附三、估计结果

  假设4次抽样测试:
  Case1:1次
  Case2:1次
  Case3:2次
  平均结点数=(211+171+13*2)/4=16
  非常接近搜索空间访问的真正结点数17
  17/4^4=17/256=6.64%,即93%的其它结点都被剪枝后裁去了!


十一、小结

  适于求解组合搜索问题及优化问题
  求解条件:满足多米诺性质
  解的表示:解向量,求解是不断扩充解向量的过程
  回溯条件
  搜索问题——约束条件
  优化问题——约束条件+代价函数
  分支策略:深度优先

  结点状态:白结点,黑结点,灰结点
  算法时间复杂度:O(2n)或O(n!)
  平均时间复杂度和空间复杂度较低
  降低时间复杂度的主要途径:
  根据树的分支设计优先策略,结点少分支优先,或解多的分支优先
  利用搜索树的对称性裁剪子树
  分解为子问题(略)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/151943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…

AutoDL百川大模型体验

文章目录 镜像克隆模型下载测试效果AutoDL自定义服务 感谢AutoDL和CodeWithGPU这两个平台&#xff0c;让我们能低成本&#xff0c;低门槛地部署体验这些大模型 镜像克隆 我是在CodeWithGPU上克隆的这个镜像 模型下载 codewithgpu有介绍 注意这三个文件都需要下载 把那个&quo…

【window10】Dart+Android Studio+Flutter安装及运行

安装Dart SDK安装Android Studio安装Flutter在Android Studio中创建并运行Flutter项目 安装前&#xff0c;请配置好你的jdk环境&#xff0c;准备好你的梯子~ 安装Dart SDK 浅浅了解一下Dart&#xff1a; Dart 诞生于2011年&#xff0c;是由谷歌开发的一种强类型、跨平台的客户…

访问Apache Tomcat的管理页面

配置访问Tomcat管理页面的用户名、密码、角色 Tomcat安装完成后&#xff0c;包含了一个管理应用&#xff0c;默认安装在 <Tomcat安装目录>/webapps/manager 例如&#xff1a; 要使用管理页面的功能&#xff0c;需要在conf/tomcat-users.xml文件中配置用户、密码及角色…

大话机器学习准确率(Accuracy)、精确率(Pecision)、召回率(Recall)以及TP、FP、TN、FN

话说三国时期&#xff0c;乱世出人才&#xff0c;当时刘备让张飞帮忙招兵买马&#xff0c;寻找人才。张飞发公告以后&#xff0c;有10人来面试&#xff0c;这10人分为两类&#xff0c;人才和庸才&#xff0c;各占百分之五十&#xff0c;张飞的主要作用就是从这10人中识别出人才…

常见算法-双骰子游戏(Craps)

常见算法-双骰子游戏&#xff08;Craps&#xff09; 1、说明 一个简单的双骰子游戏&#xff0c;游戏规则如下&#xff1a; 玩家掷两个骰子&#xff0c;点数为1到6&#xff0c; 如果第一次点数和为7或11&#xff0c;则玩家胜&#xff0c;如果点数和为2、3或12&#xff0c;则…

echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里

echarts的bug&#xff0c;在series里写tooltip&#xff0c;不起作用&#xff0c;要在全局先写tooltip&#xff1a;{show:true}才起作用&#xff0c;如果在series里写的不起作用就写到全局里 series里写tooltip不起作用&#xff0c;鼠标悬浮在echarts图表上时不显示提示 你需要…

电脑技巧:推荐一款桌面增强工具AquaSnap(附下载)

一、软件介绍 AquaSnap(界面增强软件)是一款功能强大的界面增强软件。这款软件支持屏幕边缘吸附与屏幕分屏即多显示器控制、摇晃窗口置顶与窗口自动拉伸等实用功能。用户使用了这款软件以后就能使电脑桌面排列更加整洁。 AquaSnap 可以让你轻松地调整和管理窗口的位置和大小&…

Android---GC回收机制与分代回收策略

目录 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾回收算法 JVM 分代回收策略 1. 新生代 2. 老年代 GC Log 分析 引用 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾就是内存中已经没有用的对象&#xff0c;JVM 中的垃圾回收器(Garbage Collector)会自…

react中预览excel表格

查了很多资料&#xff0c;很多插件&#xff0c;有很多也用不了&#xff0c;最后试了xlsx这个插件&#xff0c;可以使用。 话不多少了&#xff0c;直接放代码吧&#xff1a; 1.代码实现 fetch(API).then((res: any) > {res?.blob().then((r: any) > {const reader ne…

ChromeDriver驱动最新版下载

下载地址ChromeDriver - WebDriver for Chrome - Downloads selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 113 Current browser version is 117.0.5938.150 with binar…

【MySQL】Linux 中 MySQL 环境的安装与卸载

文章目录 Linux 中 MySQL 环境的卸载Linux 中 MySQL 环境的安装 Linux 中 MySQL 环境的卸载 在安装 MySQL 前&#xff0c;我们需要先将系统中以前的环境给卸载掉。 1、查看以前系统中安装的 MySQL rpm -qa | grep mysql2、卸载这些 MySQL rpm -qa | grep mysql | args yum …

数据结构——哈希的应用之位图,布隆过滤器与哈希切割

文章目录 前言1. 位图1.1 位图的概念1. 2 模拟实现stl位图位图的应用 2.布隆过滤器2.1 布隆过滤器的概念 布隆过滤器的查找布隆过滤器的删除问题布隆过滤器优点布隆过滤器缺陷 哈希切割 前言 本篇博客主要讲述的是应用哈希的一些数据结构_位图和布隆过滤器&#xff0c;讲解了这…

手机待办事项app哪个好?

手机是日常很多人随身携带的设备&#xff0c;手机除了拥有通讯功能外&#xff0c;还能帮助大家高效管理日常工作&#xff0c;借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务&#xff0c;提高工作的效率。 过去&#xff0c;我也曾经在寻找一款能够将工作任务清晰罗…

基于Java的4S店汽车商城系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

rsync 远程同步实现快速、安全、高效的异地备份

目录 1 rsync 远程同步 1.1 rsync是什么&#xff1f; 1.2 rsync同步方式 1.3 rsync的特性 1.4 rsync的应用场景 1.5 rsync与cp、scp对比 1.6 rsync同步源 2 配置rsync源服务器 2.1 建立/etc/rsyncd.conf 配置文件 3 发起端 4 发起端配置 rsyncinotify 4.1 修改rsync…

基于SpringBoot的网上摄影工作室

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 作品分类管理 轮播图管理 摄影作品管理 摄影作品收藏 摄影圈 摄影作品发布 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统…

基于卷积神经网络的图像识别-案例实施1

案例描述 学习如何搭建CNN卷积神经网络&#xff0c;训练cifar-10数据&#xff0c;识别图片中的内容。 案例分析 cifar-10是由Hinton的学生Alex Krizhevsky和Ilya Sutskever整理的一个用于识别普适物体的小型数据集。一共包含 10个类别的 RGB 彩色图 片&#xff1a;飞机&…

GPT系列论文解读:GPT-3

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

最全解决docker配置kibana报错 Kibana server is not ready yet

问题复现&#xff1a; 在浏览器输入http://192.168.101.65:5601/ 访问kibana报错 Kibana server is not ready yet 问题报错&#xff1a; 首先查看kibana的日志 docker logs kibana 看到报错如下&#xff1a; {"type":"log","timestamp":&q…