- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
9、回溯法求解哈密尔顿回路
数学与计算机学院
课程设计说明书
课 程 名 称: 算法设计与分析-课程设计
课 程 代 码: 7106620
题 目: 回溯法求解一般哈密尔顿回路
年级/专业/班:
学 生 姓 名:
学 号:
开 始 时 间: 2010 年 12 月 27 日
完 成 时 间: 2011 年 01 月 07 日
课程设计成绩:
学习态度及平时成绩(30) 技术水平与实际能力(20) 创新(5) 说明书撰写质量(45) 总 分(100) 指导教师签名: 年 月 日
目 录
1 引 言 1
1.1 问题的提出 1
1.2任务与分析 1
2 算法 1
2.1递归回溯法求解哈密顿尔回路算法 1
2.2非递归回溯法求解哈密顿尔回路算法 2
3 设计方案 3
3.1整体设计方案 3
3.2 程序递归算法的主要代码 3
3.3程序非递归算法的主要代码 4
3.4程序的其他函数 5
4 系统测试 6
4.1测试数据 6
4.2程序的录入、编译和连接 7
4.3运行程序 7
4.4进入主界面 8
4.4测试递归回溯法求解图的所有哈密顿尔回路 8
4.5测试非递归回溯法求解图的所有哈密顿尔回路 9
4.6测试第二组数据 9
4.7测试退出模块 10
结 论 11
致 谢 12
参考文献 13
摘 要
本次我的课程设计题目是“用回溯法求解一般哈密尔顿回路问题”,主要内容是给出用回溯法求解一般哈密尔顿回路问题的算法并编程实现。所涉及到的知识是《算法设计与分析》中的回溯法,以及《图论》中的哈密顿尔回路。回溯法:从根结点出发,按照深度优先策略遍历解空间树,搜索满足约束条件的解。哈密顿回路:从某顶点开始,经过图G全部顶点一次回到起点的回路。
关键词:回溯法 哈密顿尔回路 算法 编程实现
1 引 言
1.1 问题的提出
我所做的课程设计就是用回溯法求解一般哈密尔顿回路问题,即从某顶点开始,经过图G全部顶点一次回到起点的回路。
1.2任务与分析
本课程设计主要的目的是:
通过回溯的方法找出图的一般哈密顿尔回路,并且能够输出。
题目分析:
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。
哈密顿回路:从某顶点开始,经过图G全部顶点一次回到起点的回路。
2 算法
2.1递归回溯法求解哈密顿尔回路算法
2.1.1递归求图的所有哈密顿尔回路算法
1)解向量用数组X[1...n]表示;X[k]=0 无合法顶点;X数组初始化为0;
2)若k=n时,需检查x[k]是否有边与x[1]相连(回到起点,构成回路)
3)用 k = 1 启动(指定哈密顿回路的起点)
由此可得以下算法:
status hamilton(int k )
{
if(kn-1 c[x[k-1]][0]==1)
{
output(x);
flag=1;
}
else
for(int i=k;in;i++)
{
swap(x[k],x[i]);
if ( c[x[k-1]][x[k]]==1)
hamilton(k+1);
swap(x[i],x[k]);
}
}
2.2非递归回溯法求解哈密顿尔回路算法
2.2.1非递归回溯法求图的所有哈密顿尔回路算法
假定图G=(V, E)的顶点集为V={1, 2, …, n},则哈密顿回路的可能解表示为n元组X=(x1, x2, …, xn),其中,xi∈{1, 2, …, n} ,并有如下约束条件:
由此可得以下算法:
1.将顶点数组x[n]初始化为0,标志数组visited[n]初始化为0;
2.k=1; visited[1]=1; x[1]
文档评论(0)