收藏 分享(赏)

算法论文:分治法和分支限界.doc

上传人:精品资料 文档编号:10300177 上传时间:2019-10-28 格式:DOC 页数:27 大小:159.22KB
下载 相关 举报
算法论文:分治法和分支限界.doc_第1页
第1页 / 共27页
算法论文:分治法和分支限界.doc_第2页
第2页 / 共27页
算法论文:分治法和分支限界.doc_第3页
第3页 / 共27页
算法论文:分治法和分支限界.doc_第4页
第4页 / 共27页
算法论文:分治法和分支限界.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

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

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

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

4、) 。如果某孩子结点的目标函数值超出目标函数的界,则将其丢弃(从此结点生成的解不会比目前已得的更好) ,否则入待处理。关键词: 算法设计与分析;分支限界法;分治法V目 录1 分治法解决最近距离问题 11.1 问题描述 11.2 算法设计 21.3 算法实现 31.4 运行结果与分析 62 分支限界解决旅行商售货员问题 72.1 问题描述 72.2 算法设计 82.3 算法实现 92.4 运行结果与分析 .14总结 .15参考文献 .1611 分治法解决最近距离问题1.1 问题描述已知集合 S 中有 n 个点,分治法的思想就是将 S 进行拆分,分为 2 部分求最近点对。算法每次选择一条垂线 L,

5、将 S 拆分左右两部分为 SL 和 SR,L 一般取点集 S 中所有点的中间点的 x 坐标来划分,这样可以保证 SL 和 SR 中的点数目各为 n/2, (否则以其他方式划分 S,有可能导致 SL 和 SR 中点数目一个为 1,一个为 n-1,不利于算法效率,要尽量保持树的平衡性)依次找出这两部分中的最小点对距离:L 和 R,记 SL 和 SR 中最小点对距离 = min(L,R) ,如图 1.1:图 1.1以 L 为中心, 为半径划分一个长带,最小点对还有可能存在于 SL 和 SR的交界处,如图 1.1 中的虚线带,p 点和 q 点分别位于 SL 和 SR 的虚线范围内,在这个范围内,p 点

6、和 q 点之间的距离才会小于 ,最小点对计算才有意义。21.2 算法设计 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治策略是:对于一个规模为 n 的问题,若该问题可以容易地解决(比如说规模 n 较小)则直接解决,否则将其分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。 如果原问题可分割成 k 个子问题,1#includestruct Pointdouble x;double y;4;double ClosestPoints(

7、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(n=i;j-)if(Sj.x=i;j-)if(P1j.y=i;j-)if(P2j.yn;coutSi.xSi.y;cout #include using namespace std; /-宏定义- #define MAX_CITY_NUMBER 10 /城市最大数目 #define MAX_COST 10000000 /两个城市之间费用的最大值 /-全局变量-

8、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; /剩余所有结点的最小出边费用的和 12int s; /当前结点的深度,也就是它在解数组中的索引位置 int xMAX_CITY_NUMBER; /当前结点对

9、应的路径 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; Node* pre; Node* pinnode = new Node;

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

11、eap-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) 14Node* pnode = NULL; if(pMiniHeap-p

12、Head-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; /保存每个结点的最小出边的索引 MiniHeap* heap = new MiniH

13、eap; /分配堆 InitMiniHeap(heap); /初始化堆 miniSum = 0; for (i=0;i0 /当前结点的优先权为 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 != NU

14、LL /将最优路径置换为当前结点本身所保存的 /* * * 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 pNode-

15、cc = Best_Cost; pNode-lcost = Best_Cost; /优先权为 Best_Cost pNode-s+; /到达叶子层 17else /内部结点 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 减去当前这个结点

16、的最小出边费用 if (temp_cc+temp_rcostxpNode-s+1 = Best_Cost_Pathi; /将当前结点的编号放入路径的深度为 s+1 的地方 temp_xi = Best_Cost_PathpNode-s+1; /将原路/径中的深度为 s+1 的结点编号放入当前路径的 /相当于将原路径中的的深度为 i 的结点与深度 W 为 s+1 的结点交换 Node* pNextNode = new Node; pNextNode-cc = temp_cc; 18pNextNode-lcost = temp_cc+temp_rcost; pNextNode-rcost = te

17、mp_rcost; pNextNode-s = pNode-s+1; pNextNode-pNext = NULL; for(int k=0;kxk = temp_xk; put(heap,*pNextNode); delete pNextNode; pNode = RemoveMiniHeap(heap); int main() int i,j;printf(“请输入旅行的节点数:“);scanf(“%d“, for(i=0;iCity_Size;i+) printf(“请分别输入每个节点与其它节点的路程花费:“);for(j=0;jCity_Size;j+) scanf(“%d“, 19

18、Traveler(); printf(“最小花费“%dn“,Best_Cost); return 1; 2.4 运行结果与分析图 2.1 问题 2 运行结果输入测试数据,我们可以得到该问题得最小花费为25。由于求解目标不同,导致分支限界法与回溯法在解空间树 T 上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树 T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树 T。分支限界法的搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支) ,然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界) ,并根据这

19、些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最20优解的分支推进,以便尽快地找出一个最优解。 总结在本次课程设计中,也遇到了许许多多这样那样的问题,有的是专业上的问题,有的是论文格式上的问题,在一直得到老师的亲切关怀和悉心指导,使我的论文可以又快又好的完成,同时也加深了我对算法分析与设计这门课程的理解,结合实际问题,运用我们所学的知识去解决,这无疑是对老师的肯定,也是对我们的肯定。老师以其渊博的学识、严谨的治学态度、求实的工作作风给我留下了深刻的印象,我将终生难忘我的老师对我的亲切关怀和悉心指导,再一次向他表示衷心的感谢。2122参考文献1 陈莹.廖利.0-1 背包问题J.电脑知识与技术_研究开发,2005.5:96-97.2 朱红.算法设计与分析M.上海:上海科学技术文献出版社,19893 张文修.梁怡.遗传算法的数学基础M.西安:西安交通犬学出版社,2001.4 COILEM TH,LEISERSON CE Introducetion to AlgorithmsM。Massachusetts:The MIT Press,2002.5 雷鹏 , 朱大铭, 马绍汉, 0/1 背包问题算法研究新趋势 2001 年全国理论计算机科学学术会议 2001 年全国理论计算机科学学术会议论文集, 2001年.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报