版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.摘要当今科技迅速发展, 运用计算机解决实际问题变得异常重要。 尤其是运用计算机实现算法设计具要重大意义。 算法设计与分析, 其实可以解释为一种优化问题,一般是对可以利用计算机解决的离散型问题的优化。 主要目的就是为了解决某一问题而提出的各种不同的解决方案, 并且要针对具体问题做细致的空间与时间复杂度分析。本文是运用动态规划法解决租用游艇问题和回溯法解决部落卫队问题。利用 C+编程实现算法。动态规划算法是将待求解的问题分解成若干个子问题, 先求解子问题, 然后从这些子问题的解得到原问题的解。 首先找出最优解的性质, 并刻画其结构特征,然后递归的定义最优值 (写出动态规划方程) 并且以自底向上的
2、方式计算出最优值,最后根据计算最优值时得到的信息,构造一个最优解。回溯法算法是确定了解空间的组织结构后, 回溯法从开始节点 (根结点)出发,以深度优先的方式搜索整个解空间。 这个开始节点就成为一个活结点, 同时也成为当前的扩展结点。 在当前的扩展结点处, 搜索向纵深方向移至一个新结点。这个新结点就成为一个新的或节点, 并成为当前扩展结点。 如果在当前的扩展结点处不能再向纵深方向移动, 则当前的扩展结点就成为死结点。 换句话说,这个节点,这个结点不再是一个活结点。此时,应往回(回溯)移动至最近一个活结点处,并使这个活结点成为当前的扩展结点。 回溯法即以这种工作方式递归的在解空间中搜索, 直到找到
3、所要求的解或解空间中以无活结点为止。 即通过确定初始解和剪枝函数原则画出状态图进行搜索产生全部可行解。关键字:动态规划法、租用游艇问题、回溯法、部落卫队问题、C+.z.目录一、 动态规划法解决租用游艇问题.11.1问题重述 .11.2问题分析 .11.3算法原理与设计 .21.3.1算法原理 .21.3.2算法设计 .21.4算法实现与结果 .31.5结果描述 .4二、回溯法解决部落卫队问题 .52.1问题重述 .52.2问题分析 .52.3算法原理及设计 . .62.3.1算法原理 .62.3.2算法设计 .72.4算法实现 .82.5结果描述 .10三、总结 .12参考文献 .13.z.z
4、.一、动态规划法解决租用游艇问题1.1问题重述长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,n 。有可以游艇出租站用游艇并在下游的任何一个游艇出租站归还游艇。游艇出租站 i 到游艇出租站 j 之间的租金为 r(i,j),。试设计一个算法,计算游艇出租站 1 到出租站 n 所需的最少租金。对于给定的游艇出租站i到游艇出租站 j之间的租金为 r(i,j),1<=i<j<=n,编程计算从游艇出租站1 到游艇出租站 n 所需的最少租金。 由文件提供输入数据。文件的第 1 行中有 1 个正整数 n(n<=200),表示有 n 个游艇出租站。接下来的 n-1 行是一个半矩阵r
5、(i,j),1<=i<j<=n。程序运行结束时,将计算出的从游艇出租站 1 到游艇出租站 n 所需的最少租金输出到文件中。输入文件示例输出文件示例 123125 1571.2 问题分析将每个出租站看作一个点, 站与站之间的关系可以用有向无环图表示,同时站与站之间的租金为边的权。 此问题可转化成求站1 到站 n 的最短路径问题。 用动态规划求解,递推方程如下所示:定义 fij为站点 i 到站点 j 的最少租金。 ,i<k<j,1<=i,j<=n.初始最优解为。.z.1.3 算法原理与设计算法原理本文主要适用动态规划法的思想求解,其基本思想时将原问题分解为
6、若干个子问题,先求解子问题, 然后从这些子问题的解得到原问题的解。该方法主要应用于最优化问题, 这类问题会有多种可能的解,每个解都有一个值, 而动态规划找出其中最优 ( 最大或最 ) 值的解。若存在若干个取最优值的解的话,它只取其中的一个。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问题不独立,也允许其通过自身子问题的解作出选择, 该方法对每一个子问题只解一次, 并将结果保存起来,避免每次碰到时都要重复计算。因此,动态规划法所针对的问题有一个显著的特征,即它所对应的子问题树中的子问题呈现大量的重复。动态规划法的关键就在于,对于重复
7、出现的子问题, 只在第一次遇到时加以求解, 并把答案保存起来,让以后再遇到时直接引用,不必重新求解。设计动态规划法一般包含以下4 个步骤为:找出最优解的性质,并刻画其结构特征;递归地定义最优值;以自底向上的方法计算出最优解;根据计算最优值得到的信息,构造最优解。算法设计int main()int num,i,j,k;for(k=2;k<num;k+)for(i=0;i<num-k;i+)int mark=i+k;for(j=i+1;j<mark;j+).z.if(listij+listjmark<listimark)listimark=listij+listjmark;
8、cout<<list0num-1;return 0;本课设中list0n-1代表所用租金最少,n 为游艇出租站的个数。Listij表示从第 i 个游艇出租站到第j 个游艇出租站的费用(其中i<j )。当 listij+listjmark<listimark时, listimark=listij+listjmark。则递归方程为list0n-1=minlist0k+listkn-1,list0n-11.4 算法实现与结果程序代码:#include <iostream>#include <vector>using namespace std;int
9、main()int num,i,j,k,tmp;cin>>num;vector< vector<int> >list;vector<int>line;for(i=0;i<num-1;i+)list.push_back(line);for(j=0;j<=i;j+)/ 在容器前面添加些0,从而使 listij 表示从第i 个出租站到第 j 个出租站所需的金额 / 同时也去除无效的表示,比如 list00 直接赋值为 0,从而使后面的计算更方便listi.push_back(0);for(j=i+1;j<num;j+).z.cin&g
10、t;>tmp;listi.push_back(tmp);/ 从 i+1 个出租站到第j+1 个出租站所需金额for(k=2;k<num;k+) / 从两个出租站开始, 逐步计算每几个出租站之间的最优解,最终计算 num-1 个出租站合并的最优解for(i=0;i<num-k;i+)int mark=i+k;for(j=i+1;j<mark;j+)if(listij+listjmark<listimark) / 例 如 list01+list12<list02, 则改变 list02 的值listimark=listij+listjmark;cout<&
11、lt;list0num-1;return 0;1.5 结果描述运行结果如图 1.1 所示。.z.图 1.1租用游艇问题运行结果如图 1 所示,含有 3 个游艇出租站,从出租站 1 到出租站 2,3 分别需要租金为 5,15,从出租站 2 到出租站 3 需要租金为 7,则运用动态规划法求解出从出租站 1 到出租站 3 所需最少租金为 12。二、回溯法解决部落卫队问题2.1 问题重述原始部落 byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都是他的仇敌。 部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。2.2 问
12、题分析本问题为组织一支队伍保卫部落,并且卫队中任意2 人不能有仇敌关系,因.z.而,实际可考虑在居民中选择一个最大独立团体问题。构建一个树状图 G,居民为树状图 G的顶点,居民间的关系为树状图的边界线。“ 1”表示两个居民间没有仇敌关系, “ 0”表示两个居民间有仇敌关系。这样最大独立团问题就成了图 G顶点集的子集的选取问题, 可用子集树表示问题的解空间。设当前考察结点位于解空间树的第 i 层。先考虑顶点到要选入独立团中的所有结点都要相连 (即无仇敌关系) 且任意两个结点都仇敌关系, 然后进入左子树进行深度优先遍历,在进入右子树。2.3 算法原理及设计算法原理具有限界函数的深度优先的方式系统第
13、搜索问题的解的算法称为回溯法。 它可以系统地搜索某一个问题的所有解或任一解。 回溯法是一个既带有系统性又带有跳跃性的搜索算法。 它在包含问题的所有解的解空间树中, 按照深度优先的策略,从根结点出发搜索解空间树。 算法搜索至解空间树的任一结点时, 总是先判断该结点是否肯定不包含问题的解。 如果肯定不包含, 则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。 回溯法在用来求问题的所有解时, 要回溯到根, 且根结点的所有子树都已被搜索遍才结束。 而回溯法在用来求问题的任一解时, 只要搜索到问题的一个解就可以结束。它适用于解一些组合数较大的问题
14、。回溯法搜索解空间树时, 通常采用两种策略避免无效搜索, 提高回溯法的搜索效率。其一是用约束函数在扩展结点处剪去不满足约束的子树; 其二是用限界函数剪去得不到最优解的子树。这两类函数统称为剪枝函数。问题的解空间: 应用回溯法解问题时, 首先应明确定义问题的解空间。 问题的解空间应到少包含问题的一个(最优)解。运用回溯法解题通常包含以下3 个步骤:( 1)针对所给问题,定义问题的解空间;( 2)确定易于搜索的解空间结构;( 3)以深度优先的方式搜索解空间, 并在搜索过程中用剪枝函数避免无效搜.z.索。对于本题来说,回溯法操作步骤如下:(1) 针对所给问题,定义问题的解空间;确定易于搜索的解空间结
15、构;以深度优先方式搜索解空间,并在搜索过程中利用剪枝函数剪去无效的搜索。(2) 无向图 G的最大团问题可以看作是图 G的顶点集 V 的子集选取问题。因此可以用子集树表示问题的解空间。设当前扩展节点 Z 位于解空间树的第 i 层。在进入左子树前,必须确认从顶点 i 到已入选的顶点集中每一个顶点都有边相连。在进入右子树之前, 必须确认还有足够多的可选择顶点使得算法有可能在右子树中找到更大的团。(3) 用邻接矩阵表示图 G,n 为 G的居民数, cn 存储当前卫队数, bestn 存储最大卫队人数。 cn+n-i 为进入右子树的上界函数,当 cn+n-i<bestn 时,不能在右子树中找到更大
16、的卫队团,利用剪枝函数可将 Z 的右结点剪去。算法设计void Backtrack(int i,int a2020)if(i>n)for(int j=1;j<=n;j+) bestxj=xj;bestn=cn;return;int ok=1;for(int j=1;j<i;j+)if(xj&&aij=0)ok=0;break;if(ok)xi=1;cn+;Backtrack(i+1,a);xi=0;.-;if(cn+n-i>bestn)xi=0;Backtrack(i+1,a);用回溯法解决部落卫队问题时,以深度优先方式搜索整个解空间,用完全二叉
17、树表示解空间。 剪枝条件为: 当前卫队人数 +剩余居民人数 <当前最优解; 得出的解用一个 n 元向量 V=(x1,x2,.,xn)来表示。2.4 算法实现程序代码:#include <iostream.h>#include <stdlib.h>#include <stdio.h>class cliquefriend maxclique(int a2020,int ,int);private:void Backtrack(int i,int a2020);int n,*x,/ 当前解*bestx,/ 当前最优解cn ,/ 当前卫队人数bestn;/ 当
18、前最大卫队人数;void clique:Backtrack(int i,int a2020)if(i>n)for(int j=1;j<=n;j+) bestxj=xj;bestn=cn;return;int ok=1;for(int j=1;j<i;j+)if(xj&&aij=0).z.ok=0;break;if(ok)xi=1;cn+;Backtrack(i+1,a);xi=0;cn-;if(cn+n-i>bestn)xi=0;Backtrack(i+1,a);int maxclique(int a2020,int v,int n)clique Y;Y
19、.x=new intn+1;Y.n=n;Y.cn=0;Y.bestn=0;Y.bestx=v;Y.Backtrack(1,a);delete Y.x;return Y.bestn;int main(void)int i,j,k;int v20;int n,edge; /顶点和边数int a2020;cout<<"请输入人数 :"cin>>n;for(i=1;i<=n;i+)vi=0;for(i=1;i<=n;i+).z.for(j=i;j<=n;j+)aij=aji=1;cout<<"请输入这 "&l
20、t;<i-1<<"个人的所有敌对关系 "cin>>edge;for(i=1;i<=edge;i+)cin>>j>>k;ajk=akj=0;cout<<maxclique(a,v,n)<<endl;for(i=1;i<=n;i+)cout<<vi<<' 'return 0;system("pause");2.5 结果描述运行结果如图 2.1 所示。图 2.1部落卫队输出结果如图 2 所示,部落居民人数为7 个,存在敌对关系分别为
21、 (1,2),(1,4),(2,.z.3),( 2,4),( 2,5),(2,6),(3,5),(3,6),( 4,5),( 5,6)时,输出最优解空间为( 1,0,1,0,0,0,1),组织卫队人数最大值为 3。由此可画出居民人数 n=7 时的解空间树如图 2.2 所示。i=10=0,best n=010cn=1,best n=0cn=0,best n=3i=21171010=1,best n=0cn=1,best n=3 =0,best n=3i=3231821×101010cn=2,best n=0=1,best n=3cn=1,best n=3=1,best n=3=0,be
22、st n=3i=4412192022271010×+n-ibest n10cn+n-ibest n××=2,best n=0 =1,best n=3cn=2,best n=3=1,best n=3i=55613142326×10×1 010+n-ibest n=2,best n=0=2cn=1,best n=3cn=2,best n=3 ×best n=32425i=67816×15+n-ibest n ×cn+n-ibest n10 ×××=2,best n=0i=7910× 1 =3,best n=0i=811best n=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数据驱动的机器学习算法设计与开发高性能橡胶材料
- 车辆驾驶培训与考试指南
- 针织厂设备二级保养制度
- 初二第一学期班级工作计划
- 护理信息技术应用与展望
- 手术室护理质量持续改进方法
- 部编人教版三年级语文上册《期末考试》测试题及参考答案
- 学校“双减”工作落实情况汇报四篇
- 施工方案安全软件(3篇)
- 穿墙螺栓施工方案(3篇)
- 2026春教科版科学二年级下册教学计划及进度表
- GB/T 24016-2026环境管理环境报告鉴证指南
- 2026广西玉林市老年大学招聘编外人员1人考试参考试题及答案解析
- 2026年工地复工复产方案(5篇)课件
- 2025版《煤矿安全规程》学习辅导课件(地质防治水部分解读)
- 《客房服务与管理》全套教学课件
- 建筑工程应急体系构建
- 学生校园欺凌治理工作教育培训和预防预警机制
- 综合医院骨质疏松多学科门诊(MDT)诊疗方案
- 2026年高考物理二轮复习策略讲座
- 《Office 2021基础与应用》课件-项目1 初识文档
评论
0/150
提交评论