1、承 诺 书我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料) ,必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。如有违反竞赛规则的行为,我们将受到严肃处理。我们参赛选择的题号是(从 A/B/C 中选择一项填写): C 我们的参赛报名号为(如果赛区设置报名号的话): 所属学院(请填写完整
2、的全名): 计算机科学与技术学院 参赛队员 (打印并签名) :1. 2. 3. 日期: 2011 年 7 月 9 日评阅编号(教师评阅时填写):1C 题:生活垃圾管理系统摘 要随着我国城市经济发展和人口的增加,城市生活垃圾产生量在迅速增加,垃圾的收集运输问题越来越受到关注,而收集运输工作的科学性和经济性的关键是合理的安排收集和运输路线。本文将针对城市垃圾的收集与运输的优化过程进行讨论。为了在垃圾收运过程中可以达到“路径短,时间少,车辆少”的目标,我们深入分析建立了两种模型:基于图论的最短路径模型和基于遗传算法的规划模型。模型一:基于图论的最短路径模型。首先假定一辆无限大载重的车能够跑完全程,利
3、用图论知识,用 C+编程求解出遍历 50 个站点的哈密顿回路,得到垃圾车收运的最短路线。然后基于此哈密顿回路,某辆垃圾车从车库出发,逐步算出垃圾车在行驶过程中装载的垃圾量,当垃圾量达到垃圾车的最大装载量 1 吨时,垃圾车便开往中转站卸下所有垃圾,然后返回站点继续收集垃圾。由此可得垃圾车前往中转站的次数为 25次,即可将该条线路划分为 25 个子线路。最后从第一条子路线开始,逐步求解出垃圾车在行驶过程中所用的时间,当收运垃圾时间总接近垃圾车工作总时间时,则另分配车辆继续按照已求出的最短路线来收运垃圾。根据上述方法,计算可知需将任务分派给 8 辆车来完成,所有垃圾车在该线路上收集垃圾时所行驶的总里
4、程为 897752m,花费的总时间为 59.6795h。模型二:基于遗传算法的规划模型。针对模型一中存在的不足,我们采用遗传算法进行改进。首先将问题类比物流配送中的车辆调度问题;其次建立车辆路线安排的数学模型,把总运输距离最小作为目标函数,并结合车容量 1 吨、时间窗 8 小时等约束条件,得到车辆优化调度的规划模型;最后,根据上述规划模型并结合遗传算法中选择、交叉、变异等基本操作,使问题的解一代一代的优化,最终逼近最优解。通过MATLAB 软件编程计算,得到最终结果为:车辆数目为 6 辆,行驶的总里程为6225959m,花费的总时间为 45.599h。模型适用性和算法的稳健性:模型一利用了图论
5、中的哈密顿回路,此模型可以解决类似 TSP 的一类问题;模型二利用了遗传算法,可以用于解决车辆优化调度等一类问题。两个模型都具有广泛的适用性。两个模型中分别用到的“求解哈密顿回路”算法和遗传算法,都是比较成熟的算法,具有良好的鲁棒性。 关键词: 图论 哈密顿回路 规划模型 遗传算法 2一、问题重述1.1 问题背景随着人类生活水平的提高以及城市垃圾处理事业的发展,垃圾分类处理与清运的优化问题也开始受到了大家的重视。城市生活垃圾的年增长速度达 8-10%,严重污染环境。城市垃圾管理包括计划、组织、行政、金融、法律和工程等多方面,并涉及到城市生活垃圾收集、运输和处置。而中国目前处置水平低,管理办法不
6、多,更是急待解决的问题。在这方面,世界许多国家在谋求解决城市生活垃圾过程中,产生出许多好的办法,并在此过程中总结了经验和教训。1.2 涉及材料背景某一车库拥有最大装载量为 1 吨的垃圾收集车 k 辆,并且该区的垃圾收集点(待收集垃圾的点)有 50 个,该城市共有垃圾中转站 1 座。每天 k 辆垃圾车从车库出发,经过收集点收集垃圾,当垃圾负载达到最大装载量时,垃圾车运往中转站,在中转站卸下所有收运的垃圾,然后再出站收集垃圾,如此反复,直到所有收集点的垃圾都被收集完,垃圾车返回车库。以上收运过程均在车库的工作时间进行。1.3 问题提出1.根据所有的资料,建立垃圾收运路线的数学模型,设计出有效的算法
7、,使垃圾收运车辆尽可能少,行车里程尽可能短或者垃圾收运时间尽可能少。 2.针对附录中给出的数据,求解模型,并对模型的结果做出合理分析和解释。二、问题分析本题是一个在城市生活垃圾收运过程中,构造一条“路径短,时间少,车辆少”收运路线的问题。2.1 不考虑垃圾车运往中转站,直接求出遍历各个垃圾站点的最短路径,并进一步求出最少的车辆和最短的时间为达到城市垃圾的收运车辆尽可能少,行车里程尽可能短或者垃圾收运时间尽可能少的目标,我们首先考虑如何在满足工作时间和载重量限制的条件下,使垃圾车的行驶路径最短。根据附录一中的站点坐标,假定一辆车可以跑完全程,并利用图论的知识,编程得到一条哈密顿回路,这样一来,便
8、可得到遍历所有站点的最短路径,那么这条路径即为所有车辆行驶的最短路径。在保证了最短路径之后,为了达到在行驶过程中车辆最少,时间最短的目标。我们首先假定车辆必须在装满之后才运往转运站,从而使得每辆车的利用率可以达到最大,进而可以保证车辆达到最少。2.2 进一步优化模型一,并求出最短路径、最少车辆和最短时间为了进一步优化模型,得到更优解。仔细分析、研究问题可知,本题模型与物流配送中的车辆调度模型类似。车辆路径问题是一个 NP 完全问题,只有在需求点和路段数较少时才可求得精确解。而遗传算法可以很好解决这一问题,因此用遗传算法求解该问题是我们的一个思路。建立基于遗传算法的规划模型,对车辆调度进行优化,
9、即合理地进行垃圾收运优化,尤其是收运路线的优化,能够提高运行路线的利用率,减少行驶里程和行驶时间。3三、模型假设1、每次垃圾车到达垃圾收集点时,该收集点的垃圾产量处于最大值。2、每辆车只考虑在垃圾装满之后才开往中转站。3、不考虑周围环境、气候等因素对垃圾运输过程中造成的影响。4、假设垃圾车行驶的速度保持不变。5、假设各个垃圾点与垃圾点和车库都是可达的。四、符号说明主要符号 符号意义c表示收集车量的序号k表示运输车的量数il表示每个收集点的垃圾量Q表示每辆车的载重量ijd表示 i 点到 j 点的距离ijcA0-1变量,表示车 c 是否由 i 驶向 jiB0-1变量,表示第 i 点的垃圾是否由车
10、c 来完成转运Z表示垃圾车的总行驶距离flag0-1变量,表示是否有垃圾从垃圾站驶向中转站M一很大的正数,表示当一辆收集车的收集量超过其最大承载量时的惩罚系数nZ表示遗传算法中第 n 次的适应度值f表示染色体的适应度函数 f=1/z4五、模型的建立与求解模型一:基于图论的最短路径模型5.1 模型的建立在垃圾收集的过程中,垃圾收运车每天早上四点从车库出发,前往各个垃圾站点收运垃圾并运往中转站。由于每台垃圾收运车的载重有限,所以当其载重达到最大值时就要前往中转站,卸下所有垃圾,然后返回站点继续收集。本问题的解决要达到三个目标:垃圾收运车数目尽可能少,行车里程尽可能短,垃圾收运时间尽可能少。为了便于
11、分析处理问题,我们首先假设所有的垃圾由一辆载重量无限大的收运车来收运,因此暂不考虑中转站问题,而让收运车直接从车库出发,经过每个垃圾收集点一次且仅一次,完成垃圾收运任务。要使车辆行驶里程最短(在此先不考虑时间限制) ,就是找一条遍历所有收集站点的最短路径,即找一条以车库为起点的哈密顿回路。哈密顿图的介绍:设 G=(V,E)是连通无向图.(1)经过 G 的每个顶点正好一次的路径,称为 G 的一条哈密尔顿路径(2)经过 G 的每个顶点正好一次的圈,称为 G 的哈密顿圈或 H 圈(3)含 H 圈的图称为哈密尔顿图或 H 图现在我们构造一个加权的无向图,每个垃圾收集点和车库看做图中的一个节点,各垃圾收
12、集点之间以及各垃圾收集点与车库之间的路径可以看做图中对应节点间的边,各条路径的长度看做对应边上的权,这样就构造出一个加权的网络图。问题就转化为在上述构造的图中寻找从车库出发,行遍所有顶点一次且仅一次再回到车库的哈密顿回路,使得总权最小。为了找到满足上述条件的哈密顿回路,我们采用 matlab 编程求解,其算法主要步骤如下:(1)任取初始 H 圈: C 0=v1,v2,vi, ,vj,vn,v1 5图一 示例图(2)对所有的 i ,j,11,垃圾车前往中转站卸下垃圾。所以 4212 构成第一个子路线。由上述方法可以求出各个子路线,设 Sk 为第 k 个子路线的总路程,v 表示垃圾车的行驶速度,结
13、合题目中中给出的数据及距离的计算公式,我们可以算出垃圾收运车在各个子路线上所花费的时间:, (k=1,2,25)vstk/考虑到垃圾收运车的工作时间、每天最多经过的垃圾收集点个数和每天的总载重量的限制,需要将这些子路线分配给多辆车来完成,在保证每辆车都能规定时间内回到车库的前提下,每辆车的工作时间都尽量接近 8 小时的工作时长,这样就得到了垃圾收运车辆数目和每辆车的收运路线。例如第一辆车的收运路线的分配过程如下:第一个子路线的时间为 1.7935 小时,第二个子路线的时间为 1.254 小时,第三个子路线的时间为 1.889 小时,第四个子路线的时间为 1.404 小时,这四个子路线的总时间为
14、 1.7935+1.254+1.889+1.404=6.3405 小时,而第五个子路线的时间为 2.125 小时,6.3405+2.125=8.4655 小时,这样就超过了垃圾收运车的工作时长,并且前四个子路线的总垃圾收集站点个数不超过 10,所以将前四个子路线分配给第一辆车。65.2 模型的求解5.2.1 站点坐标首先根据附录一中的数据,用 matlab 编程(代码见附录二)可以得到车库、中转站、垃圾收集点的分布图如下:图二 站点坐标图5.2.2 遍历路径根据如图所示站点的坐标,先假设垃圾车的载重量无限大,可一次将垃圾全部收集完,因此暂不考虑中转站问题,而直接从车库出发,找到一条遍历所有收集
15、点的最短路径,从而将问题转化成求解哈密顿回路的问题,这样就可求得最短收集路线。利用 C+程序(代码见附录三)可得到最佳路径如下:图三 最佳路径(注:此程序结果中的站点数为题目附录中给出的站点数加 1,车库标号为 1。 )由此可知最短路径为:(0 表示车库,其余为题目附录中的站点数) 1272803982467526439214 3547251903198653 77运用 matlab 画出遍历路径如下:图四 最短路径根据上图的最佳路径,可列出如下数据表格:表一 各站点信息序号 经过站点号 站点垃圾量(kg) 装卸时间(min)垃圾运往中转站后该站点剩余垃圾量(kg)flag1 42 200 1
16、 0 02 1 600 3 0 03 2 500 2 300 14 3 200 1 0 05 39 700 4 200 116 4 500 2 0 07 26 650 3 350 18 5 300 1 0 09 7 1300 6 950 110 6 300 1 250 111 24 300 1 0 012 8 200 2 0 013 31 200 1 0 014 9 200 1 150 115 13 1600 8 750 116 10 550 3 300 117 28 800 4 100 118 11 400 2 0 019 17 300 1 0 020 12 200 1 0 121 23 4
17、00 2 0 022 14 400 2 0 023 15 300 1 100 124 16 600 3 0 025 22 400 2 100 126 18 800 4 0 027 19 700 4 600 128 30 600 3 200 129 20 300 1 0 030 29 300 1 0 031 21 300 2 100 132 44 950 5 50 133 25 400 2 0 034 27 200 1 0 035 32 400 2 50 136 40 450 2 0 037 33 450 2 0 038 35 200 1 150 139 34 350 2 0 040 46 85
18、0 5 350 141 36 1400 6 750 142 38 900 5 650 143 37 300 1 0 044 45 200 1 150 145 41 400 2 0 046 50 1150 6 700 147 43 200 1 0 048 48 400 2 300 1249 47 300 1 0 050 49 300 1 0 1即用柱状图表示该站点的垃圾量和剩余垃圾量为:图四 站点垃圾与剩余垃圾量柱状图5.2.3 所用车辆及路径根据表格一与图三,垃圾收运车沿求出的路线收集垃圾,考虑垃圾车的最大载重量和工作时间,在上述求解出最短路径后,用一辆垃圾收运车按照图二中的遍历路径开始收集垃
19、圾,当载重量接近或达到 1 吨时,运往中转站,再接着收集余下的垃圾。由此,我们可以得出一辆垃圾车的收运路线。从上述的最短路线的结果中,可以看出垃圾车要去中转站 25 次,则最短路径被分成 25 个子线路。由于有时间限制,所以需要多辆车去收集垃圾,经过计算,我们得出需要 8 辆车来收集垃圾以及每辆车的收运路线。以下是每辆车的收运路线:第一辆车: 752626439392214 中 转 站中 转 站中 转 站车 库中 转 站第二辆车: 中 转 站中 转 站中 转 站车 库 139931824667第三辆车: 中 转 站中 转 站中 转 站车 库 272810103第四辆车: 中 转 站中 转 站中
20、 转 站车 库 19865542第五辆车: 中 转 站中 转 站中 转 站车 库 42219033019第六辆车: 中 转 站中 转 站中 转 站车 库 463535427541第七辆车: 中 转 站中 转 站中 转 站车 库 45378386364第八辆车: 中 转中 转 站中 转 站中 转 站车 库 4978450501站由子路线及每辆车所用的时间可得如下表格:表二 路线分布表子路线号 1 2 3 4 5 6 7 8车号 1 1 1 1 2 2 2 3路线 *-42-1-2-0 2-3-39-0 39-4-26-0 26-5-7-0 7-6-06-24-8-31-9-09-13-0 13-
21、10-0运载量(kg) 1000 1000 1000 1000 1000 1000 1000 1000时间(h) 1.7935 1.254 1.889 1.404 2.125 3.329 2.455 3.165子线路号 9 10 11 12 13 14 15 16车号 3 3 4 4 4 5 5 5路线 10-28-028-11-17-12-023-14-15-015-16-22-022-18-19-019-30-030-20-29-21-021-44-0运载量(kg) 1000 1000 1000 1000 1000 1000 1000 1000时间(h) 2.157 3.004 2.394
22、 2.014 2.689 1.846 3.249 2.8462子线路号 17 18 19 20 21 22 23 24 25车号 6 6 6 7 7 7 8 8 8路线44-25-27-32-032-40-33-35-035-34-46-046-36-036-38-038-37-45-045-41-50-050-43-48-048-47-49-0运载量(kg)1000 1000 1000 1000 1000 1000 1000 1000 1000时间(h) 3.447 2.551 1.465 2.528 2.638 2.26 2.197 2.041 2.939模型二:基于遗传算法的规划模型5.
23、3模型的建立对问题的求解,模型一是通过图论中的哈密顿回路来解决的。在求解哈密顿回路的过程,因为事先未知前往中转站的次数,所以没有考虑中转站,这样就会造成一定的误差。为了减小误差,进一步接近最优解,我们建立模型二。收运垃圾的过程可以概述为:车辆从车库出发,按照一定的路线,将各个收集点的垃圾集中后运往统一的中转站处理。现将问题反过来思考:收运车从中转站出发,将中转站的垃圾按一定的路线运往各收集点。这样听起来似乎不合常理,但是,问题就转化为了物流配送中的车辆调度问题。中转站即对应配送中心,收集点的垃圾量对应各个客户的需求量。其目标函数和约束条件基本相同。所以,借用“物流配送中的车辆调度问题”模型来求
24、解。而此模型较好而又成熟的方法则是遗传算法。考虑到垃圾收运过程中,每辆垃圾车到从中转站到车库的次数是固定的(只有完成工作之后从中转站回到车库)为1次,建模过程中,垃圾车以中转站为起点,前往各收集站点收运垃圾。下边将基于城市垃圾收集路径优化问题的特殊性,采用改进的遗传算法来建立改进后的模型,算法的主要步骤如下: 1.车辆调度数学模型3安排垃圾收运车的收运路线问题,使总运输距离最小作为目标函数,根据题中和基本假设所给的约束条件,建立如下线性规划模型:为了使总距离最小,我们将总运输距离作为目标函数,目标函数: 10mininjkcijcAdz(1) 由于每辆车都有载重量的限制,因此要将垃圾收集车的载
25、重量作为一个约束条件。c=1,2,,n QBlicni0(2) 上半部分表示每个地点的任务只能有一辆车完成,下半部分表示所有的车从出发点行驶到终到点。)1n,0(21ikBkci ,(3) 因为到达每个收集点的车有且仅有一辆,所以),2,1;,2,1(10 kcnjAcniji (4) 因为离开每个收集点的车有且仅有一辆,所以)1,0(0 niBcnjij(5)因为A ijc 为0、1变量,所以),2,1;,10,( kcnjiAijc 或(6)因为B ic 为0、1变量,所以),;,( kciBic 或(7)总的约束条件如下:4 )7(,21;,10( 6)5(,( )4(,21;,2,1)
26、3(0(,)2(n1(.010 kcniBjAi kcnjBikcQltsicjncijicjkcinii ,或 ,或 ,其中对约束条件进行处理主要采取以下两种方法:1)在编码过程中不考虑约束,而在遗传算法的计算过程中检测得到的染色体相应的解是否可行,若可行,则放入下一代群体中,否则将其舍弃。2)采用惩罚的方法来处理约束。如果一个染色体对应的解违反了某个约束,给予一定的惩罚(具体的惩罚即适应度函数见后文),使其具有较小的适应度。这样,一些不可行解也有可能进入到群体,以保证群体中染色体的数目,使遗传算法继续进行。若干代后,不可行解在群体中所占的比例会越来越小,可行解所占的比例会越来越大,最终得到
27、最优解。遗传算法流程图如下:2构造染色体 采用自然数编码方式,解向量可编成一条长度为k+1+n+1的染色体,例如集团中个体适应度的检测评估选择交叉变异图五 遗传算法的基本流程编码和初始集团生成5(0,1,2,n+1,3,4,0,5,n,n+1)。在整条染色体中,自然数1,2,3n代表n个收集点,出发点为0,n+1为终止点。初始化染色体时,先生成n个收集点的一个全排列,再将k+1个0和n+1按0,n+1,0,n+1的顺序随机插入排列中。把第一个0放在最前面,当k+1为奇数时,最后一位一定是0,当k+1为偶数时,最后一位一定是n+1,而且在排列中不能出现0,n+1连续的现象。3.产生初始种群在通过
28、自然数编码产生的排列中随机选择n个符合约束条件的排列作为初始个体,构成初始种群。例如用4辆车向7个站点收集垃圾,设某个排列为1,3,8,2,6,9,4,7,10,5,它表示4条路径0-1-3-8-0,0-2-6-9-0,0-4-7-0,0-5-0,其中的0表示配送中心。若每条路径上的垃圾量之和均小于车辆的最大载货量,则选择该排列作为一个个体;否则,不能选此排列作为个体。并输入控制参数(交叉概率、变异概率、群体概率、群体模型、最大运行代数)。4.确定适应度函数 将目标函数(1)和约束(2)结合作为测量染色体的成本函数,如下: kicniicijcinjkc QBlMAd1100 0,max5.
29、基因重组操作 计算初始群体的个体的适应值保留最优个体,然后对剩余的n-1个个体采用基因换位、基因移位操作进行进化,比较每个个体的第n次与n+1次的适应度值,若z n=zn+1进行基因换位,若z n # include# include# include # define Max 52 int X=0,-8260,-6395,-6328,6400,8034,9691,7415,4010,10163,5770,10510,5287,9842,7486,7418,7988,10736,8104,7528,10414,4838,7540,6491,9998,10235,6050,6802,6192,9
30、687,7521,4150,1895,-4978,-4953,-4990,2847,-4473,-1285,-5243,1237,-2832,1560,-1303,3439,-6146,-4154,-7239,-5951,-4980,-2430;int Y=0,1545,1227,1235,3764,7961,7240,8071,3924,3112,1143,5795,3096,3154,8588,8090,3081,3397,-1592,394,-2486,-5557,465,4299,7600,494,3825,-3844,1391,-2781,468,5260,-5548,-966,-1
31、662,-929,-6848,-7832,-4806,-1087,-6936,-5892,-2763,-4798,-6932,-6491,-1775,-10732,-5353,-11965,-4802;int cn,tt,start; / 要经过的城市个数,起点double arry1MaxMax; / 邻接矩阵,存放两两城市间的距离double fn=0,gn=0,hn=0; / 启发函数double f1=0,g1=0,h1=0;int arry3Max; / 存放已历经的城市名int arry4Max;/ 标志位数组,cn 个城市中已历经的置 0,未历经的置 1/ 定义顶点数据类型str
32、uct Vertex int x;int y;10CityMax;/ 主函数void main() void RandNum(int); void CityCoordinate();double CityCost(int,int);void TSP();double MaxLengh();int i,j;CityCoordinate(); / 随机生成并显示 20 个城市及其坐标printf(“n“);printf(“n“); for(i=1; ilayer2l) temp1=layer2l; for(nn=1;nnlayer2l) temp2=layer2l; arry2y=1; arry2
33、m=1; / 消除假设条件下对 arry2值的改变if (temp1temp2) y=m; else if(0!=layer1m / 比较并查找最佳后继/for(i=1;iMax;i+) printf(“%d “,arry2i); / 显示 arry200000000000000000000000000000000/printf(“n“);g1=g1+arry1Mnodey;Mnode=y; arry2y=0;arry3n=y;14/for(i=1;iMax;i+) printf(“%d “,arry2i); / 显示 arry200000000000000000000000000000000
34、/ printf(“n“);fn=g1+arry1ystart; / 搜索路径附录四:遗传算法代码:function R,Rlength= GA_TSP(xyCity,dCity,Population,nPopulation,pCrossover,percent,pMutation,generation,nR,rr,rangeCity,rR,moffspring,record,pi,Shock,maxShock) clear allA=load(d.txt); AxyCity=A(1,:);A(2,:); %x,y 为各地点坐标xyCityfigure(1) grid on hold on s
35、catter(xyCity(1,:),xyCity(2,:),b+) grid on nCity=50;nCityfor i=1:nCity %计算城市间距离 for j=1:nCity dCity(i,j)=abs(xyCity(1,i)-xyCity(1,j)+abs(xyCity(2,i)-xyCity(2,j); end end %计算城市间距离xyCity; %显示城市坐标 dCity %显示城市距离矩阵 %初始种群k=input(取点操作结束); %取点时对操作保护disp(-) nPopulation=input(种群个体数量:); %输入种群个体数量if size(nPopul
36、ation,1)=0 nPopulation=50; %默认值endfor i=1:nPopulationPopulation(i,:)=randperm(nCity-1); %产生随机个体 end Population %显示初始种群pCrossover=input(交叉概率:); %输入交叉概率 15percent=input(交叉部分占整体的百分比:); %输入交叉比率pMutation=input(突变概率:); %输入突变概率 nRemain=input(最优个体保留最大数量:); pi(1)=input(选择操作最优个体被保护概率:); %输入最优个体被保护概率pi(2)=inpu
37、t(交叉操作最优个体被保护概率:); pi(3)=input(突变操作最优个体被保护概率:); maxShock=input(最大突变概率:);if size(pCrossover,1)=0 pCrossover=0.85; endif size(percent,1)=0percent=0.5; endif size(pMutation,1)=0 pMutation=0.05; end Shock=0; rr=0;Rlength=0;counter1=0;counter2=0;R=zeros(1,nCity-1); newPopulation,R,Rlength,counter2,rr=sel
38、ect(Population,nPopulation,nCity,dCity,Rlength,R,counter2,pi,nRemain); R0=R;record(1,:)=R;rR(1)=Rlength;Rlength0=Rlength; generation=input(算法终止条件 A.最多迭代次数:); %输入算法终止条件if size(generation,1)=0 generation=200;endnR=input(算法终止条件 B.最短路径连续保持不变代数:); if size(nR,1)=0 nR=10; end while counter1generation elsei
39、f counter2nR*2/5 Shock=maxShock*1/4-pMutation; 16elseif counter2nR*3/5 Shock=maxShock*2/4-pMutation; elseif counter2nR*4/5 Shock=maxShock*3/4-pMutation; else Shock=maxShock-pMutation; end counter1 newPopulation offspring=crossover(newPopulation,nCity,pCrossover,percent,nPopulation,rr,pi,nRemain); of
40、fspring moffspring=Mutation(offspring,nCity,pMutation,nPopulation,rr,pi,nRemain,Shock); newPopulation,R,Rlength,counter2,rr=select(moffspring,nPopulation,nCity,dCity,Rlength,R,counter2,pi,nRemain); counter1=counter1+1; rR(counter1+1)=Rlength; record(counter1+1,:)=R; endR0;Rlength0;R; Rlength; minR=m
41、in(rR);disp(最短路经出现代数:) rr=find(rR=minR) disp(最短路经:)record(rr,:); mR=record(rr(1,1),:) disp(终止条件一:)counter1disp(终止条件二:) counter2 disp(最短路经长度:)minRdisp(最初路经长度:) rR(1)figure(2) plotaiwa(xyCity,mR,nCity)figure(3)17i=1:counter1+1; plot(i,rR(i)grid on function newPopulation,R,Rlength,counter2,rr=select(Po
42、pulation,nPopulation,nCity,dCity,Rlength,R,counter2,pi,nRemain)Distance=zeros(nPopulation,1); %零化路径长度Fitness=zeros(nPopulation,1); %零化适应概率 Sum=0; %路径长度 for i=1:nPopulation %计算个体路径长度 for j=1:nCity-2 Distance(i)=Distance(i)+dCity(Population(i,j),Population(i,j+1); end %对路径长度调整,增加起始点到路径首尾点的距离Distance(i
43、)=Distance(i)+dCity(Population(i,1),nCity)+dCity(Population(i,nCity-1),nCity); Sum=Sum+Distance(i); %累计总路径长度end %计算个体路径长度if Rlength=min(Distance) counter2=counter2+1; else counter2=0; endRlength=min(Distance); %更新最短路径长度Rlength;rr=find(Distance=Rlength); R=Population(rr(1,1),:); %更新最短路径for i=1:nPopul
44、ationFitness(i)=(max(Distance)-Distance(i)+0.001)/(nPopulation*(max(Distance)+0.001)-Sum); %适应概率=个体/总和。 。 。已作调整,大小作了调换endFitness %显示适应概率sFitness=zeros(nPopulation,1); %累积概率 sFitness(1)=Fitness(1); for i=2:nPopulation sFitness(i)=sFitness(i-1)+Fitness(i); end18sFitness %显示累积概率 newPopulation=zeros(nPo
45、pulation,nCity-1); %零化新种群 for i=1:nPopulation %甩随机数 a=rand; a %显示甩出的随机数 for j=1:nPopulation if asFitness(j) newPopulation(i,:)=Population(j,:); break endendendfor i=1:size(rr,1) if randpi(1) endendnewPopulation %显示被选中的新种群个体 function offspring=crossover(newPopulation,nCity,pCrossover,percent,nPopulat
46、ion,rr,pi,nRemain)offspring=zeros(nPopulation,nCity-1); %初始化后代ccc=0; for i=1:nPopulation s=find(rr=i); if size(s,1)=0 ccc=ccc+1; elseif randpCrossover %改进方向:优势个体保留,劣势个体不参与交叉 j=unidrnd(nPopulation); %选择另一参与交叉的个体 while i=j j=unidrnd(nPopulation); %unidrnd(n)产生1,2,.,n里的随机数 endwCrossover=floor(nCity-1)*percent); %确定交叉宽度 backPopulation=newPopulation(i,:); pointCrossover=unidrnd(nCity-1-wCrossover); %随机产生交叉点,做差确保不溢出 for m=1:wCrossover 19offspring(i,pointCrossover+m-1)=newPopulation(j,pointCrossover+m-1); endfor n=1:nCity-1 for m=1:wCrossover if backPo