TSP问题的遗传算法求解方案--源程序清单旅行商问题包含算法介绍源程序测试结果.doc
《TSP问题的遗传算法求解方案--源程序清单旅行商问题包含算法介绍源程序测试结果.doc》由会员分享,可在线阅读,更多相关《TSP问题的遗传算法求解方案--源程序清单旅行商问题包含算法介绍源程序测试结果.doc(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流TSP问题的遗传算法求解方案-源程序清单旅行商问题,包含算法介绍,源程序,测试结果.精品文档.TSP问题的遗传算法求解方案算法的软件实现4.1 开发环境介绍本文中的所有算法是在Visual C+ 6.0 的操作平台上进行开发的,并结合STL进行编程。1、Visual C+ 6.0简介Visual C+ 6.0 是微软公司最新出品的功能最为强大的可视化开放工具,是计算机界公认的最优秀的应用开发工具之一。Microsoft的基本类库使得开发Windows应用程序比以往任何时候都要容易。Visual C+作为一种程序设计语言,它同时也是一个集成开发
2、工具,提供了软件代码自动生成和可视化的资源编辑功能。2、Visual C+ 6.0的优势(1).拥有强大的编辑环境。(2).拥有强大的类库的支持。(3).拥有强大的调试环境。(4).拥有较强的低层控制能力。(5).拥有强大的帮助系统MSDN的支持。(6).拥有一个高效的编译器,产生的可执行文件体积小巧、运行速度快。 3、STL简介 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C+程序库。它被容纳于C+标准程序库(C+ Standard Library)中,是ANSI /ISO C+标准中最新的也是极具革命性的一部分。该库包含了诸多在计
3、算机科学领域里所常用的基本数据结构和基本算法。为广大C+程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C+中的MFC(Microsoft Foundation Class Library),或者是Borland C+ Builder中的VCL (Visual Component Library),但是它比二者具有更强的优势。更加值得一提的是,它具备以下几个区别于其它软件库的优点: (1).经过类属编程方法精心组织的,可互换的编程模块能够提供比传统组件设开始初始化遗传算法的相关参数计算每个个体的适应值产生城市对城市进行编码是否符
4、合终止条件?输出正确的TSP结果 是GEN=GEN+1 选择 交叉 变异 否 世代进化轮盘赌选择普通选择 GXCXOXPMX 基于次序的变异基于位置的变异倒位变异图4.1 遗传算法解TSP的具体流程图计方法丰富得多的组合方式。(2).类属编程方法设计也是将来为数据库,用户界面等专业领域开发组件的基础。(3).通过使用某些编译机制并根据不同的算法进行具体的设计,可以在不损失效率的情况下实现对组件的概括。与此形成鲜明对照的是,其它一些具有复杂继承层次和大量使用虚函数的C+库结构则通常会降低效率。4.2 算法实现的流程图 本设计的具体流程图如图4.1所示:4.3 算法的各个模块及其详细设计思路1城市
5、生成模块 用户可以点击鼠标左键产生城市,也可以选择菜单栏的设置城市选项,通过输入城市数目来随机生成城市。当然,如果用户选择错了城市,可以在该城市上点击鼠标右键来清除城市。如果用户要清除所有的城市,可以双击鼠标右键或选择菜单栏的结束选项,都可以清除所有的城市。其设计设计思路如图4.2所示:调用画图函数画点(即设置城市)程序将点的信息存入一个点向量中程序检测鼠标移动的具体信息 按下鼠标左键用一个变量记入要产生的城市数 按下鼠标右键 选择菜单栏的设置城市选项将点向量中要除去的点找出来循环调用鼠标左键点击消息直到达到要求的城市数 选择菜单栏的结束选项重新画点向量中的所有点(此时该删除的点已从点向量中删
6、除)重新画地图(即清除了所有的点)图4.2 城市生成模块的设计思路最后的效果如图4.3所示:图4.3 TSP问题城市设置实现效果2.地图选择模块 根据具体的需要,用户可以选择不同的地图,本设计提供的地图有:基于直角坐标系的地图和圆形地图,这两个地图由不同的类来产生。其中类DefaultMap产生直角坐标地图,类RoundMap产生圆形地图。图4.4所示的是直角坐标地图,图4.5所示的是圆形地图。图4.4 直角坐标地图图4.5 圆形地图3. 遗传算法解TSP的参数设置模块在具体的应用中,用户可以根据具体情况来设置遗传算法的相关参数,这些参数包括: 交叉率:控制程序进行交叉的次数,在本设计中,先随
7、机生成一个数,如果这个数大于交叉率,则不交叉,如果这个数小于交叉率,则进行交叉。具体实现如下:pick = float(randomInt(0,1000)/1000;if(pick pcross)/进行交叉操作else/不进行交叉操作 变异率:控制程序进行变异的次数,在本设计中,先随机生成一个数,如果这个数大于变异率,则不变异,如果这个数小于变异率,则进行变异操作。具体实现如下:pick = float(randomInt(0,1000)/1000;if(pick pmutation)/进行变异操作else/不进行变异操作 种群大小:即种群中所含有的个体数量,选择一个合理的种群值,不但会使得群
8、体的多样性增强,防止遗传算法的“早熟现象”,还会使得遗传操作收敛得更快。 世代数:控制遗传操作世代进化的次数,合理的世代数能够使得计算结果的优劣程度不同。图4.6 遗传算法解TSP的参数设置 进化设置:根据子染色体与父染色体的关系,进化设置又分为两种:普通进化:完全模仿自然进化,子染色体可能比父染色体优秀,也可能比父染色体差。强制进化:选取子染色体中比父染色体优秀的染色体,杀死子染色体中比父染色体差的染色体。使得进化一直朝着优秀染色体的方向进化。具体的实现效果如图4.6所示:4.交叉算子选择模块交叉操作是遗传算法中最重要的一环,交叉算法的优劣将最大限度地影响遗传算法的结果。本设计先根据国外专家
9、提出的解TSP的几种经典算法,然后编程将其实现,并在此基础上,提出一种改进的交叉算法。在具体的应用中,用户可以根据自己的需要,选择最符合实际情况的交叉算法。程序的具体选择模块如下:/交叉算子的选择模块inline void CGA:crossover(Chrom& parent1,Chrom& parent2,Chrom& child1,Chrom& child2)switch (TempCrossoverStyle)case ID_PARTIALLY_MATCHED_CROSSOVER :/部分匹配交叉partially_matched_crossover(parent1,parent2,c
10、hild1,child2);break;case ID_ORDER_CROSSOVER :/顺序交叉order_crossover(parent1,parent2,child1,child2);break;case ID_CYCLE_CROSSOVER :/循环交叉cycle_crossover(parent1,parent2,child1,child2);break;case ID_GREED_CROSSOVER:/循环贪心交叉greed_crossover(parent1,parent2,child1,child2);break;default :break;5.变异算子选择模块求解TSP
11、时,变异算子的设计比交叉算子的设计灵活,任何具有局部搜索能力的算子都可以作为它的变异算子。本设计实现了三种变异:基于次序的变异,基于位置的变异,倒位变异。程序的具体选择模块如下:/变异算子选择模块inline void CGA:mutation(Chrom& chr)switch (TempMutationStyle)case ID_ORDER_MUTATION :/基于次序的变异order_oriented_mutation(chr);break;case ID_POSITION_MUTATION :/基于位置的变异position_oriented_mutation(chr);break;
12、case ID_REVERSE_MUTATION:/倒位变异reverse_mutation(chr);break;default :break;6.具体输出信息显示模块为了使程序运行时具体的算法和各种数据信息更加明确化,增加了信息显示模块,这样,在程序运行时用户可以掌握具体的数据信息,以便对各种算法进行比较。信息显示模块包括:计算结果模块,算法运行时间模块,所选遗传算子模块。下面分别对各个显示模块进行讨论: 计算结果模块:输出的信息包括当前鼠标的横坐标,当前鼠标的纵坐标,这两个信息是为了用户设置城市时参考的。城市总数信息是用户设置的城市数目。总距离信息是经过计算的TSP问题的最优路径长度,它
13、是屏幕上象素点间的距离。 算法运行时间模块:包括算法启动前时间,它是用户设置完城市,进行求解时刻的时间;算法结束时间,它是程序运行完成,正确输出TSP结果时刻的时间;算法耗费时间,它是进行遗传算法求解TSP时算法所消耗的时间。 所选遗传算子模块:它显示的是用户选择了那种交叉算子,那种遗传算子,以便于对各种算法比较时使用。 具体的显示如图4.7所示:图4.7 各种信息显示图4.4 设计中主要的类和函数的功能1. Map类,DefaultMap类,RoundMap类DefaultMap类这三个类均为画图相关的类,其继承关系为: 继承Map类 基类RoundMap类 继承图4.8 画图类继承关系其中
14、,DefaultMap类主要是与直角坐标地图有关,RoundMap类主要是与圆形地图有关。这些类提供了画地图函数:DrawMap,保存地图中的位置函数:SaveClickPoint,清除点向量中所有城市点的函数:DelAllPoint,在地图上画点的函数:DrawPonit,将地图上已存在的点删除函数:SmearPonit等等。2. CGA类 这个类主要是为遗传算法设置的,在这个类中定义了基因结构体代表一个城市,染色体结构体代表到各城市去的一种组合,还定义了种群结构体表示各种不同基因的组合。这个类主要是进行遗传算法操作的,包括各种进化运算,即选择,交叉,变异等等。这个类中的主要函数有:遗传算法
15、参数设置函数:preSet,遗传算法启动函数:start,交叉类型选择函数:SetCrossoverStyle,变异类型选择函数:Set- MutationStyle,世代进化函数:generation,染色体适应度计算函数:chromCost,种群个体适应度计算函数:popCost,初始化染色体函数:initChrom,初始化种群函数:initpop,轮盘赌选择函数:selectChrom等等。3. Control类 Control类主要是对程序进行控制的,它为各个模块的组合提供了接口,并且将必要的数据信息在屏幕上输出。它提供的函数主要有:欢迎窗口显示函数:welcome,遗传算法接口函数:
16、SetGaInformation,信息显示函数:DisPlay等等。4. Line类 Line类主要是计算TSP问题的具体操作,包括对城市点构成矩阵的设置,计算城市点之间的距离,画线,保存城市点的矩阵信息,计算最终结果等。5. main.cpp 这是一个主程序文件,是整个程序启动,操作的主控文件。是整个程序的框架部分。 此外,程序还有头文件类,资源类等等。这里就不详细介绍,具体的源程序见程序文档。5 软件测试及实验结果分析5.1 软件测试 以下是软件测试的步骤:1.运行程序后,弹出欢迎消息,如图5.1所示:图5.1 遗传算法解TSP问题欢迎窗口2.点击确定,进入主程序模块,点击选择地图,可以选
17、择直角坐标地图和圆形地图,默认地图为直角坐标地图,下面的演示以直角坐标地图为主,如图5.2所示:图5.2 遗传算法解TSP问题直角坐标演示地图3. 在屏幕上点击鼠标左键可设置城市,也可以点击菜单栏设置城市,弹出设置城市数目对话框,在对话框中输入城市数目,可以在屏幕上随机生成城市,具体情况如图5.3,5.4所示:图5.3 设置城市数目图5.4 设置城市4. 点击菜单栏遗传算法设置按钮,弹出遗传算法参数设置对话框,如图5.5所示:图5.5 遗传算法参数设置对话框 在遗传算法参数设置对话框中,可以设置交叉率,变异率,种群大小,世代数以及选择进化设置等。5. 点击菜单栏交叉类型按钮,可以选择交叉算法,
18、如图5.6所示:图5.6 交叉类型选择 可供选择的交叉类型有:部分匹配交叉,顺序交叉,循环交叉,循环贪心交叉。6. 点击菜单栏变异类型按钮,可以选择变异算法,如图5.7所示,可供选择的变异类型有:基于次序的变异,基于位置的变异,倒位变异。图5.7 变异类型选择7然后点击菜单栏开始,则进行计算,最终结果如图5.8所示:图5.8 遗传算法解TSP问题计算结果8. 点击菜单栏结束可以清除所有点,点击帮助,可以弹出帮助文件。至于圆形地图的测试过程与直角坐标地图相似。5.2 算法的正确性验证 为了测试算法的正确性,我使用了固定城市测试模块,该模块中的城市坐标,城市大小可以预先设置。其中,城市的数目,坐标
19、和最优解均可以参照国内外专家的文献,然后对比本程序计算的结果。如图5.9所示:图5.9 固定城市测试本设计中的参考文献可见参考文献1,城市坐标见参考文献1,36,交叉率为0.6,变异率为0.2,种群大小为100,世代数为100,采用强制进化方式,交叉类型为部分匹配交叉,变异类型为基于次序的变异。测试的十组数据如下:时间(s)12.67211.82812.7811.76512.68812.84411.25010.84410.68711.954最优解517492505515492509519526549491 计算平均值有平均最优解为:511.5,平均时间为:11.9364s。与参考文献1,37的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TSP 问题 遗传 算法 求解 方案 源程序 清单 旅行 包含 介绍 测试 结果
限制150内