




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档可能无法思考全面,请浏览后下载! 算法分析与设计实验报告第 七 次附加实验姓名学号班级时间12.26上午地点工训楼309 实验名称回溯法实验(最大团问题)实验目的1. 掌握回溯法求解问题的思想2. 学会利用其原理求解最大团问题实验原理问题描述:给定无向连通图G =(V,E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“()”表示,如果UV,且对任意两个顶点u,vU有(u,v)E,则称U是G的完全子图,G的完全子图是G的团当前仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。12345由上
2、图来看,(1,2,4)中每个顶点之间都相连接,并且都包含在图G中,所以(1,2,4)是一个图G的一个团,但是(1,2,3,4)由于(1,3)之间没有连线,所以没有保证所有顶点都连接,因此不是团,而(1,2,3)(1,5,4)(2,3,4)都是三顶点的团,而该图包含顶点数最多的团就是三个,因此(1,2,3)(1,5,4)(2,3,4)属于最大团,最大团问题就是求解这样的问题。程序中采用了一个比较简单的剪枝策略,即如果剩余未考虑的顶点数加上团中顶点数不大于当前解的顶点数,可停止继续深度搜索,否则继续深度递归当搜索到一个叶结点时,即可停止搜索,此时更新最优解和最优值。基本解题步骤:(1) 针对所给问
3、题,定义问题的解空间;(2) 确定易于搜索的解空间结构;(3) 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。7 / 7实验步骤(1)首先设最大团为一个空团,往其中加入一个顶点;(2)然后依次考虑每个顶点,查看该顶点加入团之后仍然构成一个团,如果可以,考虑将该顶点加入团或者舍弃两种情况,如果不行,直接舍弃,然后递归判断下一顶点;(3)可采用剪枝策略来避免无效搜索;(4)为了判断当前顶点加入团之后是否仍是一个团,只需要考虑该顶点和团中顶点是否都有连接。关键代码void Clique:Backtrack(int i) /计算最大团 if(i>n) /到达叶子节点 for(i
4、nt j=1;j<=n;j+) bestxj=xj;bestn=cn;cout<<"最大团:(" for(int i=1;i<n;i+) cout<<bestxi<<"," cout<<bestxn<<")"<<endl; return; /检查当前顶点是否与当前团连接int ok=1;for(int j=1;j<i;j+) if(xj&&aij=0) /i与j不连接,即j在团中,但是i,j不连接 ok=0;break; if(o
5、k) /进入左子树 xi=1; cn+; Backtrack(i+1); /回溯到下一层节点 xi=0; cn-; /通过上界函数判断是否减去右子树,上界函数用于确认还有足够多的可选择顶点使得算法有可能在右子树中找到更大的团 if(cn+n-i>=bestn) /修改一下上界函数的条件,可以得到 xi=0; /相同点数时的解 Backtrack(i+1); 测试结果 当输入图如下时:12345当输入图如下时:12345当输入图如下时:12345实验分析通过三个实例图,我们只是简单的将最开始的原始图进行加边处理,可以发现结果就会发生变化。最大团问题可是比较典型的利用解空间的子集树进行深度搜
6、索,然后通过上界函数进行剪枝,只是此处的上界函数比较简单,只要判断是否还有做够的顶点能够构成最大团即可,相对于0-1背包问题和最优装载问题来说还是简单一点,其中主要注意的就是要加入现有团的顶点必须满足和所有的团内的顶点都有边相连,这样才能加入该团中,否则就不能加入团中。实验心得最大团问题和图的m着色问题用回溯法解很相似,他俩在对于判断的时候都比较简单,但是相比而言,由于最大团问题涉及到利用上届函数进行右子树剪枝,所以相比较而言复杂一点,最大团问题的上届函数和很多问题比如最优装载问题的上届函数原理是相同的,就是判断右子树当前节点最好的可能是否能够比当前最优解要好,如果当前节点的最好情况都不能超过
7、当前最优解,那么说明最优解绝对不会有该节点,因此可以将该节点所在的右子树剪掉,这样就减少了算法的查找和回溯的时间。这里要提一点的是在进行右子树剪枝的时候使用了大于等于,如果只是大于的话就没有办法找到顶点数相同的其他最优解了,同样找到叶子节点时则证明得到一个最优解,将其输出即可实验得分助教签名附录:完整代码(回溯法)/最大团问题 回溯法求解#include<iostream>using namespace std;class Cliquefriend void MaxClique(int *,int *,int );private:void Backtrack(int i);int
8、*a; /图的邻接矩阵int n; /图的顶点数int *x; /当前解int *bestx; /当前最优解int cn; /当前顶点数int bestn; /当前最大顶点数 ;void Clique:Backtrack(int i) /计算最大团 if(i>n) /到达叶子节点 for(int j=1;j<=n;j+) bestxj=xj;bestn=cn;cout<<"最大团:(" for(int i=1;i<n;i+) cout<<bestxi<<"," cout<<bestxn&l
9、t;<")"<<endl; return; /检查当前顶点是否与当前团连接int ok=1;for(int j=1;j<i;j+) if(xj&&aij=0) /i与j不连接,即j在团中,但是i,j不连接 ok=0;break; if(ok) /进入左子树 xi=1; cn+; Backtrack(i+1); /回溯到下一层节点 xi=0; cn-; /通过上界函数判断是否减去右子树,上界函数用于确认还有足够多的可选择顶点使得算法有可能在右子树中找到更大的团 if(cn+n-i>=bestn) /修改一下上界函数的条件,可以得到
10、 xi=0; /相同点数时的解 Backtrack(i+1); void MaxClique(int *a,int *v,int n) /初始化Y Clique Y; Y.x=new intn+1; Y.a=a; Y.n=n; Y.cn=0; Y.bestn=0; Y.bestx=v; Y.Backtrack(1); delete Y.x; cout<<"最大团的顶点数:"<<Y.bestn<<endl;int main()int n;cout<<"please input number of node:"
11、cin>>n; /int an+1n+1; /由于定义的是int *a,且采用的是二维数组传参,因此 int *a=new int *n+1; /两种解决方法,一是给定第二维的大小,二是通过 for(int i=0;i<=n;i+) /动态分配内存,这里采用了动态内存分配解决问题 ai=new intn+1;for(int i=0;i<n+1;i+) for(int j=0;j<n+1;j+) aij=0;int edge;cout<<"please input number of edge:"cin>>edge;cout<<"please input edge:"&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解除财务担保协议书模板
- 超市劳务合同协议版
- 证明旧合同无效补充协议
- 超合同价补协议范本
- 解除维修协议书范本
- 购买品牌空调合同协议
- 赞助合同终止协议范本
- 财产自愿转让合同协议
- 诈骗借款协议书范本
- 购买保险抵押合同协议
- 【课件】探索三角形全等的条件(SSS)课件+北师大版七年级数学下册+
- 2024-2025统编版道德与法治六年级下册期末考试卷附答案 (共3套)
- 2025年安徽省淮北市五校联考中考二模历史试题(含答案)
- 米、面制品安全生产与管理考核试卷
- 2024年7月1日实施新版医疗器械采购、收货、验收、贮存、销售、出库、运输和售后服务工作程序
- 小学二下必读书目《神笔马良》阅读测试题及答案
- 建设项目竣工验收阶段工程造价计价与控制
- 毕业设计(论文)自助洗车机设计
- 蒸压加气混凝土砌块薄层砌筑
- 超星尔雅学习通《高级英语写作》章节测试含答案
- 年产300万吨合格连铸坯转炉炼钢厂设计
评论
0/150
提交评论