您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 用遗传算法求解TSP问题
用遗传算法求解TSP问题遗传算法(GeneticAlgorithm——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)基因地点在算法中表示一个基因在串中的位置称为基因位置(GenePosition),有时也简称基因位。基因位置由串的左向右计算,例如在串S=12043中,0的基因位置是3。④基因特征值(GeneFeature)在用串表示整数时,基因的特征值与二进制数的权一致;例如在串S=1011中,基因位置3中的1,它的基因特征值为2;基因位置1中的1,它的基因特征值为8。——不过本程序的基因无特征值;⑤适应度(Fitness)各个个体对环境的适应程度叫做适应度(fitness)。为了体现染色体的适应能力,引入了对问题中的每一个染色体都能进行度量的函数,叫适应度函数.这个函数是计算个体在群体中被使用的概率。遗传算法中,针对三种遗传算子可进行如下的遗传操作。一、选择算子从群体中选择优胜的个体,淘汰劣质个体的操作叫做选择。选择算子又叫再生算子(ReproductionOperator)。选择的目的是把优化的解直接遗传到下一代或者通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的,目前常用的选择算子有:1.适应度比例方法(Fitnessproportionalmodel)适应度比例方法是目前遗传算法中最基本最常用的选择方法。它也叫赌轮(roulettewheele)或蒙特卡罗(MonteCarlo)选择。设群体大小为n,其中个体的适应度值为if,则被i选择的概率为siP:1/MsiiijPff可见siP反映了个体i的适应度在整个群体的个体适应度总和中所占的比例。个体适应度越大,被选择的概率就越高。2.最佳个体保存方法(Elitistmodel)此方法的思想是把群体中适应度最高的个体不进行配对交叉而直接复制到下一代中。采用这种选择方法的优点是:进化过程中某一代的最优解可以不被交叉和变异操作所破坏。但是,这是这样可能隐含了一种危机——导致早熟,即局部最优个体的遗传基因会急速增加而使进化有可能限于局部解。也就是说,该方法的全局搜索能力不强,它更加适合于单峰性质的搜索空间搜索。一般将这种方法与其它一些选择操作配合起来使用,才能有良好的效果。另外,最佳个体保存方法还可加以推广,即在每一代的进化过程中保留多个最优个体不参加交叉、变异等遗传操作,而直接将它们复制到下一代群体中。这种选择方法也称为稳态复制。3.排序选择方法(Rank-based)排序选择方法是指在计算每个个体的适应度后,根据适应度大小顺序对群体中个体排序,然后把事先设计好的概率表按顺序分配给个体,作为各自的选择概率。这种方法的不足之处在于选择概率和序号的关系必须事先确定。此外,它和适应度比例方法一样都是一种基于概率的选择,所以仍然有统计误差。此外还有一些比较常用的选择方法如期望值方法(Expectedvaluemodel)、联赛选择方法(Tournamentselectionmodel)等。二、交叉算子1.交叉算子的设计实现个体结构重组的交叉算子设计一般与所求解的具体问题有关,一般包括以下一些要点:①任何交叉算子需要满足交叉算子的评估准则,就是说交叉算子需要保证前一代中优秀个体的性状能在后一代的新个体中尽可能得到遗传和继承。②交叉设计和编码设计是相互联系的。也就是说,交叉算子设计和编码设计需协调操作。这也就是所谓的编码——交叉设计。2.基本的交叉算子①一点交叉(Onepointcrossover)一点交叉又叫做简单交叉。具体的操作是:在个体串中随机设定一个交叉点,实行交叉的时候,该点前或后的两个个体的部分结构进行互换,并生成两个新的个体。如下图所示:图2.1一点交叉②二点交叉(Twopointcrossover)二点交叉与一点交叉类似,只是设值2个交叉点(随机设定),如下图所示:图2.2二点交叉③一致交叉(Uniformcrossover)一致交叉是指通过设定屏蔽字(mask)来决定新个体的基因继承两个旧个体中哪个个体的对应基因。如下图所示:图2.3一致交叉④算术交叉(ArithmeticCrossover)算术交叉是指由两个个体的线性组合而产生出两个新的个体。为了能够进行线性组合运算,算术交叉的操作对象一般是由浮点数编码所表示的个体。假设在两个个体tAX,tBX之间进行算术交叉,则交叉运算后所产生出的两个11(1)(1)tttABAtttBABXXXXXX新个体是:其中,α是一参数,它可以是一个常数,此时所进行的交叉运算称为均匀算术交叉;它可以是一个由进化代数所决定的变量,此时所进行的交叉运算称为非均匀算术交叉。3.交叉算子与遗传算法的收敛型遗传算法的收敛性不仅取决于编码,初始化群体,适应度函数,选择算子的设计,而且还取决于交叉算子和下面要提到的变异算子。但是,遗传算法的收敛性主要决定于作为其核心操作的交叉算子。交叉算子收敛性是遗传算法研究中最重要的课题之一。需要指出的是,交叉算子并未提供收敛性保证。三、变异算子变异操作的基本内容是对群体中的个体串的某些基因座上的基因值作变动。例如,基于字符集{0,1}的二值码串,变异操作就是把1变成0或者把0变成1。变异操作的步骤为:在群体中所有个体的码串范围内随机的确定基因座,然后以事先设定的变异概率对这些基因座的基因值进行变异。如下图所示:图2.4简单位变异遗传算法引入变异的目的有两个:一个是使遗传算法具有局部的随机搜索能力。当遗传算法通过交叉算子已接近最优解临近值时,利用变异算子的这种局部随机搜索能力可以加速向最优解收敛。这种情况下变异概率应取较小值,否则已经接近最优解的值会因为变异而遭到破坏。二是使遗传算法可以维持群体多样性,以防止出现早熟现象。遗传算法中,交叉算子因为其全局搜索能力作为主要算子,变异算子因其局部搜索能力作为辅助算子。遗传算法通过交叉和变异这一对相互配合又相互竞争的操作而使其具备兼顾全局和局部的均衡搜索能力。遗传算法在组合优化中有着许多重要而且成功的应用实例,这里只涉及到了最典型的旅行商问题(TSP问题)。旅行商问题,即TSP问题(TravelingSalesmanProblem)是数学领域中的著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。。即寻找一条最短的遍历n个城市的路径,或者说搜索整数子集X={1,2,…,n}的一个排列,使得111(,)(,)ndiiiniTdvvdvv取最小值。其中1(,)iidvv表示城市i到1iv的距离。TSP问题是一个组合优化问题。该问题可以被证明具有NPC计算复杂性。因此,任何能使该问题的求解得以简化的方法,都将受到高度的评价和关注。遗传算法求解可以得到问题的最优解,且算法简单,对于一些非线性、多模型、多目标的函数优化问题,用其它优化方法较难求解,而遗传算法可以方便的得到较好的结果。我将用遗传算法来求解一个简单的TSP问题,其中基因是n个城市的排列顺序,适应度应该是城市之间的距离总和,将距离作为权值。算法求解的问题就是对总距离最小的访问城市的路径排序。得到最短访问路径适应函数的最优排序。本例中,首先以十进制方式对遍历29个城市的次序排列进行编码,例如码串12345678表示从城市1开始,依次经过城市2,3,4,5,6,7,8,最后返回城市1的遍历路径,这是一种针对TSP问题的最自然的编码方式。其边权值如下所示:/*01072411901248031676152157283133113297228129348276188150653411846722116910845167107014813788127336183134952541801012341751762651991826742278271146251105191139792411480374171259509317217232491312280391412349422356355204182435417292424116337273771901373740202234222192248421172877910738121152866870137151239135137242165228205124881712020613922024616031911216332224023231428
本文标题:用遗传算法求解TSP问题
链接地址:https://www.777doc.com/doc-2869135 .html