欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    算法论文分治法和分支限界.docx

    • 资源ID:4079352       资源大小:149.93KB        全文页数:20页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    算法论文分治法和分支限界.docx

    1、算法论文分治法和分支限界成 绩 评 定 表学生姓名xx班级学号xx专 业信息与计算科学课程设计题目1.分治法解决最近距离问题2.分支限界解决旅行商售货员问题评语组长签字:成绩日期 20 年 月 日课程设计任务书学 院理学院专 业信息与计算科学学生姓名xx班级学号xx课程设计题目1.分治法解决最近距离问题2.分支限界解决旅行商售货员问题实践教学要求与任务:1、巩固和加深对计算机算法分析与设计基本知识的理解。2、初步掌握简单软件的分析方法和设计方法。3、了解与课程有关的工程技术规范,能正确解释和分析设计结果。4、具体任务(1)分治法解决最近距离问题(2)分支限界解决旅行商售货员问题工作计划与进度安

    2、排:第一天 查阅资相关料; 第二、三天 程序设计; 第四天 程序调试; 第五天 答辩指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要计算效率是一个古老的研究课题。科学技术的发展使得计算日趋复杂,计算量越来越大,许多理论上可计算的问题,常常由于其计算量巨大布变成了现实不可计算的问题,这就产生了理论可计算而现实不可计算的矛盾,而算法设计与分析的任务就是对各类具体的问题设计高质量的算法,以及研究设计算法的一般规律和方法。常用的算法设计方法主要有分治法、动态规划、贪婪法和回溯法等。问题一:运用分治法对多点最近距离问题进行算法设计,把问题分解为不是相互

    3、独立的子问题,计算保存子问题的答案,从而再求重复子问题时可以直接找到答案。通过反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。问题二:运用分支限界对旅行商售货员问题进行算法设计,求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。)分支限界法首先确定一个合理的限界函数,并根据限界函数确定目标函数的界;然后按照广度优先策略遍历问题的解空间树,在某一分支上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的目标函数的可能取值(对最小化问题,估算结点的下界,对最大化问题,估算结点的上界)。如果某孩子结点的目

    4、标函数值超出目标函数的界,则将其丢弃(从此结点生成的解不会比目前已得的更好),否则入待处理。 关键词: 算法设计与分析;分支限界法;分治法1分治法解决最近距离问题1.1 问题描述已知集合S中有n个点,分治法的思想就是将S进行拆分,分为2部分求最近点对。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR,L一般取点集S中所有点的中间点的x坐标来划分,这样可以保证SL和SR中的点数目各为n/2,(否则以其他方式划分S,有可能导致SL和SR中点数目一个为1,一个为n-1,不利于算法效率,要尽量保持树的平衡性)依次找出这两部分中的最小点对距离:L和R,记SL和SR中最小点对距离 = min(L,R

    5、),如图1.1:图1.1以L为中心,为半径划分一个长带,最小点对还有可能存在于SL和SR的交界处,如图1.1中的虚线带,p点和q点分别位于SL和SR的虚线范围内,在这个范围内,p点和q点之间的距离才会小于,最小点对计算才有意义。1.2 算法设计 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

    6、 如果原问题可分割成k个子问题,1kn ,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。 分治法在每一层递归上都有三个步骤: 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;

    7、 合并:将各个子问题的解合并为原问题的解。分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果

    8、具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。算法的时间复杂度:首先对点集S的点x坐标和y坐标进行升序排序,需要循环2nlogn次,复杂度为O(2nlogn)接下来在分治过程中,对于每个SyL中的点,都需要与SyR中的6个点进行比较O(n)= 2O(n/2) + (n/2)*6 (一个点集划分为左右两个点集,时间复杂度为左右两个点集加上中间区域运算之和)其解为O(n) O(3nlogn)因此总的时间复杂度为O(3nl

    9、ogn),比蛮力法的O(n2)要高效。1.3 算法实现#include#includestruct Point double x; double y; ; double ClosestPoints(Point S,int n) int i,j,a=0,b=0,c=0; int p=0,q=0; double dmin,k=99999.0,d1,d2,d,r25,m,sum=0; Point temp,S15,S25,P15,P25; if(n2) return k; for(i=0;i=i;j-)if(Sj.xSj-1.x) temp=Sj; Sj=Sj-1; Sj-1=temp; for(i

    10、=0;in;i+) sum+=Si.x; m=sum/(float)n; for(i=0;in;i+) if(Si.xm) S1a+=Si; else S2b+=Si; d1=ClosestPoints(S1,a); d2=ClosestPoints(S2,b); if(d1d2) d=d1; else d=d2; for(i=0;ia;i+) if(abs(S1i.x-m)d) P1p+=S1i; for(i=0;ib;i+) if(abs(S2i.x-m)d) P2q+=S2i; for(i=0;i=i;j-)if(P1j.yP1j-1.y) temp=P1j; P1j=P1j-1; P1

    11、j-1=temp; for(i=0;i=i;j-)if(P2j.yP2j-1.y) temp=P2j; P2j=P2j-1; P2j-1=temp; dmin=abs(P20.y-P10.y); for(i=0;iq;i+) for(j=0;jp;j+) if(abs(P2i.y-P1j.y)d) rc+=sqrt(P1i.x-P2j.x)*(P1i.x-P2j.x)+(P1i.y-P2j.y)*(P1i.y-P2j.y); dmin=r0; for(i=0;ic;i+) if(ridmin) dmin=ri; if(ddmin) return d; else return dmin; voi

    12、d main() int i,n; Point S100; cout请输入点的个数(小于等于100的正整数):n; cout请输入平面上的n个点的横纵坐标:endl; for(i=0;iSi.xSi.y; cout平面上最近两个点间的距离为:ClosestPoints(S,n)endl; 1.4 运行结果与分析图1.2问题1运行结果 输入4个不同点的坐标分别为4,5,6,1,2,10,7,8,输出平面上最近两个点的距离为4.47214。根据多组测试的数据来看,分治法解决该问题得效率比蛮力法要高效的多,但是如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治

    13、法,但一般用动态规划法较好。2分支限界解决旅行商售货员问题2.1 问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。 路线是一个带权图。如图1.3中各边的费用(权)为正数。图1.3的一条周游路线是包括V中的每个顶点在内的一条回路。周游路线的费用是这条路线上所有边的费用之和。旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在图1.3中找出费用最小的周游路线。 图1.32.2 算法设计 分支限界法类似于回溯法,也是一种在问题

    14、的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。针对本问题我们可以得出:1.利用二维数组保存图信息City_GraphMAX_SIZEMAX_SIZE,其中City_Graphij的值代表的是城市i与城市j之间的路径费用,一旦一个城市没有通向另外城市的路,则不可能有回路,不用再找下去了 2. 我们可以任意选择一个城市,作为出发点。(因为最后都是一个回路,无所谓从哪出发)。算法

    15、的基本思路: 首先考虑s=n-2的情形,此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。当sn-2时,算法依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x0:s,其可行儿子结点是从剩余顶点xs+1:n-1中选取的顶点xi,且(xs,xi)是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x0:s,xi)的费用cc和相应的下界lcost。当lcostbestc时,将这个可行儿子结点插入到活结点优先队列中,算法中while循环的终止条件是排列树的一个叶结

    16、点成为当前扩展结点。当s=n-1时,已找到的回路前缀是x0:n-1,它已包含图G的所有n个顶点。因此,当s=n-1时,相应的扩展结点表示一个叶结点,此时该叶结点所相应的回路的费用等于cc和lcost的值,剩余的活结点的lcost值不小于已找到的回路的费用,它们都不可能导致费用更小的回路。因此已找到叶结点所相应的回路是一个最小费用旅行售货员回路,算法结束时返回找到的最小费用,相应的最优解由数组v给出。2.3 算法实现#include #include using namespace std; /-宏定义- #define MAX_CITY_NUMBER 10 /城市最大数目 #define MA

    17、X_COST 10000000 /两个城市之间费用的最大值 /-全局变量- int City_GraphMAX_CITY_NUMBERMAX_CITY_NUMBER; /表示城市间边权重的数组 int City_Size; /表示实际输入的城市数目 int Best_Cost; /最小费用 int Best_Cost_PathMAX_CITY_NUMBER; /最小费用时的路径 /-定义结点- typedef struct Node int lcost; /优先级 int cc; /当前费用 int rcost; /剩余所有结点的最小出边费用的和 int s; /当前结点的深度,也就是它在解数

    18、组中的索引位置 int xMAX_CITY_NUMBER; /当前结点对应的路径 struct Node* pNext; /指向下一个结点 Node; /-定义堆和相关对操作- typedef struct MiniHeap Node* pHead; /堆的头 MiniHeap; /初始化 void InitMiniHeap(MiniHeap* pMiniHeap) pMiniHeap-pHead = new Node; pMiniHeap-pHead-pNext = NULL; /入堆 void put(MiniHeap* pMiniHeap,Node node) Node* next; N

    19、ode* pre; Node* pinnode = new Node; /将传进来的结点信息copy一份保存 /这样在函数外部对node的修改就不会影响到堆了 pinnode-cc = node.cc; pinnode-lcost = node.lcost; pinnode-pNext = node.pNext; pinnode-rcost = node.rcost; pinnode-s = node.s; pinnode-pNext = NULL; for(int k=0;kxk = node.xk; pre = pMiniHeap-pHead; next = pMiniHeap-pHead

    20、-pNext; if(next = NULL) pMiniHeap-pHead-pNext = pinnode; else while(next != NULL) if(next-lcost) (pinnode-lcost) /发现一个优先级大的,则置于其前面 pinnode-pNext = pre-pNext; pre-pNext = pinnode; break; /跳出 pre = next; next = next-pNext; pre-pNext = pinnode; /放在末尾 /出堆 Node* RemoveMiniHeap(MiniHeap* pMiniHeap) Node*

    21、pnode = NULL; if(pMiniHeap-pHead-pNext != NULL) pnode = pMiniHeap-pHead-pNext; pMiniHeap-pHead-pNext = pMiniHeap-pHead-pNext-pNext; return pnode; /-分支限界法找最优解- void Traveler() int i,j; int temp_xMAX_CITY_NUMBER; Node* pNode = NULL; int miniSum; /所有结点最小出边的费用和 int miniOutMAX_CITY_NUMBER; /保存每个结点的最小出边的索

    22、引 MiniHeap* heap = new MiniHeap; /分配堆 InitMiniHeap(heap); /初始化堆 miniSum = 0; for (i=0;iCity_Size;i+) miniOuti = MAX_COST; /初始化时每一个结点都不可达 for(j=0;j0 & City_GraphijminiOuti) /从i到j可达,且更小 miniOuti = City_Graphij; if (miniOuti = MAX_COST)/ i 城市没有出边 Best_Cost = -1; return ; miniSum += miniOuti; for(i=0;il

    23、cost = 0; /当前结点的优先权为0 也就是最优 pNode-cc = 0; /当前费用为0(还没有开始旅行) pNode-rcost = miniSum; /剩余所有结点的最小出边费用和就是初始化的miniSum pNode-s = 0; /层次为0 pNode-pNext = NULL; for(int k=0;kxk = Best_Cost_Pathk; /第一个结点所保存的路径也就是初始化的路径 put(heap,*pNode); /入堆 while(pNode != NULL & (pNode-s) City_Size-1) /堆不空 不是叶子 for(int k=0;kxk

    24、; /将最优路径置换为当前结点本身所保存的 /* * * pNode 结点保存的路径中的含有这条路径上所有结点的索引 * * x路径中保存的这一层结点的编号就是xCity_Size-2 * * 下一层结点的编号就是xCity_Size-1 */ if (pNode-s) = City_Size-2) /是叶子的父亲 int edge1 = City_Graph(pNode-x)City_Size-2(pNode-x)City_Size-1; int edge2 = City_Graph(pNode-x)City_Size-1(pNode-x)0; if(edge1 = 0 & edge2 =

    25、0 & (pNode-cc+edge1+edge2) cc + edge1+edge2; pNode-cc = Best_Cost; pNode-lcost = Best_Cost; /优先权为 Best_Cost pNode-s+; /到达叶子层 else /内部结点 for (i=pNode-s;ixpNode-spNode-xi = 0) /可达 /pNode的层数就是它在最优路径中的位置 int temp_cc = pNode-cc+City_GraphpNode-xpNode-spNode-xi; int temp_rcost = pNode-rcost-miniOutpNode-xpNode-s; /下一个结点的剩余最小出边费用和 /等于当前结点的rcost减去当前这个结点的最小出边费用 if (temp_cc+temp_rcostBest_Cost) /下一个结点的最小出边费用和小于当前的最优解,说明可能存在更优解 for (j=0;jxpNode-s+1 = Best_Cost_Pathi; /将当前结点的编号放入路径的深度为s+1的地方 temp_xi =


    注意事项

    本文(算法论文分治法和分支限界.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开