基于改进型遗传算法的TSP算法精品毕业设计完整版Word下载.docx
- 文档编号:18444751
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:12
- 大小:74.71KB
基于改进型遗传算法的TSP算法精品毕业设计完整版Word下载.docx
《基于改进型遗传算法的TSP算法精品毕业设计完整版Word下载.docx》由会员分享,可在线阅读,更多相关《基于改进型遗传算法的TSP算法精品毕业设计完整版Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
2遗传算法优缺点
任何一种算法都不可能十全十美,遗传算法依旧如此,它的优势是可以从多点出发,在解空间内搜寻最优解,而缺点同样较大,首先在编码上,传统的遗传算法是用二进制来编码的。
下面从不同角度来对传统的遗传算法的优劣进行分析。
(1)遗传算法优点
不是从单个点,而是从多个点构成的群体开始搜索。
之所以说是从多点而不是从单点出发,那是因为整个算法的开始是从一个初始种群开始搜索演练最优解,是从多个点开始搜索进化寻找,这样的做的一个好处是避免局部寻找最优解,从任一解出发,按照某种机制,以一定的概率在整个求解空间中探索最优解。
由于它们可以把搜索空间扩展到整个问题空间,因而具有全局优化性能。
同时也缩短了整个搜寻额时间,整体上效率更高、结果更接近最优解。
实现简单,没有复杂的数学计算,在算法中,一般都有大量且复杂的计算作为整个算法的支撑,同时数学计算也是一步比较耗资源和时间的操作,然后在遗传算法中,在搜索最优解过程中,只需要由目标函数值转换得来的适应度信息再加上简单的比较,而不需要导数等其它辅助信息,操作流程也比较简单,没有过多的转换控制操作,中间也没有多少中间变量,算法具有较强的自适应性。
搜索过程不易陷入局部最优点。
目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具,因为是在整个求解空间中探索最优解,所以,基本上不会陷入局部最优解中去。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;
同时,可以将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
但是,传统的遗传算法同样拥有缺陷。
(2)遗传算法缺点
首先,传统的遗传算法编码和解码比较复杂,因为传统的遗传算法的染色体是用二进制编制的,一个染色体就是一串0和1组成的位串或是字符串,在进化前需要做复杂的编码工作,而在得到最优解后还要做复杂的解码工作,比较繁琐和复杂,在遗传操作过程中也不易掌控,容易出错;
其次,算法对初始种群的选择有一定的依赖性。
(3)遗传算法应用领域
遗传算法在人工智能的众多领域便得到了广泛应用[2]。
例如,机器学习、聚类、控制(如煤气管道控制)、规划(如生产任务规划)、设计(如通信网络设计、布局设计)、调度(如作业车间调度、机器调度、运输问题)、配置(机器配置、分配问题)、组合优化(如TSP、背包问题)、函数的最大值以及图像处理和信号处理等等。
另一方面,人们又将遗传算法与其他智能算法和技术相结合,使其问题求解能力得到进一步扩展和提高。
例如,将遗传算法与模糊技术、神经网络相结合,已取得了不少成果。
(4)遗传算法基本流程
遗传算法是模拟生物的进化过程的一类人工智能算法,所以,在算法的初始阶段,应该给一个初始种群给算法来进化演练。
Step1初始化:
设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
Step2个体评价:
计算群体P(t)中各个个体的适应度。
Step3选择运算:
将选择算子作用于群体。
选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
选择操作是建立在群体中个体的适应度评估基础上的。
Step4交叉运算:
将交叉算子作用于群体。
所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。
遗传算法中起核心作用的就是交叉算子
Step5变异运算:
将变异算子作用于群体。
即是对群体中的个体串的某些基因座上的基因值作变动。
群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
Step6终止条件判断:
若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
图2-1遗传算法流程图
本论文的研究则是基于遗传算法的TSP路径问题。
3传统遗传算法解决旅行商问题
3.
算法的基本过程可以表述为:
将问题的可能解编码后以字串或数组的方式表示为染色体,在算法的开始部分随机产生一个染色体群体做为初代种群,然后将群体中的染色体个体放在一定的环境中,按照自然进化的适者生存的原则,从中选出适应环境较好的个体,进行复制(reproduction)、交叉(crossover)、变异(mutation)等操作,产生下一代更加适应环境的个体。
一代一代的进化,当满足一定的收敛条件时,进化停止,得到问题的最优解(有可能在局部最优解处收敛)。
算法的伪代码如下(t为当前代数,MAXGENS为进化的代数)[4]:
Begin
t=0;
InitializeP(t);
EvaluateP(t);
While(t<
MAXGENS)do
t=t+1;
SelectP(t)fromP(t-1);
RecombineP(t)byprobabilitypc;
MutateP(t)byprobabilitypm;
Done
End
3.1关键步骤
本文研究的是遗传算法在旅行商问题上的应用,基础是原始的遗传算法,基本操作包括编码、初始化种群、评估、终止、选择复制、交叉变异、产生新种群或终止,在中间会穿插遗传算子的设计,具体步骤的操作如下:
(1)编码
这一步是构建个体(染色体),我们都知道,在遗传学上,染色体是遗传基因的承载体,在遗传算法中,依旧是如此,遗传算法中编码的好坏直接影响算法的运行效率和得出的结果的正确性。
在传统的遗传算法中,编码采用的是二进制串,用一连串的0和1来表示一个个体,然后来操作这一串0和1。
也有采用浮点数方式来编码的,在此处就不在赘述了。
(2)设计遗传算子
遗传算子包括变异算子和选择算子,变异算子主要用于个体的变异操作,以此来防止算法“早熟”。
选择算子则是用于选择当代种群中的个体来繁殖下一代个体。
在传统的遗传算法中两个遗传算子都是一个小于1的浮点数。
(3)初始化种群
该操作是产生第一代解空间,模拟第一代祖先,后代都是在这一初始种群的基础上进化变异而来。
初始化种群一般都是随机产生符合基本规则的解空间。
在传统遗传算法中,初始化种群一般最常用的做法是随机产生一个符合基本要求的种群,然后基于此种群来演练遗传,这样做的一大弊端是效率低下,带有较大的盲目性。
(4)个体的评估
在衍生下一代种群前,应该挑选优秀的基因来充当亲代,这样更能符合遗传算法的理念——物竞天择,适者生存,为此,要先对亲代种群进行评估,计算出他们的适应度。
在衍生出一代新的种群后,我们要评判它的每一个个体的好坏,并且计算出它的适应度,用来作为是否被选择成优秀个体来传承或是整个遗传过程能否提前结束的重要凭证。
在这一步操作中,要依赖评价函数,而评价函数的构造则一般是从目标函数转换而来。
旅行商问题中,评价函数一般都是计算出每一条路径的程度之和,也用此路程总和来作为每个个体的适应度的计算参数。
(5)终止
在传统的遗传算法中,评价完新产生的种群后,会来判断新产生的种群是否符合终止条件,如果符合,那么就得到最优解并结束遗传过程;
如果不符合,则继续遗传操作,直到寻找到符合条件的最优解或是直到自然结束遗传操作过程。
(6)选择复制
在一个群体中应当选取哪些染色体进行遗传操作,产生下一代染色体,一般的方法是使用评价函数f(n)对每一个染色体进行评估,f(n)值越大,表示染色体越适应环境,染色体表示的可能解也越接近于最优解,染色体的适应值越好,被选中的概率也就越大。
适应函数f(n)设计与选择策略的选取是遗传算法最重要的一步,亲代的选择复制直接影响到下一代个体的质量。
首先利用评价函数来对每一个个体评价,计算出它们的适应度,然后利用选择方法来选取父代来遗传下一代。
当前,用的比较广泛的选择方法是赌轮盘[5],基本原理是适应度越大的个体,被选取的几率就越大。
(7)交叉、变异与产生新种群
这两步操作比较复杂,同时也是整个算法的核心所在。
被选中的染色体通过怎样的操作来产生下一代的染色体?
常用的操作有交叉和变异。
交叉是在选中的用于繁殖下一代的个体中,对两个不同个体的相同位置的基因进行交换,产生新的个体,交叉操作以较大的概率进行。
常用的交叉方式有单点交叉、两点交叉和一致交叉。
所谓的单点交叉是在两个父代个体(染色体)也就是在一串0和1组成字符串的中相同的位置各设置一个点,然后交换两个亲代的后半部分,重新生成两个不同于亲代的子代,例如,现有两个亲代字串如下:
A1=100011‖00111
B1=010101‖10101
则经过交叉后产生的子代如下:
A2=100011‖10101
B2=010101‖00111
单点交叉遗传的一大缺点是,如果两个亲代一样(在遗传算法中是可以两个亲代一样的,而且这样的几率还很大,特别是那些优秀的个体,因为它们被选取的几率要比其它的个体被选取的概率大多了)那么产生的两个完全一样,而且还与父代也一样,例如上例改为:
B1=100011‖00111
那么产生的子代就是:
A2=100011‖00111
B2=100011‖00111
完全失去了杂交的效果,而且也让优秀的个体失去了继续进化的机会。
由于编码的原因,上面的操作还需检查每次复制后是否会出现重复的城市点,如果从一个亲代复制到另一个亲代的基因中已经存在,那么解决办法则是,删除被复制中重复的基因,保留原有的基因。
为了克服单点交叉遗传的缺点,在单点交叉的基础上产生了两点交叉,两点交叉是在单点交叉的基础上多加了一个断点,交换要复杂一些,当然,效果也克服了一些单点交叉遗传的缺点。
两点交叉是在父代中添加两个断点,将父代分割成三个片段,两个亲代都保留中间的基因片段到子代中,然后将第二个亲代的第三个基因片段中没有在第一个亲代保留基因片段出现的基因从第一个亲代的第一个位置开始按顺序复制到第一个亲代中去,如果在中间保留的基因片段没有,而第三个片段有相同的基因,则将第三个基因片段中相同的基因删掉。
第二个子代的产生与第一个子代产生的过程一样,具体例子如下:
A1=100011‖00111‖110001
B1=010101‖10101‖010101
那么产生的子代个体的基因则是:
A2=010101‖00111‖110001
B2=110001‖10101‖010101
以上是交叉遗传操作,为了防止算法“早熟”,就产生了变异操作。
变异是对选中的染色体上某些基因进行反向转化,如在0、1位串中,将某个位置上的0变成1或者将1变成1。
通常变异的概率较小,但它可以防止算法‘早熟’,即收敛于局部最优解。
例,个体基因为00010010101,先产生一个[0,1]之间的浮点数,判断它与变异算子之间的关系,则继续下一步操作,然后产生一个正整数,将字串中该位置的基因反向,如果产生的正整数是5则,上面的个体变异后得到的新个体为00010110101。
在经过交叉与变异操作后,新的种群基本上就产生了。
3.2总结
从上述步骤中,不难发现,传统的遗传算法操作中有很多缺陷和不便,编码上,因为采用二进制编码,所以个体的基因片段是一串0和1组成的字符串。
首先,在编码时,需要将原本的个体信息转换为二进制,这一步比较复杂繁琐,并且容易出错,在转换后,后面的操作基本上都是依赖于这一串0和1组成的字符串,虽然这一串0和1组成上简单,但对它的操作却是大大的增加了遗传操作的难度。
在交叉遗传中,因为是路径问题,所以有可能交叉后在一条路径中会出现重复的城市,因此,在交叉后需要将新产生的子代转换为真实的城市路径,检测是否出现了重复城市,如果检测到有,则要重新生成,直到没有重复城市出现,在这步操作中做了大量的重复且复杂的操作,而且容易出错,不易掌控。
同样在变异操作中,得到的新的个体并不一定是一条实际有意义的城市,因此同样检测,那么它的检测过程同样和交叉变异那样,繁琐复杂。
在评价时同样是件繁琐的工程,因此,将遗传算法应用在路径的寻找问题上,还需要做很大的改进。
4.改进后的遗传算法
本系统基于传统的遗传算法以及其它的人工智能算法,结合变异而成了改进的遗传算法。
基本步骤和操作流程基本上没有改变,改变一些流程的操作和操作方式,大体流程依旧遵照传统的遗传算法,在过程中添加了一个精英策略的思想。
精英策略,是指每一代都选择出最优秀的一个个体P,然后将该个体P拿去和上一代的最优秀的个体进行比较,保留最优秀的那个,将其存入系统全局变量中,后面的每一代依旧重复此操作,这样做的目的是确保系统最终得到的最优解是整个遗传操作过程中出现过的最优解,这就是经营策略的大体含义。
改进后的遗传算法的大体流程是初始化种群、评价个体、选择复制、交叉遗传、变异、评价种群个体、精英筛选、终结,其中初始化种群和第一次评价个体只需在遗传操作的刚开始部分执行一次,其余的操作在遗传过程中要不断重复,具体各步骤如下:
4.
4.1.编码、设计遗传算子
改进后的在染色体的编码上,摒弃了传统的二进制编码方式,而是采用城市的序号编码,一条路径就是一连串的城市序号组成,同时这一串序号也代表一个个体。
这样编码的好处在与更容易理解、操控,同时克服了传统遗传算法中编码和解码繁琐的弊端。
如对8个城市的旅行商问题进行编码,城市的编号分别为{1,2,3,4,5,6,7,8},则染色体的编码串34286751表示以特定的顺序3—>
4—>
2—>
8—>
6—>
7—>
5—>
1来依次访问各座城市。
以该条路线的总路程长度为适应函数f(n),评价标准是适应度越小,路径越好。
这样编码容易理解,对于后续的操作也比较简单,而且也容易计算路程,在变异操作中也容易,只需交换两个城市的位置,效率也比传统的遗传算法中的变异操作高效。
最主要的是,在交叉遗传时的检测,不存在复杂的转换工作,只需检查路径中是否有相同的序号,以此来判断路径中是否有重复的城市。
遗传算子保留了传统的遗传算法中的设计方式,仍旧采用选取[0,1]之间的浮点数作为遗传算子,然后来进行比较判断,根据是否满足条件来判断是否能够做下一步操作。
4.2.种群初始化
改进后的遗传算法在种群初始化上做了较大改变,初代种群作为整个算法的入口,有必要在上面多多改进。
遗传算法与退火算法的结合也体现在此处。
此处的结合不是指将退火算法完全整合到遗传算法中,而是摒弃了退火算法中的缺点,选择其优点来弥补遗传算法中的某些步骤,在本系统中,选取了退火算法中的一个重要步骤来产生遗传算法的初始种群,这样有目的的初始化虽然在某种意义上干涉了自然进化,但好处在于,只是干涉了初代,并不妨碍后代的进化。
这样做主要是为了克服传统遗传算法中初始化种群的盲目性,这样初始化种群使得初代的原始基因更优秀。
甚至,有一定的机率直接产生现阶段已知的最优解。
4.3.评价
经过改进后遗传算法,在评价这一步操作,仅仅只是计算出每个个体对应路径的总路程,然后将其排序,方便后续的操作。
另外,本系统在计算个体的适应度上有了较大的改进,在传统的遗传算法中,适应度越大代表该个体越优秀,那么同理,在本系统中,也应该是适应度越大那么就越好,然而个体的适应度是基于总路程来计算的,从理论上来讲,路程应该是越短,那么该个体就越优秀,这与遗传算法的适应值得定义背道而驰。
为了解决这一大难题,最终想到了,求倒数的方法,计算简单,效果也很明显。
基本步骤是,计算出每个个体的总路程之和后,然后求出它们的倒数,为了让后面的选择更顺利、高效,在此处将求得的倒数扩大了几倍,使得每个个体间的倒数差值增大。
扩大倒数的方法也很简单,没有什么复杂的计算,只是将每个个体的总路程的倒数扩大1000以上(因为每个个体的总路程的倒数值较小,必须扩大),然后将扩大后的倒数在幂指数级别上扩大,扩大后的值之间的差值均匀且高效。
4.4.选择复制
本系统的选择基本上也是同传统的遗传算法一样,采用经典的轮盘赌选择方法。
轮盘赌选择又称比例选择算子,它的基本思想是:
各个个体被选中的概率与其适应度函数值大小成正比。
设群体大小为n,个体i的适应度为Fi,则个体i被选中遗传到下一代群体的概率为:
Pi=Fi/
具体操作为:
计算群体中所有个体的适应度函数值;
利用比例选择算子的公式,计算每个个体被选中遗传到下一代群体的概率;
采用模拟赌盘操作(即生成0到1之间的随机数与每个个体遗传到下一代群体的概率进行匹配)来确定各个个体是否遗传到下一代群体中。
本系统在经过改进后,在适应度函数值的计算上有了适当的调整和变化。
系统在评价每个个体时就算出了它们个体总路程的倒数,并做了适当放大处理,然后存储起来,并给它命名为伪适应值。
在计算每个个体的适应值的时候,先将所有的伪适应值累加起来,得到一个总的伪适应值,然后用每一个伪适应值来除以这个总的伪适应值,获得结果就是最终的适应值。
在计算出每一个个体的适应值后,接着就是轮盘选取操作了。
轮盘操作是将整个选取范围看做一个圆盘,然后将圆盘按一定的规则划成小块,而每个个体通过适应值被选取的几率范围刚好与那些小块一一重合,然后每次一个小针都从固定的地方旋转来选取个体,适应值越大的个体所占的区域就越大,那么该个体被选取的机会也就越大。
而这个区域也不是适应值,先将种群按适应值排序,然后将适应值累加,适应值最小的那个个体的适应值为f1,那么它对应的区域w1则是[0,f1],后面的区域wi则是自己的适应值fi加上wi-1,计算公式如下:
wi=fi+wi-1
图4-1轮盘区域划分图
随后,随机产生一个[0,1]之间的浮点数,来模拟轮盘赌中的指针,根据这个浮点数所在的区间来判断选取个体到下一代中。
这种操作的好处是,越优秀的个体,那么它被选取的机会也就越大,这样积累下去,整个种群的进化也是朝着一个良性方向去进化。
4.5.交叉
在选取好亲代种群后,接下来便是交叉遗传了,在上面的传统遗传算法的介绍中,已经剖析了传统遗传算法的好与坏,交叉操作在整个遗传过程中是重点中的重点,同时也是难点中的难点。
本系统在吸取了前人的经验的基础上做了大量的改进,摒弃了传统遗传算法中不好的地方,吸收了现代的优良设计,使得算法的效率大大提升了。
在传统的遗传算法,交叉操作都是基于单点或多点交叉运算,本系统也是基于这种想法,只是具体实现上做了较大改变。
具体想法是,首先从两个亲代中随机选取一个基因作为一个子代的开始,也就是这个子代的第一个基因,然后从第二子代开始,每次都随机抽取一个亲代,从中来选择基因,当确定了从哪个亲代中继承基因后,然后从当前子代取得现在已有基因片段的最后一个基因ci,拿到这个基因后找到要继承的亲代中该基因的位置li,然后拿到该位置相邻位置右边的基因,拿到右边的基因后,在子代基因中查看是否已经存在该基因,如果存在,那么就取得亲代li左边的基因,然后同样在子代中查看该基因是否已经存在,如果同样存在,那么重新随机在该亲代中获取一个基因,接着在子代中查看此基因是否已经存在,如果有,则重复,直至找到一个不存在的基因。
其它的基因重复上述操作,直至两个子代都产生了,例如,现有两个亲代F1,F2,基因片段分别如下:
F1={4,5,2,6,7,3,1,8,9}
F2={6,2,3,8,7,9,1,5,4}
对上面两个亲代个体做遗传操作时,预期结果是产生两个子代C1和C2,如果先来产生出C1,先随机抽取一个亲代的一个基因作为C1的第一个基因,随机抽取F1的第二个基因作为C1的第一个基因,那么C1={5},在确定了第一个基因后,再来产生第二个基因,假设这次从第二个亲代F2来继承第二个基因,那么先取得C1最后的一个基因5,然后在F2中找到基因5的位置,拿到基因5右边的基因,此处是4,4在C1中没出现过,所以是合法基因,那么C1={5,4},接着是第三个基因,假如这次是从亲代F1中来继承第三个基因,那么取得C1最后的基因4,再取得F1中4右边的基因5,经过验证后5已经在C1中了,那么就得获取4左边的基因了,然而4已经是最左边了,那么怎么办呢?
此处的解决方案是,将F1首尾衔接起来构成一个环,那么4的左边就是9了,9在C1中没出现过,所以C1={5,4,9}。
重复上述步骤,得到的两个子代C1,C2分别是:
C1={5,4,9,1,8,7,3,2,6}
C2={8,9,1,3,2,6,4,5,7}
遗传操作的基本思想是优胜劣汰,适者生存,而在选择复制操作过程中,采用的是轮盘赌算法,其理论是适应性越大,那么被选取的几率也就越大,所以在经过选择复制操作后,越优秀的个体在群体中所占的比例也就越大,所以,在群体中,会有大量相同的优秀个体,在传统的遗传算法中,在交叉操作时两个相同的亲代会产生两个如亲代相同的子代。
从上面的操作过程和结果可以看出,经过改进后的遗传算法,克服了这一弊端,相同的两个亲代个体也可以产生两个互不相同的子代。
如果两个亲代F1、F2都是{2,3,4,8,1,7,9,6,5},随机第一个子代C1的第一个基因就是
4.6.变异
变异操作在原理和思想上与传统的差别较大,传统的遗传算法是将需要变异的基因中的某个或几个基因做方向操作,进过改进后的遗传算法,个体是用序号串做基因的,所以原来的传统的变异操作在此处不可取,也行不通。
所以,在此处,采用了另外的方案,具体操作是,先用变异算子来决定个体是否需要做变异操作,在决定要做变异操作后,传统的遗传算法是随机抽取一个或几个基因进行反向操作,在这里,同样效仿了这种操作,随机抽取两个不同位置的基因,然后将它们的位置交换,已达到变异操作的目的,这种方式简单,效率也比较高
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 改进型 遗传 算法 TSP 精品 毕业设计 完整版