(一)遗传算法的特点
- 自组织、自适应和自学习性。在编码方案、适应度函数及遗传算子确定后,算法将利用进化过程中获得的信息自行组织搜索。
- 本质并行性。内在并行性与内含并行性。
- 不需求导。只需目标函数和适应度函数。
- 概率转换规则。强调概率转换规则,而不是确定的转换规则。
诸如寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题(在一个不规则的多边形中,寻找一个包含在该多边形内的最大圆圈的圆心),TSP问题,生产调度问题,人工生命模拟等。
问题的提出与解决方案
先考虑下面这个问题的解决办法。
已知一元函数:
极大值、最大值、局部最优解、全局最优解
在解决上面提出的问题之前有必要先澄清几个以后将常常会碰到的概念:极大值、最大值、局部最优解、全局最优解。学过高等数学的人都知道极大值在一个小邻域里面左边的函数值递增,右边的函数值递减,在上图中的表现就是一 个“山峰”。当然,在图上有很多个“山峰”,所以这个函数有很多个极大值。而对于一个函数来说,最大值就是在所有极大值当中最大的那个。所以极大值具有局部性,而最大值则具有全局性。
因为遗传算法中每一条染色体对应着一个解决方案,一般用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。所以也可以把遗传算法的过程看作是一个在多元函数里面求最优解的过程。在这个多维曲面里面也有数不清的“山峰”,而这些最优解所对应的就是局部最优解。而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解。而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰。(值得注意的是,遗传算法不一定要找“最高的山峰”,如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值,对应的遗传算法所要找的就是“最深的谷底”)
“袋鼠跳”问题
把函数曲线理解成一个个山峰和山谷组成的山脉,那么可以设想所得到的每一个解就是一只袋鼠,希望它们不断的向着更高处跳去,直到跳到最高的山峰。所以求最大值的过程就转化成一个“袋鼠跳”的过程。下面介绍介绍“袋鼠跳”的几种方式。
爬山法、模拟退火和遗传算法
解决寻找最大值问题的几种常见的算法:
1. 爬山法(最速上升爬山法):
从搜索空间中随机产生邻近的点,从中选择对应解最优的个体,替换原来的个体,不断重复上述过程。因为只对“邻近”的点作比较,所以目光比较“短浅”,常常只能收敛到离初始位置比较近的局部最优解。对于存在很多局部最优点的问题,通过一个简单的迭代找出全局最优解的机会非常渺茫。
2. 模拟退火:
这个方法来自金属热加工过程的启发。在金属热加工过程中,当金属的温度超过它的熔点(Melting Point)时,原子就会激烈地随机运动。与所有的其它物理系统相类似,原子的这种运动趋向于寻找其能量的极小状态。在这个能量的变迁过程中,开始时温度非常高,使得原子具有很高的能量。随着温度不断降低,金属逐渐冷却,金属中的原子能量就越来越小,最后达到所有可能的最低点。利用模拟退火的时候,让算法从较大的跳跃开始,使得它有足够的“能量”逃离可能“路过”的局部最优解而不至于限制在其中,当它停在全局最优解附近的时候,逐渐的减小跳跃量,以使其“落脚 ”到全局最优解上。
3. 遗传算法:
模拟物竞天择的生物进化过程,通过维护一个潜在解的群体执行了多方向的搜索,并支持这些方向上的信息构成和交换。以面为单位的搜索比以点为单位的搜索更能发现全局最优解。
(三)遗传算法实现过程
遗传算法的实现过程实际上就像自然界的进化过程那样。首先寻找一种对问题潜在解进行“数字化”编码的方案。(建立表现型和基因型的映射关系)然后用随机数初始化一个种群(第一批袋鼠就被随意地分散在山脉上),种群里面的个体就是这些数字化的编码。接下来通过适当的解码过程之后(得到袋鼠的位置坐标),用适应性函数对每一个基因个体作一次适应度评估。用选择函数按照某种规定择优选择。让个体基因交叉变异。然后产生子代。遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解,而只要简单的“否定”一些表现不好的个体就行了。
总结出遗传算法的一般步骤:
- 编码,创建初始种群
- 种群中个体适应度计算
- 评估适应度
- 根据适应度选择个体
- 被选择个体进行交叉繁殖
- 在繁殖的过程中引入变异机制
- 繁殖出新的种群,回到第二步