西北工业大学算法设计实验三.doc_第1页
西北工业大学算法设计实验三.doc_第2页
西北工业大学算法设计实验三.doc_第3页
西北工业大学算法设计实验三.doc_第4页
西北工业大学算法设计实验三.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三:遗传算法VS回溯法一、问题分析回溯法可以处理货郎担问题,遗传算法也可以处理货郎担问题,回溯法和遗传算法哪个算法处理货郎担问题效率更高呢?在相同计算时间内,哪个算法得到的解更好呢?实现遗传算法,通过随机产生10个不同规模的算例(城市数量分别为10,20,40,80,100,120,160,180,200,500,或者其它规模),比较上次实验实现的回溯法和遗传算法。二、算法基本思想1、回溯法从初始状态出发,搜索其所能到达的所有“状态”,当一条路走到尽头 ,再后退一步或若干步,从另外一种状态出发,继续搜索,直到所有的路径都搜索过。这种不断前进 、不断回溯寻找解的方法叫回溯法。回溯法通常将问题解空间组织成“树”结构,采用系统的方法搜索解空间树,从而得到问题解。搜索策略:深度优先为主,也可以采用广度优先、函数优先、广度深度结合等。避免无效搜索策略:约束函数:在扩展结点处剪去不满足约束条件的子树界限函数:在扩展结点处剪去得不到最优解的子树2、遗传算法首先针对遗传算法要有种群,个体,适应度函数,选择,交叉,变异。对于种群是由若干个个体组成,其中个体的编码可以用走过的每一个城市的路径表示。适应度函数用一个路径的代价的倒数表示。使用轮盘赌的方式进行选择下一代个体。其中轮盘赌的方式可以转换为每一个个体的适应度与种群的适应度的比例进行比较。先随机选择两个个体,根据交叉的概率进行单点交叉,将较优的交叉结果保留下来。接着在种群中选择一个个体,根据变异概率来判断是否变异,将该个体保留,根据生成的子代的个数重复上述的运算。根据指定的代数,重复上述的运算。三、算法设计1、回溯法TSP问题的目的是得到一条路径,即一个解向量(X1,X2.Xn),为排列树问题。对所有城市进行编号后,按大小顺序存储于数组path中,构造一个交换函数swap();对数组path进行遍历,判断当前城市与目标城市是否连通,若连通,通过swap函数对当前节点和目标城市进行交换,即树的节点拓展。若不连通则恢复,并进入下一次的循环,循环到叶子节点时,判断叶是否与初始节点相连,并计算代价cost是否小于当前最小代价bestc,若小于,则更新bestc,再返回上一节点,知道遍历完树中的所有节点。核心代码:public void backtrack(int depth)/depth深度if(depth=size)if(mappathdepth-1pathdepth != -1 & mappathdepthpath1!= -1& cost +mappathdepthpath1bestc)bestp=path.clone();bestc = cost + mappathdepthpath1;/bestc = cost +apathi-1pathi+apathipath1;/重复计算了上一边elsefor(int j =depth;j=size;j+)if(mappathdepthpathj!=-1)swap(path,depth+1,j);cost +=mappathdepthpathdepth+1;/System.out.println(Arrays.toString(x)+:+cost);backtrack(depth+1);cost -=mappathdepthpathdepth+1;swap(path,depth+1,j);2、 遗传算法先设计个体,个体里面用城市的邻接矩阵map表示,当前路径path,当前路径的代价cost,适应度值。主要方法有随机初始化当前路径,计算路径代价,适应度值的求解。针对旅行商的问题,设计初始化种群,生成下一代种群,生成下一代种群包含选择,交叉,变异的方法。在交叉的结果会产生同一个城市重复两次,所以需要一个修复方法。核心代码:public void solve() int i;int k;/ 初始化种群initGroup();/ 计算初始化种群适应度,Fitnessmaxfor (k = 0; k scale; k+) fitnessk = evaluate(oldPopulationk);/ System.out.println(fitnessk);/ 计算初始化种群中各个个体的累积概率,PimaxcountRate();System.out.println(初始种群.);for (k = 0; k scale; k+) for (i = 0; i size; i+) System.out.print(oldPopulationki + ,);System.out.println();System.out.println(- + fitnessk + + Pik);for (t = 0; t MAX_GEN; t+) /evolution1();evolution();/ 将新种群newGroup复制到旧种群oldGroup中,准备下一代进化for (k = 0; k scale; k+) for (i = 0; i size; i+) oldPopulationki = newPopulationki;/ 计算种群适应度for (k = 0; k scale; k+) fitnessk = evaluate(oldPopulationk);/ 计算种群中各个个体的累积概率countRate();System.out.println(最后种群.);for (k = 0; k scale; k+) for (i = 0; i size; i+) System.out.print(oldPopulationki + ,);System.out.println();System.out.println(- + fitnessk + + Pik);System.out.println(最佳长度出现代数:);System.out.println(bestT);System.out.println(最佳长度);System.out.println(bestc);System.out.println(最佳路径:);for (i = 0; i size; i+) System.out.print(bestpi + ,);public static void main(String args) throws IOException long startTime = System.currentTimeMillis(); /获取开始时间System.out.println(Start.);ycTSP yc = new ycTSP(30, 40, 1000, 0.8f, 0.9f);yc.init(C:/data.txt);yc.solve();System.out.println();long endTime = System.currentTimeMillis();/获取程序运行时间System.out.println(程序运行时间: + (endTime - startTime) + ms);五、算法复杂性理论分析1、回溯法TSP问题是排列树问题,因而该算法的时间复杂度为O(n!)。2、遗传算法六、算法代码(单独文件提交)见项目文件七、算法复杂性实验分析遗传算法中种群规模为30,运行代数为1000,交叉率为0.8,变异率为0,9问题规模回溯法遗传算法53ms44ms1010ms87ms20272510ms110ms25-124ms30-141ms40-188ms八、实验中的问题总结回溯法:优点:采用深度优先,可以快速的找到一组解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论