轻松理解遗传算法教材
- 格式:docx
- 大小:572.18 KB
- 文档页数:31
遗传算法的书
《遗传算法:原理、技术与应用》(Genetic Algorithms: Principles, Techniques, and Applications):这本书由David E. Goldberg编写,详细介绍了遗传算法的基本原理、技术和应用。
它涵盖了遗传算法的各个方面,包括基本概念、算法设计、优化技术、应用案例等,是遗传算法领域的经典之作。
《遗传算法:理论、实践与应用》(Genetic Algorithms: Theory, Practice, and Applications):同样由David E. Goldberg编写,这本书深入探讨了遗传算法的理论基础和实践应用。
它详细阐述了遗传算法的数学原理、算法实现、性能分析等方面,同时提供了多个实际应用的案例,对于理解和应用遗传算法具有很好的指导意义。
《遗传算法:概念与应用》(Genetic Algorithms: Concepts and Applications):还是由David E. Goldberg所著,这本书以简洁明了的方式介绍了遗传算法的基本概念和应用。
它涵盖了遗传算法的基本思想、算法流程、优化策略等,同时提供了多个应用领域的案例,有助于读者快速掌握遗传算法的核心内容。
此外,还有《自适应遗传算法理论及应用》、《高级交互式遗传算法理论与应用》等书籍,分别从不同的角度对遗传算法进行了深入的探讨和研究。
这些书籍对于理解遗传算法的原理、掌握其应用技巧具有很好的帮助作用。
总之,遗传算法是一个广泛应用的优化技术,相关的书籍也非常丰富。
读者可以根据自己的需求和兴趣选择合适的书籍进行学习。
遗传算法一、解析遗传算法(Genetic Algorithm)是一种启发式搜索算法,它收到生物进化过程的启发,通过模拟自然选择和遗传机制来寻找最优解,遗传算法将问题表示为一个染色体(个体)集合,并通过交叉和变异操作在种群中形成新的染色体。
通过一代代选择和遗传,最终找到具有高适应的解。
遗传算法是是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法首先依据某种方式(通常是随机)生成一组候选解,之后,候选解中的个体通过交叉和变异产生新的解群,再在这个解群中选取较优的个体产生新一代的候选解,重复此过程,直到满足某种收敛指标为止。
二、关键词学习遗传算法必须要了解的关键词:种群、个体、基因、交叉、变异、选择;2.1种群就是组候选解的集合,遗传算法正是通过种群的迭代进化,实现了最优解或者近似最优解.2.2个体一个个体对应一个解,也就是构成种群的基本单元。
在遗传算法中,需要把一个解构造成染色体(chromosome)的形式,如同在扇贝例子中,通过染色体来表示扇贝花纹图案,这个过程也被称为编码,而当算法结束时,需要把最优的染色体还原成最优解,这个过程称为解码。
2.3基因染色体是由基因组成的,所以把组成遗传算法染色体(个体)的基本部分称为基因,基因的选择可以多种多样,比如在扇贝例子中,我们用像素作为基因,但实际上扇贝例子的原文是用不同的三角形块作为基因,通过不同三角形块的叠加形成firefox图案。
在实际中遗传算法广泛用到的一种基因是0、1、比特。
0、1、比特基因形成的染色体是一个二进制串。
2.4交叉交叉是将两个父代个体的部分基因进行交换,从而形成两个新的个体。
最简单的交叉如同扇贝例子,在染色体上寻找一个点,然后进行相互交叉,这种交叉称为单点交叉;交叉类型分为:单点交叉(one-point crossover)多点交叉(大于等于2的点进行交叉)(multi-point crossover)均匀交叉(uniform crossover)洗牌交叉(shuffle crossover)2.5变异按照一定的概率将个体中的基因值用其它的基因值来替换,从而形成一个新的个体,如同自然界中生物的变异概率较小,在遗传算法中基因的变异概率也应该设置为较小。
遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。
它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
遗传算法是一种全局寻优的优化算法。
遗传算法是一种近似算法
全剧最优
遗传算法的基本思想
开始——生成以二维码或格雷码编码形式的随机数。
创建一个随机的初始状态
初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群被称为第一代。
适应值——目标函数最优max or min
评估适应度
对每一个解(染色体)指定一个适应度的值,根据问题求解的实际接近程度来指定(以便逼近求解问题的答案)。
不要把这些“解”与问题的“答案”混为一谈,可以把它理解成为要得到答案,系统可能需要利用的那些特性
从生物上说:生存法则~=目标函数(max、min)
适应值小的将会以很小的概率留存
选择——根据每个个体适应值的大小来选择,适应值高的个体传到下一代的概率大,不断缩小最优个体的范围。
交叉——在选择出来的个体中,模拟生物的同源染色体交配重组过程,个体随机配对,交换部分基因。
带有较高适应度值的那些染色体更可能产生后代(后代产生后也将发。
遗传算法的手工模拟计算示例为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各个主要执行步骤。
例:求下述二元函数的最大值:(1) 个体编码遗传算法的运算对象是表示个体的符号串,所以必须把变量x1, x2 编码为一种符号串。
本题中,用无符号二进制整数来表示。
因x1, x2 为0 ~ 7之间的整数,所以分别用3位无符号二进制整数来表示,将它们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。
例如,基因型X=101110 所对应的表现型是:x=[ 5,6 ]。
个体的表现型x和基因型X之间可通过编码和解码程序相互转换。
(2) 初始群体的产生遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据。
本例中,群体规模的大小取为4,即群体由4个个体组成,每个个体可通过随机方法产生。
如:011101,101011,011100,111001(3) 适应度汁算遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。
本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,故可直接利用目标函数值作为个体的适应度。
(4) 选择运算选择运算(或称为复制运算)把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。
一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。
本例中,我们采用与适应度成正比的概率来确定各个个体复制到下一代群体中的数量。
其具体操作过程是:•先计算出群体中所有个体的适应度的总和∑fi ( i=1.2,…,M );•其次计算出每个个体的相对适应度的大小fi / ∑fi ,它即为每个个体被遗传到下一代群体中的概率,•每个概率值组成一个区域,全部概率值之和为1;•最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区域内来确定各个个体被选中的次数。
(5) 交叉运算交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某两个个体之间的部分染色体。
本例采用单点交叉的方法,其具体操作过程是:• 先对群体进行随机配对;• 其次随机设置交叉点位置;• 最后再相互交换配对染色体之间的部分基因。
(6) 变异运算变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进行改变,它也是产生新个体的一种操作方法。
本例中,我们采用基本位变异的方法来进行变异运算,其具体操作过程是:• 首先确定出各个个体的基因变异位置,下表所示为随机产生的变异点位置,其中的数字表示变异点设置在该基因座处;• 然后依照某一概率将变异点的原有基因值取反。
对群体P(t)进行一轮选择、交叉、变异运算之后可得到新一代的群体p(t+1)。
从上表中可以看出,群体经过一代进化之后,其适应度的最大值、平均值都得到了明显的改进。
事实上,这里已经找到了最佳个体“111111”。
[注意]需要说明的是,表中有些栏的数据是随机产生的。
这里为了更好地说明问题,我们特意选择了一些较好的数值以便能够得到较好的结果,而在实际运算过程中有可能需要一定的循环次数才能达到这个最优结果。
遗传算法的有趣应用很多,诸如寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题(这是一个国外网友的建议:在一个不规则的多边形中,寻找一个包含在该多边形内的最大圆圈的圆心。
),TSP问题(在以后的章节里面将做详细介绍。
),生产调度问题,人工生命模拟等。
直到最后看到一个非常有趣的比喻,觉得由此引出的袋鼠跳问题(暂且这么叫它吧),既有趣直观又直达遗传算法的本质,确实非常适合作为初学者入门的例子。
问题的提出与解决方案让我们先来考虑考虑下面这个问题的解决办法。
已知一元函数:现在要求在既定的区间内找出函数的最大值极大值、最大值、局部最优解、全局最优解在解决上面提出的问题之前我们有必要先澄清几个以后将常常会碰到的概念:极大值、最大值、局部最优解、全局最优解。
学过高中数学的人都知道极大值在一个小邻域里面左边的函数值递增,右边的函数值递减,在图2.1里面的表现就是一个“山峰”。
当然,在图上有很多个“山峰”,所以这个函数有很多个极大值。
而对于一个函数来说,最大值就是在所有极大值当中,最大的那个。
所以极大值具有局部性,而最大值则具有全局性。
因为遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。
所以从一个基因组到其解的适应度形成一个映射。
所以也可以把遗传算法的过程看作是一个在多元函数里面求最优解的过程。
在这个多维曲面里面也有数不清的“山峰”,而这些最优解所对应的就是局部最优解。
而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解。
而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰。
(另外,值得注意的是遗传算法不一定要找“最高的山峰”,如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值,对应的,遗传算法所要找的就是“最深的谷底”)如果至今你还不太理解的话,那么你先往下看。
本章的示例程序将会非常形象的表现出这个情景。
“袋鼠跳”问题既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉。
那么我们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去,直到跳到最高的山峰(尽管袋鼠本身不见得愿意那么做)。
所以求最大值的过程就转化成一个“袋鼠跳”的过程。
下面介绍介绍“袋鼠跳”的几种方式。
爬山法、模拟退火和遗传算法解决寻找最大值问题的几种常见的算法:1. 爬山法(最速上升爬山法):从搜索空间中随机产生邻近的点,从中选择对应解最优的个体,替换原来的个体,不断重复上述过程。
因为只对“邻近”的点作比较,所以目光比较“短浅”,常常只能收敛到离开初始位置比较近的局部最优解上面。
对于存在很多局部最优点的问题,通过一个简单的迭代找出全局最优解的机会非常渺茫。
(在爬山法中,袋鼠最有希望到达最靠近它出发点的山顶,但不能保证该山顶是珠穆朗玛峰,或者是一个非常高的山峰。
因为一路上它只顾上坡,没有下坡。
)2. 模拟退火:这个方法来自金属热加工过程的启发。
在金属热加工过程中,当金属的温度超过它的熔点(Melting Point)时,原子就会激烈地随机运动。
与所有的其它的物理系统相类似,原子的这种运动趋向于寻找其能量的极小状态。
在这个能量的变迁过程中,开始时。
温度非常高,使得原子具有很高的能量。
随着温度不断降低,金属逐渐冷却,金属中的原子的能量就越来越小,最后达到所有可能的最低点。
利用模拟退火的时候,让算法从较大的跳跃开始,使到它有足够的“能量”逃离可能“路过”的局部最优解而不至于限制在其中,当它停在全局最优解附近的时候,逐渐的减小跳跃量,以便使其“落脚”到全局最优解上。
(在模拟退火中,袋鼠喝醉了,而且随机地大跳跃了很长时间。
运气好的话,它从一个山峰跳过山谷,到了另外一个更高的山峰上。
但最后,它渐渐清醒了并朝着它所在的峰顶跳去。
)3. 遗传算法:模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。
以面为单位的搜索,比以点为单位的搜索,更能发现全局最优解。
(在遗传算法中,有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。
这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。
但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠,并希望存活下来的袋鼠是多产的,在它们所处的地方生儿育女。
)(后来,一个叫天行健的网游给我想了一个更恰切的故事:从前,有一大群袋鼠,它们被莫名其妙的零散地遗弃于喜马拉雅山脉。
于是只好在那里艰苦的生活。
海拔低的地方弥漫着一种无色无味的毒气,海拔越高毒气越稀薄。
可是可怜的袋鼠们对此全然不觉,还是习惯于活蹦乱跳。
于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。
就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。
)下面主要介绍介绍遗传算法实现的过程。
遗传算法的实现过程遗传算法的实现过程实际上就像自然界的进化过程那样。
首先寻找一种对问题潜在解进行“数字化”编码的方案。
(建立表现型和基因型的映射关系。
)然后用随机数初始化一个种群(那么第一批袋鼠就被随意地分散在山脉上。
),种群里面的个体就是这些数字化的编码。
接下来,通过适当的解码过程之后,(得到袋鼠的位置坐标。
)用适应性函数对每一个基因个体作一次适应度评估。
(袋鼠爬得越高,越是受我们的喜爱,所以适应度相应越高。
)用选择函数按照某种规定择优选择。
(我们要每隔一段时间,在山上射杀一些所在海拔较低的袋鼠,以保证袋鼠总体数目持平。
)让个体基因交叉变异。
(让袋鼠随机地跳一跳)然后产生子代。
(希望存活下来的袋鼠是多产的,并在那里生儿育女。
)遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解。
(你不必去指导袋鼠向那边跳,跳多远。
)而只要简单的“否定”一些表现不好的个体就行了。
(把那些总是爱走下坡路的袋鼠射杀。
)以后你会慢慢理解这句话,这是遗传算法的精粹!所以我们总结出遗传算法的一般步骤:开始循环直至找到满意的解。
1.评估每条染色体所对应个体的适应度。
2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。
3.抽取父母双方的染色体,进行交叉,产生子代。
4.对子代的染色体进行变异。
5.重复2,3,4步骤,直到新种群的产生。
结束循环。
接下来,我们将详细地剖析遗传算法过程的每一个细节。
编制袋鼠的染色体----基因的编码方式通过前一章的学习,读者已经了解到人类染色体的编码符号集,由4种碱基的两种配合组成。
共有4种情况,相当于2 bit的信息量。
这是人类基因的编码方式,那么我们使用遗传算法的时候编码又该如何处理呢?受到人类染色体结构的启发,我们可以设想一下,假设目前只有“0”,“1”两种碱基,我们也用一条链条把他们有序的串连在一起,因为每一个单位都能表现出1 bit的信息量,所以一条足够长的染色体就能为我们勾勒出一个个体的所有特征。
这就是二进制编码法,染色体大致如下:010010011011011110111110上面的编码方式虽然简单直观,但明显地,当个体特征比较复杂的时候,需要大量的编码才能精确地描述,相应的解码过程(类似于生物学中的DNA翻译过程,就是把基因型映射到表现型的过程。
)将过份繁复,为改善遗传算法的计算复杂性、提高运算效率,提出了浮点数编码。
染色体大致如下:1.2 – 3.3 –2.0 –5.4 – 2.7 – 4.3那么我们如何利用这两种编码方式来为袋鼠的染色体编码呢?因为编码的目的是建立表现型到基因型的映射关系,而表现型一般就被理解为个体的特征。