人工智能.docx

上传人:b****5 文档编号:8012097 上传时间:2023-01-27 格式:DOCX 页数:21 大小:193.80KB
下载 相关 举报
人工智能.docx_第1页
第1页 / 共21页
人工智能.docx_第2页
第2页 / 共21页
人工智能.docx_第3页
第3页 / 共21页
人工智能.docx_第4页
第4页 / 共21页
人工智能.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

人工智能.docx

《人工智能.docx》由会员分享,可在线阅读,更多相关《人工智能.docx(21页珍藏版)》请在冰豆网上搜索。

人工智能.docx

人工智能

遗传算法的TSP(旅行商问题)的求解

摘要

遗传算法是根据自然界的“物竞天择,适者生存”现象而提出的一种有效搜索算法。

经典遗传算法对单一种群进行选择、交叉及变异操作,对于在进化过程中出现的超级个体容易过早的陷入局部最优解。

遗传算法具有天然的并行性,适用于并行求解,因此可以用并行遗传算法研究典型的TSP问题的求解。

本文提出了一种有效的基于多种群的并行遗传算法,各个种群相互独立进化,对不同的种群应用不同的搜索策略,比如不同的交叉及变异概率,以达到不同的搜索目的;同时在各个种群之间利用迁移算子每隔一定进化代数相互传递遗传信息,迁移算子用源种群的最优个体去替换目标种群的最差个体;从而解决经典遗传的收敛到局部最优值的问题。

实验表明,该方法在解的质量上优于经典的遗传算法。

关键词:

遗传算法;旅行商问题(TSP);并行遗传算法;多种群;迁移算子

Abstract

Geneticalgorithmisbasedonnature's"naturalselection,survivalofthefittest"situationandmadeaneffectivesearchalgorithm.Classicalgeneticalgorithmusesasinglespeciestocarryoutselection,crossoverandmutationoperation;ifevolutionoccurredatsuper-individual,thenthealgorithmeasytoprematurelyintoalocaloptimalsolution.Geneticalgorithmhasanaturalparallelismforparallelsolving,sowecanuseparallelgeneticalgorithmforatypicalproblemsolvingTSP.

Thispaperpresentsavarietyofeffectivegroup-basedparallelgeneticalgorithm,eachspeciesevolvedindependentlyofeachother,thedifferentspeciesusedifferentsearchstrategies,suchasdifferentcrossandmutationprobabilityinordertoachievedifferentsearchpurposes;simultaneouslyinvariousspeciesmigratebetweentheuseofoperatoralgebraattheevolutionofeachothermustpassgeneticinformation,migrationoperatorwiththeoptimalsourceofindividualspeciestoreplacetheworstindividualtargetspecies;inordertoaddresstheconvergenceofclassicalgeneticvaluetothelocaloptimumproblem.Throughtheexperimentswecanseethatthemethodinthesolutionqualityissuperiortotheclassicalgeneticalgorithm.

 

Keywords:

geneticalgorithm;travelingsalesmanproblem(TSP);parallelgeneticalgorithms;avarietyofgroups;transportoperator

目录

第一章前言1

1.1遗传算法1

1.2TSP问题2

1.3本文的工作2

第二章基于多种群的并行遗传算法的TSP求解3

2.1TSP编码问题与适应度函数4

2.2遗传算法的算子设计5

2.2.1选择算子的设计5

2.2.2交叉算子的设计6

2.2.3变异算子的设计7

2.2.4迁移算子的设计8

2.3各子种群的初始化与搜索策略9

第三章算法的实现10

3.1程序模块11

3.2核心代码描述11

3.3运行界面与结果13

第四章实验结果与分析15

4.1实验说明15

4.2实验结果16

第五章结论18

5.1本设计的总结18

5.2本设计的不足19

5.3类似的算法比较20

参考文献21

致谢22

第一章前言

本文针对传统的单一种群的遗传算法解决TSP时易陷入未成熟收敛以及算法收敛速度较慢等缺点,提出了一种基于多种群的并行遗传算法。

该方法比较有效地克服了以上两个缺陷,同时带来了解的质量上的提高。

1.1遗传算法

遗传算法是根据自然界的“物竞天择,适者生存”现象而提出的一种有效的随机搜索算法,20世纪70年代由美国的密执根大学的Holland教授首先提出。

[1]

该算法是一种模拟生物进化过程的全局收敛算法[13],将寻求优异解的过程看作生物种群遗传进化的过程,在不断的遗传进化过程中,较优个体逐渐淘汰较劣个体,从而最终寻得较优解。

遗传算法只需要计算当前代个体的适应值,而不需要获得其他信息,即不依赖于问题的具体领域,就可以实现有效的搜索;这种特性使遗传算法在组合优化问题中获得广泛的应用,并成为研究热点。

遗传算法以种群为单位进行选择、交叉以及变异等操作,因此其具有天然的并行性,很容易联想到多个子种群同时进行遗传进化的并行遗传算法;同时传统的遗传算法以单一种群为基础,在种群的遗传进化过程中容易过早地陷入局部最优解。

可以通过并行遗传算法来避免传统遗传算法的早熟现象。

并行遗传算法的特点是多个子种群同时进行遗传进化,子种群与子种群之间定期进行遗传信息交流;并行遗传算法已经成为遗传算法的发展方向与研究趋势。

并行遗传算法的研究已有多年,成果也较多,已提出多种并行实现方案,其中主要的有两种:

主从式模型以及独立式模型。

主从式并行模型将种群分成若干个子种群,每个进程处理单个子种群。

同时主从式模型还设置了一个主进程,来完成对各个从进程之间的通信与协调。

这种并行模型在1992年由Abramson在共享存储器的并行计算机上实现。

由于在主从式并行模型中,各个从进程只能而且都要和主进程进行通信来达到各个子种群之间的协调进化,因此需要很强的同步性,而且主进程和各个从进程之间的负载也很不平衡,同时大量的通信也影响了整体的效率。

独立式模型也将种群分成若干个子种群,不同的是取消了主从式并行模型中主进程的作用,取而代之的是各个子进程独立处理各个子种群,各个子种群独立进化,在必要的时候(比如每隔一定代数)进行遗传信息交流。

由于各个子种群之间独自进行选择交叉变异等操作,因此各个进程之间负载相对平衡,克服了主从式并行模型的相关缺陷,是当前应用最广泛的并行模型。

独立式模型也称孤岛模型[8]。

本论文采用独立式并行模型。

1.2TSP问题

旅行商问题(TravelingSalesmanProblem,TSP)可以描述如下:

设有n个城市,城市间的距离用矩阵D=[dij](i,j=1,2,…,n)表示,其中dij表示城市i与城市j之间的距离。

当问题对称时,有dij=dji。

有一个旅行商从一个城市出发,每个城市访问一次,并且只能访问一次,最后再回到出发城市。

问如何行走才能使得行走的路径长度最短。

[1]

TSP问题是典型的组合优化问题,并且是NP难问题,是许多领域内出现的多种复杂问题的集中概括和简约形式。

针对TSP问题已提出过很多算法,如穷举搜索法、贪心法、动态规划法、分支界定法等等,但是没有一个算法可以在多项式时间内获得解。

[2]TSP问题的所有路线的组合有(n-1)!

/2种,因此它的搜索空间随着城市数n的增大而迅速地增加,从而不可避免地出现“组合爆炸”的问题。

例如当n=3时,路线组合有(3-1)!

/2=1种;当n=20时,路线组合有(20-1)!

/2=60822550204416000种;而当n=100时,路线组合有(100-1)!

/2=4.6663107721972075e+157种。

如此庞大的搜索空间,要想从中寻找到最优解是很困难的。

因此,研究相应的有效算法求解其最优解或近似解具有重要的意义[6]。

遗传算法并没有所谓的“组合爆炸”问题,因为它的种群的大小是一定的,比如48个城市的TSP问题,我们可以设定种群大小为20,在种群遗传进化过程中,种群大小维持20不变。

遗传算法最终求得的是近似解。

1.3本文的工作

实验结果表明,本文所设计的多种群并行遗传算法相对传统的单一种群的遗传算法在解的质量上更优,并且寻求最优解的收敛速度更快,同时随着多种群并行遗传算法的子种群数量的增加,算法的收敛速度以及解的质量也相应地加快与提高;该算法有效地避免了未成熟收敛的问题。

这说明本设计所提的算法的有效性。

本实验的代码是基于 WindowsXP运行平台,采用eclipse集成开发环境,用java语言编写而成的。

第二章基于多种群的并行遗传算法的TSP求解

本章描述多种群并行遗传算法各个组成部分的设计,包括编码问题的解决、染色体适应度函数的选择、各个遗传算子的设计,以及本设计的算法描述等等。

2.1TSP编码问题与适应度函数

在遗传算法求解时,首先需要对问题的解进行编码,使之成为染色体进行各种遗传算子(比如交叉、变异等等)的操作。

遗传算法的编码方式有多种形式[14],最简单也最常见的编码方式是二进制形式的编码。

如果采用二进制形式的编码,对于有n个城市的TSP来说,可以用n*n位二进制位来表示。

例如n=4,假设城市表示为1、2、3、4,那么解2=>3=>4=>1=>2就可以表示为:

0100001000011000,也就是说,对于第i个n位二进制数,如果1所在的位数是j,那么就表示这个解的第i个走的城市是j;因此,0100001000011000,第1个走的城市是2,第2个走的城市是3,第3个走的城市是4,第4个走的城市是1,即表示解2=>3=>4=>1=>2。

那么对于城市数为n的TSP,用n*n位二进制位可以来表示一条完整的旅行路线。

然而,对于这种编码方式,一个n*n的二进制位可以表示的编码个数为2n*n,然而所有可能的解只有n!

/2,因此在整个编码空间内,解只占了很小的一部分;并且对于交叉变异等遗传操作来说,如果改变其中的一位(比如将0变成1),就会造成解的不正确。

因此,二进制编码方式将造成求解效率的低下。

对于n个城市的旅行顺序,一个很自然的想法就是对n个城市进行编号(从1到n进行编号),那么1到n的数的一个排列就代表了TSP的一个可行解。

[1]对于这种整数编码方式,所用的位数很少(只需n位),所面临的问题是交叉与变异过程中确保解的正确性问题。

本文采用这种整数编码方式。

对于一条染色体,所对应的回路的总路径越短,表示这条染色体对环境的适应值越大;因此,可以用总路径长度的倒数来表示一条染色体的适应值,用数学公式表示如下,其中,f表示解的适应值,d(i,j)表示从城市i到城市j的路径长,c(i)表示处于解的第i位的城市编号。

2.2遗传算法的算子设计

在多种群并行遗传算法中,总共有四种遗传算子——选择算子、交叉算子、变异算子以及迁移算子。

跟传统的单一种群的遗传算法相比,并行遗传算法多了一个迁移算子;各个子种群通过迁移算子定期进行遗传信息的交流。

2.2.1选择算子的设计

选择算子要体现自然界生物进化过程中“优胜劣汰,适者生存”的选择规律,从群体中选择优胜的个体,淘汰劣质的个体[11]。

从具有N条染色体规模的群体中选择出若干条染色体作为一个种群,在这里种群的规模与群体规模一样,都具有N条染色体。

选择操作要依据适应值的大小,适应值是模拟自然界生物对环境的适应能力。

适应值大的染色体存活的机率大,并且在选择过程中可能不止一次地被选择;而适应值小的染色体存活的机率小,并且在选择过程中可能被淘汰。

因此在选择出来的敌群中,适应值大的染色体可能被多次地选择保存下来,而适应值小的染色体被选择的次数小甚至没有,这正体现了“优胜劣汰,适者生存”的选择规律。

对于选择算子的设计,目前有多种设计可供参考,比如轮盘赌选择方法[1]、确定性选择方法[1]等等。

其中轮盘赌选择方法是最被经常使用的方法。

本设计采用的正是轮盘赌算法。

轮盘赌的方法描述如下:

假设群体的规模为N,xi(i=1,2,…,N)表示群体的各条染色体,f(xi)表示染色体xi的适应值,p(xi)表示染色体xi被选择的概率,那么,显然有公式

[1]

可以这样设计轮盘赌:

一个转盘有N个格子,每个格子代表着一条染色体,格子的长度与该格子所代表的染色体的p(xi)成正比,这样p(xi)越大则被选择的概率越大;在转盘上有一个固定的指针,转动转盘,待转盘停止之后,指针指向的格子所代表的染色体就是被选择的染色体。

在本设计中,模拟轮盘赌的算法如下:

doubler=Math.random();

intj=0;

doubleselectP=pro[j];

while(r>selectP){

++j;

selectP+=pro[j];//j指向最大的那个pro[]的概率最大

}

for(intk=0;k

newPop[i][k]=pop[j][k];//产生新的种群.

}

2.2.2交叉算子的设计

交叉即交配,是遗传算法的一个重要算子,在遗传算法中起着核心作用[15]。

交叉操作发生在两个被称为双亲的父染色体之间,交叉操作完成后,产生两个具有双亲部分基因的新染色体。

在二进制编码的染色体中,交配通常是随机生成一个交配位i(i>=1&&i<=n,n为染色体基因个数),两父染色体中从1到i位之间的基因不变,i+1到n位之间的基因互换,就产生了两个新染色体,其过程描述如下:

设a、b是两个要交配的父染色体,表示如下:

a:

a1a2a3…an

b:

b1b2b3…bn

其中

如果随机产生的交配位是i,那么两父染色体前i个基因不变,后n-i个基因互换:

a1a2a3…ai|ai+1…ana1a2a3…aibi+1…bn

b1b2b3…bi|bi+1…bnb1b2b3…biai+1…an

图1二进制染色体交配过程示意图[1]

于是,就得到了两个新染色体a1a2a3…aibi+1…bn与b1b2b3…biai+1…an。

以上由于ai和bi都是0或者1,因此交叉不会产生任何问题。

由于在TSP中,可行解的编码是1到n的一个排列,因此如果按照二进制染色体的交叉方法进行交叉操作后,形成的新的染色体就极可能不是从1到n的一个排列,从而产生一个无效的染色体。

为了使交叉后产生的染色体保持编码的有效性,本设计采用常规交配法。

常规交配方法与二进制染色体的交配方法类似,不同的只是交配位后面的基因选取。

假设两个父染色体分别叫做父代1和父代2,产生的两个新染色体分别叫做子代1和子代2。

常规交配法开始时,随机产生一个交配位i(i>=1&&i<=n,n为染色体基因个数)。

子代1的前i个基因完全复制父代1的前i个基因,后n-i个基因则从父代2中顺序选取子代1中还没有出现过的基因;子代2的基因选取和子代1相似。

举例说明如下:

设有两个要交配的父染色体a和b,表示如下:

a:

56418723

b:

16325487

假设随机产生的交配位是4,那么常规交配法的交配过程如下:

5641|87235641|5487

1632|54871632|8723

图2常规交配法示意图[1]

其中子代1的前4个基因复制父代1的前4个基因5641,后4个基因从父代2中顺序选取后四位基因,选取的结果是5487,所以,子代1的染色体表示为56415487;类似地,子代2的染色体为:

16328723。

2.2.3变异算子的设计

变异一般发生在某条染色体的某个基因上,在二进制编码的染色体中,一般先随机产生一个变异位,然后将该变异位的基因由0变成1,或者由1变成0。

例如,如果随机产生的变异位是4,参与变异操作的染色体为100110,那么,变异的过程如下:

变异前:

100110变异后:

100010

变异位,基因由1变成0

图3变异前后的编码变化[1]

然而,与交叉算子的设计相似,当染色体是以整数形式进行编码时,还是考虑算子操作后形成的新染色体的合理性。

如果将某一位的整数基因变成另一个整数,就可能造成新染色体所代表的整数排列不是从1到n的一个排列,造成解的无效。

对于整数编码的变异算子,目前有很多种设计,比如有基于位置的变异、基于次序的变异和打乱变异等待。

在本设计中,变异算子采用基于次序的变异。

基于次序的变异算子先随机地产生两个变异位,然后将参与变异的染色体变异位对应的两个基因互换,形成新的染色体。

例如,假如随机产生的两个变异位是3和8,而参与变异的染色体是521634897,那么变异的过程如下:

变异前染色体为:

521634897,变异位3和8对应的基因是1和9,1和9互换,变异后的染色体为:

529634817。

变异算子将可变性引入了种群中,增加了种群的多样性,在一定程度上避免了陷入局部最优的现象。

然而,变异操作也可能会破坏优秀个体对环境的适应性,因此变异算子一般以一种很低的概率进行。

2.2.4迁移算子的设计

传统的单一种群的遗传算法并没有迁移算子[3]的概念,迁移算子的设计,是为了实现多种群并行遗传算法中各个子种群之间的遗传信息的交流。

迁移算子的引入,使得各个子种群之间得以进行遗传信息的交流,并且协调各个子种群之间的进化。

迁移操作是并行遗传算法粗粒度模型中普遍采用的信息交互方式,实现的关键在于迁移策略、迁移周期和迁移规模的选择[4]。

迁移算子的策略常见的有“一对多”和“一对一”。

[4]“一对多”的策略要求子种群的优秀个体同时向多个子种群传播,同时也可能同时接收多个其他子种群发送来的优秀个体,这种策略使得优秀个体得以较大范围地传播,也使得一个子种群能够获知较多子种群的遗传信息;然而同时这种迁移策略要求较多的通信开销,同时对通信的协调有较高的要求,因此会影响算法的整体效率。

“一对一”的策略要求子种群的优秀个体向某一子种群传播,同时也接收某一子种群发送过来的优秀个体,这种策略下优秀个体虽然不像“一对多”的策略下传播得广,但是在实现适度的遗传信息交流的情况下,减少了通信的开销与协调,因此在本设计中采用“一对一”的迁移策略,具体的方法是将当前进程下的子种群的最优的若干个个体去替换下一个进程的子种群的最差的相同数量的个体,而最后一个进程则向第一个进程迁移。

迁移算子的周期必须适当。

如果迁移算子的迁移频率过慢,比如每隔20代甚至更多代才进行一次遗传信息的交流,那么种群中出现的优秀个体不能及时地传播到其他种群,不利于各子群之间的交流与协调;然而如果迁移算子的迁移频率过快,比如每隔一代就进行一次遗传信息的交流,那么这样固然有利于优秀个体的传播,有利于各子种群之间的交流与协调,但是同时过于频繁的交流意味着过多的通信操作,大规模的通信开销势必造成算法效率的低下,同时频繁的交流也会破坏各个子种群的遗传进化的独立性。

一般而言,迁移周期可以每隔几代进行一次,在本设计中,根据概率进行一次迁移。

迁移算子的规模必须适当。

和迁移周期类似,过大的迁移规模(比如一次迁移种群一半的个体)会导致过大的通信开销,而且破坏各个子种群之间遗传信息的相对独立性,而过小的迁移规模(比如一次只迁移种群的1%的个体)又不利于传播优秀的个体到其他种群,不利于各子种群之间的交流。

一般而言,迁移的规模是种群中个体数目的10%~20%[4]。

本设计的迁移规模高计为种群中个体数目的20%。

本设计的迁移算子的算法描述如下:

a)如果当前代数不是4的倍数,则转到g);

b)size=种群大小*20%;

c)选取种群中最优的size个个体;

d)将这size个个体发送给下一个子种群,如果当前子种群排在最后,则发送给第一个子种群;

e)接收来自上一个子种群的size个个体,如果当前子种群排在第一,则接收排在最后的子群;

f)用这size个体去替换最差的size个个体;

g)结束。

2.3各子种群的初始化与搜索策略

对于子种群的初始化,比较常用的是随机产生个体的方法。

随机初始化法能够快速地产生初始种群,并且随机的特性能够保证种群的多样性,因此本设计采用随机初始化法初始各个子种群,即随机产生N条染色体作为初始的种群(N为群体规模)。

对于N的确定,应当适当。

如果N过大,固然可以增强种群的多样性,最终进化得到的解也可能更优化,然而这也增加了计算的复杂度,拖慢算法的效率;如果N过小,则不利于种群的多样性。

一般N选择为10~50[4],本设计选取N的大小为30。

在多种群并行遗传算法中,多个子种群代替传统遗传算法的单一种群,各个子种群之间相互独立进化,并且每隔若干代进行一次子种群之间的遗传信息的交流。

各个子种群不必具有相同的搜索策略,我们可以设置不同子种群具有不同的交叉和变异概率,使得不同的子种群能够以不同的搜索策略进化,达到不同的搜索目的。

当交叉概率以及变异概率比较大时,种群在进化过程中不断地大量产生全新的染色体,种群的稳定性会糟到一定程度的破坏,然而多样性会大大增加;交叉概率以及变异概率比较小时,种群在进化过程具有较好的稳定性,然而这样也降低了种群的多样性。

基于这种思想,在本设计中,子种群的数量一般选择在3个以上。

第一个子种群的交叉概率以及变异概率都比较大,使得该子种群具有较强的多样性,能够在全局范围内进行搜索,并且在遗传进化过程中不断提供大量全新的染色体,在进化过程中出现的超级个体的作用也不会太明显,这样就克服了过早收敛,我们称之为探测子种群[4];第二个子种群的交叉概率以及变异概率都比较小,使得该子种群具有较强的稳定性,能够在局部范围内稳步进化,在局部范围内寻求最优解,我们称之为开发子种群[4];第三个子种群的交叉概率以及变异概率处于以上两者的中间,兼具两者的特点,既保持了一定的多样性,也具有较好的稳定性,我们称之为探测开发子种群[4]。

第三章算法的实现

本实验的代码是基于 WindowsXP运行平台,采用eclipse集成开发环境,用java语言编写而成的.

主要代码包括在一个类里面.:

GATSP

代码:

类变量及说明

privateintpopSize;//种群规模(偶数)

privatedoublecrossPro;//交配概率(0-1)

privatedoublemutationPro;//变异概率(0-1)

privateintgenerationMaxNum;//最大迭代次数

privateintdistanceMatrix[][];/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1