程序实现-遗传算法与最小生成树算法解决旅行商问题分析对比_第1页
程序实现-遗传算法与最小生成树算法解决旅行商问题分析对比_第2页
程序实现-遗传算法与最小生成树算法解决旅行商问题分析对比_第3页
程序实现-遗传算法与最小生成树算法解决旅行商问题分析对比_第4页
程序实现-遗传算法与最小生成树算法解决旅行商问题分析对比_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

遗传算法与最小生成树算法解决旅行商问题分析对比摘要:本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作。遗传算法在计算时间和占用内存上,都远远优于最小生成树算法。这间接证明了智能算法在解决大规模问题上性能优于传统算法程序采用Microsoftvisualstudio2008结合MFC基本对话框类库开发。32位windows7系统下调试运行。引言遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,由密歇根大学的约翰•霍兰德和他的同事于二十世纪六十年代在对细胞自动机(英文:cellularautomata)进行研究时率先提出,并于1975年出版了颇有影响的专著《AdaptationinNaturalandArtificialSystems》,GA这个名称才逐渐为人所知,约翰•霍兰德教授所提出的GA通常为简单遗传算法(SGA)。在二十世纪八十年代中期之前,对于遗传算法的研究还仅仅限于理论方面,直到在伊利诺伊大学召开了第一届世界遗传算法大会。随着计算机计算能力的发展和实际应用需求的增多,遗传算法逐渐进入实际应用阶段。1989年,纽约时报作者约翰•马科夫写了一篇文章描述第一个商业用途的遗传算法--进化者(英文:Evolver)。之后,越来越多种类的遗传算法出现并被用于许多领域中,财富杂志500强企业中大多数都用它进行时间表安排、数据分析、未来趋势预测、预算、以及解决很多其他组合优化问题。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(geneticoperators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解[1]。遗传算法是借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的。其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。综述:程序总体流程图:这个程序的思想是,随机生成“地点数”编辑框输入的数字的地点,存储在一个vector里。然后用一个“基因类”表示该基因代表第几个点,接着一个“基因组类”有序包含了很多“基因类”,如果一个“基因组类”包含的基因类顺序为:基因组.基因[0].data=第二个点;基因组.基因[1].data=第三个点;基因组.基因[3].data=第一个点;就说明该基因组表示的连线顺序是从第二点连到第三个点再连到第一个点。给每个城市一个固定的基因编号,例如10个城市为0123456789,随机地组成一个染色体(以下所有情况都以10个城市为例说明)。

约定这10个城市之间的行走路线为:

(其余基因序列的路线同样道理)接着有一个“遗传机器类”包含了很多基因组。基因组的数量由“基因组数”编辑框决定。初始化的时候,每个基因组的基因顺序是随机决定的。进行第一代进化的时候,遍历vector<基因组>,计算每个基因组代表的连线方式的连线长度。连线长度越长,说明这个基因组越差劲,因为我们要计算以何种方式连线连线长度最短。我们用不适应度来记录连线长度。接着就是选择哪个基因组可以生育,遗传给下一代。我采用了一个轮盘赌的策略,尽可能选择不适应度低的基因组进行生育。选择出的基因组进行交换变异后,就把这个基因组复制给下一代。最后,选择两个最好的基因组,不进行任何变异,直接复制到下一代。这样循环反复,迭代“代数”编辑框输入的代数次数之后,就可以输出结果了。结果就是最后一代最优秀的那个基因组代表的连线方式。主要代码:voidcGAMachine::SetupNextGeneration()//生成下一代基因,进化到下一代{ vector<cGenome>offspring;//保存下一代基因 m_maxNotFitness=m_genomes[m_population-1].m_notfitness; //所有基因组最大不适应度 while(offspring.size()<(unsignedint)m_population-2) //选择(最大基因组数-2)数量的基因组进行变异和遗传 { cGenomeparent=SelectRouletteWheel();//进行轮盘赌随机选择一个基因组出来进行生育 cGenomeoffspring1;//保存变异后的基因组 MutateInsert(parent.m_genes,offspring1.m_genes);//进行变异 offspring.push_back(offspring1);//将变异后的基因组压入第二代vector<基因组>里 } sort(m_genomes.begin(),m_genomes.end());//对vector<基因组>进行排序,以便下一行代码选出最优秀的个基因组 CopyEliteInto(offspring);//直接将最优秀的个基因组复制到下一代 m_genomes=offspring; m_curGener++;//代数计数器+1}实验结果:使用上图随机生成的节点采用最小生成树(算法在绘制改进的最小生成树解决tsp问题上的路径上还有些问题,这个图只是最小生成树)采用50个基因组,100次迭代进化,0.5的基因变异率依次生成50个点,100个点,150个点,200个点,250个点的规模问题运行时间的对比:release版本程序随着节点数的增加遗传算法的运行时间基本保持在100ms左右占用内存对比:发现的问题:虽然遗传算法在性能上优势很大,但是有时候基本是收敛在局部最优解上了,找全局最优解需要改进的遗传算法,以及引入一些新的概念,比如毁掉现有所有最优基因的灾变思想。每次发现的解有很大的不确定性,因为涉及的相关参数比较多,有变异率,基因组规模,以及城市规模等。遗传算法(不确定的算法)在与最小生成树(确定的算法)同等规模的问题比较过程中发现,在问题规模比较小的时候,两者呈现了相同的运行时间与内存占用,但随着问题规模变大,遗传算法表现出了相当的运行时间优越性,以及内存占用的优越性。未来的工作:参照《最小生成树算法在旅行商问题中的应用》实现最小生成树的TSP解法法。改进遗传算法,引入灾变的思想,得到全局最优解。进一步了解其他智能算法的TSP问题解决方案参考文献:1./blog/static/1034140620076104130312/2./link?url=rI

温馨提示

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

评论

0/150

提交评论