圆排列问题..pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
圆排列问题.

圆排列问题 040320187 石曼银 问题描述: 给定n个大小不等的圆 C1,C2,…,Cn,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。 例如,当n=3,且所给的3 个圆的半径分别为1,1,2时,这3个圆的最小长度的圆排列如图所示。其最小长度为2+4   编程任务: 对于给定的n个圆,设计一个优先队列式分支限界法,计算n个圆的最佳排列方案,使其长度达到最小 思想历程 解题思路 1.脑海里出现三个圆和四个圆 用贪心算法先求一个近似最优解? 用贪心算法求一个最优解? 从上面的圆的情况发现,尽量让小圆靠近大圆,能够节省圆排列的长度,可以用贪心算法先求出一个近似的最优解. 然后以此最优解为剪枝条件,在叶结点处剪枝. 程序如下: //用贪心策略求最佳排列 double bestL=0; int end=0; if(n%2==0){ bestL=r[0]; end=n-1; } else{ end=n-1; bestL=r[end]+a[end][0]; --end; } for(i=0;in/2;i++){ if(a[i][end]+a[end][i+1]a[i][i+1]) bestL+=a[i][end]+a[end][i+1]; else bestL+=a[i][i+1]; --end; } bestL+=r[end+1]; 用贪心算法求一个最优解? 这种方法求出的圆排列长度,在有些情况下是错误的.例:76 58 1 2 求出的结果是:174.011 而正确结果是:266.182 由此,也想到了求圆排列长度的方法有误,书上的是正确的. 贪心求近似最优解无效 剪枝策略 2.脑海里出现多个圆 贪心求近似最优解无效 剪枝策略 由刚才的例子,明显看出贪心无效,但是却让我想到一种剪枝策略. 若在某个圆排列中有三个挨着的圆是按降序或升序排列,则此圆排列一定不是最小长度的圆排列. 先看特例:(26.9176)(266.182)(309.719) 贪心求近似最优解无效 剪枝策略 求证:任何含有三个挨着的按升序或降序排列的圆的圆排列一定不是最小长度的圆排列。 证明: 用反证法。假设结论不成立,则其否命题为:存在一个含有三个挨着的按升序或降序排列的圆的圆排列是最小长度的圆排列。 (转不妨设文档)                        剪枝策略的效率分析 剪枝策略的效率分析:(看比较示例) 假设每个圆的半径都不相同,则剪掉的排列有:C(n,3)P(n-2) = (n(n-1)(n-2)/6)(n-2)! 又在每个当前圆处,都要进行O(2n)次计算 所以当n较大时,可以节省很多时间,即使到了离叶结点很近的地方 正确的求圆排列长度的方法 3.脑海里出现多个特殊圆 正确的求圆排列长度的方法 正确的求圆排列长度的方法 1.求圆心坐标时,不能直接从倒数第二个圆开始,必须从第一个开始,依次算过去. 2.求当前圆排列的长度时,也是要从第一个圆开始,依次算过去. 所以,每个圆结点必须记录到该圆时的圆排列,还得记录它的儿子们               正确的求圆排列长度的方法 //求圆心坐标 void CircleNode::Center() { double temp=0; for(int i=1;iend;i++){ double valuex=x[i]+2.0*sqrt(r[end]*r[i]); if(valuextemp) temp=valuex; } x[end]=temp; }

文档评论(0)

叮当文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档