用遗传算法求解TSP问题
遗传算法(Genetic Algorithm——GA),是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,它是由美国Michigan大学的J.Holland教授于1975年首先提出的。J.Holland教授和它的研究小组围绕遗传算法进行研究的宗旨有两个:抽取和解释自然系统的自适应过程以及设计具有自然系统机理的人工系统。遗传算法的大致过程是这样的:将每个可能的解看作是群体中的一个个体或染色体,并将每个个体编码成字符串的形式,根据预定的目标函数对每个个体进行评价,即给出一个适应度值。开始时,总是随机的产生一些个体,根据这些个体的适应度,利用遗传算子——选择(Selection)、交叉(Crossover)、变异(Mutation)对它们重新组合,得到一群新的个体。这一群新的个体由于继承了上一代的一些优良特性,明显优于上一代,以逐步向着更优解的方向进化。遗传算法主要的特点在于:简单、通用、鲁棒性强。经过二十多年的发展,遗传算法已经在旅行商问题、生产调度、函数优化、机器学习等领域得到成功的应用。
遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,主要有以下特点:
1、 遗传算法以决策变量的编码作为运算对象。传统的优化算法往往直接决策变量的实际植本身,而遗传算法处理决策变量的某种编码形式,使得我们可以借鉴生物学中的染色体和基因的概念,可以模仿自然界生物的遗传和进化机理,也使得我们能够方便的应用遗传操作算子。
2、 遗传算法直接以适应度作为搜索信息,无需导数等其它辅助信息。 3、 遗传算法使用多个点的搜索信息,具有隐含并行性。 4、 遗传算法使用概率搜索技术,而非确定性规则。
遗传算法是基于生物学的,理解或编程都不太难。下面是遗传算法的一般算法步骤:
1、创建一个随机的初始状态
初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群
被称为第一代,这和符号人工智能系统的情况不一样;在那里,问题的初始状态已经给定了。
2、评估适应度
对每一个解(染色体)指定一个适应度的值,根据问题求解的实际接近程度来指定(以便逼近求解问题的答案)。不要把这些“解”与问题的“答案”混为一谈,可以把它理解成为要得到答案,系统可能需要利用的那些特性。
3、繁殖(包括子代突变)
带有较高适应度值的那些染色体更可能产生后代(后代产生后也将发生突变)。后代是父母的产物,他们由来自父母的基因结合而成,这个过程被称为“杂交”。
4、下一代
如果新的一代包含一个解,能产生一个充分接近或等于期望答案的输出,那么问题就已经解决了。如果情况并非如此,新的一代将重复他们父母所进行的繁衍过程,一代一代地演化下去,直到达到期望的解为止。
5、并行计算
非常容易将遗传算法用到并行计算和群集环境中。一种方法是直接把每个节点当成一个并行的种群看待。然后有机体根据不同的繁殖方法从一个节点迁移到另一个节点。另一种方法是“农场主/劳工”体系结构,指定一个节点为“农场主”节点,负责选择有机体和分派适应度的值,另外的节点作为“劳工”节点,负责重新组合、变异和适应度函数的评估。
6、术语说明
由于遗传算法是由进化论和遗传学机理而产生的搜索算法,所以在这个算法中会用到很多生物遗传学知识,以下是我们将会涉及到的一些术语:
① 染色体(Chromosome)
染色体又可以叫做基因型个体(individuals),一定数量的个体组成了群体(population),群体中个体的数量叫做群体大小。
② 基因(Gene)
基因是串中的元素,基因用于表示个体的特征。例如有一个串S=01234,则其中的1,0,2,3这4个元素分别称为基因。它们的值称为等位基因(Alletes)。
③ 基因地点(Locus)
基因地点在算法中表示一个基因在串中的位置称为基因位置(Gene Position),有时也简称基因位。基因位置由串的左向右计算,例如在串 S=12043 中,0的基因位置是3。
④ 基因特征值(Gene Feature)
在用串表示整数时,基因的特征值与二进制数的权一致;例如在串 S=1011 中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。——不过本程序的基因无特征值;
⑤ 适应度(Fitness)
各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数. 这个函数是计算个体在群体中被使用的概率。
遗传算法中,针对三种遗传算子可进行如下的遗传操作。 一、选择算子
从群体中选择优胜的个体,淘汰劣质个体的操作叫做选择。选择算子又叫再生算子(Reproduction Operator)。选择的目的是把优化的解直接遗传到下一代或者通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的,目前常用的选择算子有:
1.适应度比例方法(Fitness proportional model)
适应度比例方法是目前遗传算法中最基本最常用的选择方法。它也叫赌轮(roulette wheele)或蒙特卡罗(Monte Carlo)选择。
设群体大小为n,其中个体的适应度值为fi,则被i选择的概率为Psi:
MPsi?fi/?fi
j?1可见Psi反映了个体i的适应度在整个群体的个体适应度总和中所占的比例。个体适应度越大,被选择的概率就越高。
2.最佳个体保存方法(Elitist model)
此方法的思想是把群体中适应度最高的个体不进行配对交叉而直接复制到下一代中。采用这种选择方法的优点是:进化过程中某一代的最优解可以不被交叉和变异操作所破坏。但是,这是这样可能隐含了一种危机——导致早熟,即局部最优个体的遗传基因会急速增加而使进化有可能限于局部解。也就是说,该方法的全局搜索能力不强,它更加适合于单峰性质的搜索空间搜索。一般将这种方法与其它一些选择操作配合起来使用,才能有良好的效果。
另外,最佳个体保存方法还可加以推广,即在每一代的进化过程中保留多个最优个体不参加交叉、变异等遗传操作,而直接将它们复制到下一代群体中。这种选择方法也称为稳态复制。
3.排序选择方法(Rank-based)
排序选择方法是指在计算每个个体的适应度后,根据适应度大小顺序对群体中个体排序,然后把事先设计好的概率表按顺序分配给个体,作为各自的选择概率。这种方法的不足之处在于选择概率和序号的关系必须事先确定。此外,它和适应度比例方法一样都是一种基于概率的选择,所以仍然有统计误差。
此外还有一些比较常用的选择方法如期望值方法(Expected value model)、联赛选择方法(Tournament selection model)等。
二、 交叉算子 1.交叉算子的设计
实现个体结构重组的交叉算子设计一般与所求解的具体问题有关,一般包括以下一些要点:
① 任何交叉算子需要满足交叉算子的评估准则,就是说交叉算子需要保证前一代中优秀个体的性状能在后一代的新个体中尽可能得到遗传和继承。 ② 交叉设计和编码设计是相互联系的。也就是说,交叉算子设计和编码设计需协调操作。这也就是所谓的编码——交叉设计。 2.基本的交叉算子
① 一点交叉(One point crossover)
一点交叉又叫做简单交叉。具体的操作是:在个体串中随机设定一个交叉点,实行交叉的时候,该点前或后的两个个体的部分结构进行互换,并生成两个新的个体。如下图所示:
图2.1一点交叉
② 二点交叉(Two point crossover)
二点交叉与一点交叉类似,只是设值2个交叉点(随机设定),如下图所示:
图2.2 二点交叉
③ 一致交叉(Uniform crossover)
一致交叉是指通过设定屏蔽字(mask)来决定新个体的基因继承两个旧个体中哪个个体的对应基因。如下图所示:
图2.3 一致交叉
④ 算术交叉(Arithmetic Crossover)
算术交叉是指由两个个体的线性组合而产生出两个新的个体。为了能够进行线性组合运算,算术交叉的操作对象一般是由浮点数编码所表示的个体。
tt假设在两个个体XA,XB之间进行算术交叉,则交叉运算后所产生出的两个