资源预览内容
第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
第9页 / 共32页
第10页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
遗传算法入门到掌握遗传算法入门到掌握 读完这个讲义,你将基本掌握遗传算法,要有耐心看完。 想了很久,应该用一个怎么样的例子带领大家走进遗传 算法的神奇世界呢?遗 传算法的有趣应用很多,诸如寻路问题,8 数码问题,囚犯困境,动作控制,找 圆心问题(这是一个国外网友的建议:在一个不规则的多边形 中,寻找一个包 含在该多边形内的最大圆圈的圆心。),TSP 问题(在以后的章节里面将做详细 介绍。),生产调度问题,人工生命模拟等。直到最后看到一个非 常有趣的比 喻,觉得由此引出的袋鼠跳问题(暂且这么叫它吧),既有趣直观又直达遗传算 法的本质,确实非常适合作为初学者入门的例子。这一章将告诉读者,我 们怎 么让袋鼠跳到珠穆朗玛峰上去(如果它没有过早被冻坏的话)。 问题的提出与解决方案问题的提出与解决方案 让我们先来考虑考虑下面这个问题的解决办法。 已知一元函数: 图 2-1 现在要求在既定的区间内找出函数的最大值。函数图像如图 2-1 所示。 极大值、最大值、局部最优解、全局最优解极大值、最大值、局部最优解、全局最优解 在解决上面提出的问题之前我们有必要先澄清几个以后将常常会碰到的概念: 极 大值、最大值、局部最优解、全局最优解。学过高中数学的人都知道极大值在一 个小邻域里面左边的函数值递增,右边的函数值递减,在图 2.1 里面的表现就是 一 个“山峰”。当然,在图上有很多个“山峰”,所以这个函数有很多个极大 值。而对于一个函数来说,最大值就是在所有极大值当中,最大的那个。所以极 大值具有 局部性,而最大值则具有全局性。 因为遗传算法中每一条染色体,对应着遗传算法的一个 解决方案,一般我们用 适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因 组到其解的适应度形成一个映射。 所以也可以把遗传算法的过程看作是一个在多 元函数里面求最优 解的过程。在这个多维曲面里面也有数不清的“山峰”,而 这些最优解所对应的就是局部最优解。 而其中也会有一个 “山峰” 的海拔最高的, 那么这个就是全局最优 解。而遗传算法的任务就是尽量爬到最高峰,而不是陷 落在一些小山峰。(另外,值得注意的是遗传算法不一定要找“最高的山峰”, 如果问题的适应度评价越小越 好的话,那么全局最优解就是函数的最小值,对 应的,遗传算法所要找的就是“最深的谷底”)如果至今你还不太理解的话,那 么你先往下看。本章的示例程序将会 非常形象的表现出这个情景。 “袋鼠跳”问题“袋鼠跳”问题 既然我们把 函数曲线理解成一个一个山峰和山谷组成的山脉。 那么我们 可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳 去,直到跳到最高的山峰 (尽管袋鼠本身不见得愿意那么做)。所以求最大值 的过程就转化成一个“袋鼠跳”的过程。下面介绍介绍“袋鼠跳”的几种方式。 爬山法、模拟退火和遗传算法爬山法、模拟退火和遗传算法 解决寻找最大值问题的几种常见的算法: 1. 爬山法(最速上升爬山法): 从搜索空间中随机产生邻近的点, 从中选择对应解最优的个体, 替换原来的个体, 不断 重复上述过程。因为只对“邻近”的点作比较,所以目光比较“短浅”, 常常只能收敛到离开初始位置比较近的局部最优解上面。 对于存在很多局部最优 点的问题, 通过一个简单的迭代找出全局最优解的机会非常渺茫。(在爬山法 中, 袋鼠最有希望到达最靠近它出发点的山顶, 但不能保证该山顶是珠穆朗玛峰, 或者是一个非常 高的山峰。因为一路上它只顾上坡,没有下坡。) 2. 模拟退火: 这个方法来自金属热加工过程的启发。在金属热加工过程中,当金属的温度超过 它的熔点(Melting Point) 时,原子就会激烈地随机运动。与所有的其它的物 理系统相类似,原子的这种运动趋向于寻找其能量的极小状态。在这个能量的变迁过程中,开始时。温度非常高, 使得原子具有很高的能量。随着温度不断降 低,金属逐渐冷却,金属中的原子的能量就越来越小,最后达到所有可能的最低 点。利用模拟退火的时候,让算法从较大 的跳跃开始,使到它有足够的“能量” 逃离可能“路过”的局部最优解而不至于限制在其中,当它停在全局最优解附近 的时候,逐渐的减小跳跃量,以便使其“落脚 ”到全局最优解上。(在模拟退 火中,袋鼠喝醉了,而且随机地大跳跃了很长时间。运气好的话,它从一个山峰 跳过山谷,到了另外一个更高的山峰上。但最后,它 渐渐清醒了并朝着它所在 的峰顶跳去。) 3. 遗传算法: 模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜 索,并支持这些方向上的信息构成和交换。以面为单位的搜索,比以点为单位的 搜索,更能发现全局最优解。(在遗传算法中,有很多袋鼠,它们降落到喜玛拉 雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几 年, 就在一些海拔高度较低的地方射杀一些袋鼠,并希望存活下来的袋鼠是多产 的,在它们所处的地方生儿育女。) (后来,一个叫天行健的网游给我想了一 个更恰切的故事:从前,有一大群袋鼠,它们被莫名其妙的零散地遗弃于喜马拉 雅山脉。于是只好在那里艰苦的生活。海拔 低的地方弥漫着一种无色无味的毒 气,海拔越高毒气越稀薄。可是可怜的袋鼠们对此全然不觉,还是习惯于活蹦乱 跳。于是,不断有袋鼠死于海拔较低的地方,而越 是在海拔高的袋鼠越是能活 得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地 聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚 拢到珠穆朗玛峰的袋 鼠被带回了美丽的澳洲。 ) 下面主要介绍介绍遗传算法实现的过程。 遗传算法的实现过程遗传算法的实现过程 遗传算法的实现过程实际上就像自然界的进化过程那样。 首先寻找一种对问 题潜在解进行“数字化”编码的方案。(建立表现型和基因型的映射关系。)然 后用随机 数初始化一个种群(那么第一批袋鼠就被随意地分散在山脉上。), 种群里面的个体就是这些数字化的编码。 接下来, 通过适当的解码过程之后, (得 到袋鼠的位置 坐标。 ) 用适应性函数对每一个基因个体作一次适应度评估。 (袋 鼠爬得越高,越是受我们的喜爱,所以适应度相应越高。)用选择函数按照某种 规定择优选 择。 (我们要每隔一段时间,在山上射杀一些所在海拔较低的袋鼠, 以保证袋鼠总体数目持平。)让个体基因交叉变异。(让袋鼠随机地跳一跳)然 后产生子 代。(希望存活下来的袋鼠是多产的,并在那里生儿育女。)遗传算 法并不保证你能获得问题的最优解, 但是使用遗传算法的最大优点在于你不必去 了解和操心如何 去“找”最优解。(你不必去指导袋鼠向那边跳,跳多远。) 而只要简单的“否定”一些表现不好的个体就行了。(把那些总是爱走下坡路的 袋鼠射杀。)以后你会 慢慢理解这句话,这是遗传算法的精粹! 题外话:题外话: 这里想提一提一个非主流的进化论观点:拉马克主义的进化论。 法 国学者拉马克(Jean-Baptiste de Lamarck,17441891)的进化论观点表述 在他的动物学哲学(1809)一书中。该书提出生物自身存在一种是结构更加 复杂化的“内驱力 ”,这种内驱力是与生俱来的,在动物中表现为“动物体新 器官的产生来自它不断感觉到的新需要。”不过具体的生物能否变化,向什么方 向变化,则要受环境的影 响。拉马克称其环境机制为“获得性遗传”,这一机 制分为两个阶段:一是动物器官的用与不用(即“用进废退”:在环境的作用下, 某一器官越用越发达,不使用 就会退化,甚至消失。);二是在环境作用下, 动物用与不用导致的后天变异通过繁殖传给后代(即“获得性遗传”)。 德 国动物学家魏斯曼(August Weismann,18341914)对获得性遗传提出坚决 的质疑。他用老鼠做了一个著名的“去尾实验”,他切去老鼠的尾巴,并使之适 应了短尾的生活。 用这样的老鼠进行繁殖,下一代老鼠再切去尾巴,一连切了 22 代老鼠的尾巴,第 23 代老鼠仍然长出正常的尾巴。由此魏斯曼认为后天后天 获得性不能遗传。(择 自怀疑-科学探索的起点) 我 举出这个例子,一方面希望初学者能够更加了解正统的进化论思想,能够分 辨进化论与伪进化论的区别。另一方面想让读者知道的是,遗传算法虽然是一种 仿生的算 法,但我们不需要局限于仿生本身。大自然是非常智慧的,但不代表 某些细节上人不能比她更智慧。另外,具体地说,大自然要解决的问题,毕竟不 是我们要解决的 问题,所以解决方法上的偏差是非常正常和在所难免的。(下 一章,读者就会看到一些非仿生而有效的算法改进。)譬如上面这个“获得性遗 传”我们先不管它在自 然界存不存在,但是对于遗传算法的本身,有非常大的 利用价值。即变异不一定发生在产生子代的过程中,而且变异方向不一定是随机 性的。变异可以发生在适应性 评估的过程当中,而且可以是有方向性的。(当 然,进一步的研究有待进行。) 所以我们总结出遗传算法的一般步骤: 开始循环直至找到满意的解。 1.评估每条染色体所对应个体的适应度。 2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母 方。 3.抽取父母双方的染色体,进行交叉,产生子代。 4.对子代的染色体进行变异。 5.重复 2,3,4 步骤,直到新种群的产生。 结束循环。 接下来,我们将详细地剖析遗传算法过程的每一个细节。 编制袋鼠的染色体-基因的编码方式编制袋鼠的染色体-基因的编码方式 通过前一章的学习,读者已经了解到人类染色体的编码符号集,由 4 种碱基 的两种配合组成。共有 4 种情况,相当于 2 bit 的信息量。这是人类基因的编码 方式,那么我们使用遗传算法的时候编码又该如何处理呢? 受到人类染色体结构的启发,我们可以设想一下,假设目前只有“0”,“1” 两种碱基,我们也用一条链条把他们有序的串连在一起,因为每一个单位都能表 现出 1 bit 的信息量,所以一条足够长的染色体就能为我们勾勒出一个个体的 所有特征。这就是二进制编码法,染色体大致如下: 010010011011011110111110010010011011011110111110 上面的编码方式虽然简单直观,但明显地,当个体特征比较复杂的时候,需 要大量的编码才能精确地描述,相应的解码过程(类似于生物学中的 DNA 翻译过 程,就是把基因型映射到表现型的过程。)将过份繁复,为改善遗传算法的计算 复杂性、提高运算效率,提出了浮点数编码。染色体大致如下: 1.2 3.3 2.0 5.4 2.7 4.31.2 3.3 2.0 5.4 2.7 4.3 那么我们如何利用这两种编码方式来为袋鼠的染色体编码呢?因为编码的目 的是建立表现型到基因型的映射关系,而表现型一般就被理解为个体的特征。比 如人的基因型是 46 条染色体所描述的(总长度 两 米的纸条?),却能解码成 一个个眼,耳,口,鼻等特征各不相同的活生生的人。所以我们要想为“袋鼠” 的染色体编码,我们必须先来考虑“袋鼠”的“个体特 征”是什么。也许有的 人会说,袋鼠的特征很多,比如性别,身长,体重,也许它喜欢吃什么也能算作 其中一个特征。但具体在解决这个问题的情况下,我们应该进 一步思考:无论 这只袋鼠是长短,肥瘦,只要它在低海拔就会被射杀,同时也没有规定身长的袋 鼠能跳得远一些,身短的袋鼠跳得近一些。当然它爱吃什么就更不相 关了。我 们由始至终都只关心一件事情:袋鼠在哪里。因为只要我们知道袋鼠在那里,我 们就能做两件必须去做的事情: (1)通过查阅喜玛拉雅山脉的地图来得知袋鼠所在的海拔高度(通过自变量求 函数值。)以判断我们有没必要把它射杀。 (2)知道袋鼠跳一跳后去到哪个新位置。 如 果我们一时无法准确的判断哪些“个体特征”是必要的,哪些是非必要的, 我们常常可以用到这样一种思维方式:比如你认为袋鼠的爱吃什么东西非常必 要,那么你 就想一想,有两只袋鼠,它们其它的个体特征完全同等的情况下, 一只爱吃草,另外一只爱吃果。你会马上发现,这不会对它
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号