最近在学习遗传算法,刚刚掌握了基本遗传算法的一些东西,所以记录下来以便后续学习,也方便刚刚入门的同学学习。根据我学习的编写的程序,我将按照程序的步骤,来写这篇博客。并且借鉴前人经验,完善结构。 目录: 1、简介 2、遗传算法的组成 2.1初始种群的产生 2.2适应度函数及停止准则 2.3遗传算子的组成 2.3.1选择 2.3.2交叉 2.3.3变异 2.3.4运行参数 2.4基本的遗传算法的优点与不足 2.5遗传算法的改进 2.6遗传算法的应用 1、 简介 基本概念 遗传算法(Genetic Algorithms, GA)是一类借鉴生物界自然选择和自然遗传机制的随机化搜索最优解的算法。 它模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。 下面是一些基本的生物学概念,简单了解一下即可。 种群(Population):生物的进化以群体的形式进行,这样的一个群体称为种群。 个体:组成种群的单个生物。 基因 ( Gene ) :一个遗传因子。 染色体 ( Chromosome ) :包含一组的基因。 生存竞争,适者生存:对环境适应度高的、牛B的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少。 遗传与变异:新个体会遗传父母双方各一部分的基因,同时有一定的概率发生基因变异。 2、遗传算法的组成: (1)初始种群的产生(编码) (2)适应度函数的确定 (3)遗传算子(选择、交叉、变异) 2.1初始种群的产生(编码) 要进行后面的操作,首先要产生初始种群,也就是进化的第一代,种群大小,一般取为100~200,当然也要视问题而定。初始种群的选择很重要,会影响收敛速度和结果。本程序采用的随机产生的方式。产生了初始种群后要进行编码,也可以直接在产生种群的时候就是用编码的方式产生的。基因的编码方式有很多,这也取决于要解决的问题本身。常见的编码方式有: (1) 二进制编码,基因用0或1表示(常用于解决01背包问题) 如:基因A:00100011010 (代表一个个体的染色体) (2) 互换编码(用于解决排序问题,如旅行商问题和调度问题) 如旅行商问题中,一串基因编码用来表示遍历的城市顺序,如:234517986,表示九个城市中,先经过城市2,再经过城市3,依此类推。 (3) 树形编码(用于遗传规划中的演化编程或者表示) 如,问题:给定了很多组输入和输出。请你为这些输入输出选择一个函数,使得这个函数把每个输入尽可能近地映射为输出。 编码方法:基因就是树形结构中的一些函数。 (4) 值编码 (二进制编码不好用时,解决复杂的数值问题) 在值编码中,每个基因就是一串取值。这些取值可以是与问题有关任何值:整数,实数,字符或者其他一些更复杂的东西。 程序中使用的是二进制编码的方式,程序的应用背景是图像分割,所以数值是0-255之间,所以,二进制编码的位数是8,这里的计算就是十进制与二进制转换的方式,例如:要在[-1,2]之间产生最优解,小数点后面保留3位小数,那么就是区间长度2-(-1)=3,3/10^(-3)=3000,2的12次方是4096,2的11次方是2048,所以,二进制编码的位数应该是12. 2.2适应度函数及停止准则 遗传算法对一个个体(解)的好坏用适应度函数值来评价,适应度函数选择的越好,解的质量越高。适应度函数是遗传算法进化过程的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。 在图像分割中,根据大于阈值部分和小于阈值部分的差异性来确定的适应度函数,差异性越大的阈值,适应度越好,也就是说适应度函数值越大,越容易遗传到下一代。也就是说下面的精英选择依据就是适应度的大小。 停止准则有两个,一个是最大迭代次数,一个就是适应度变化的大小,当然你也可以自己设定其他的停止准则,在本程序中是采用的这两个停止准则。最大代数,一般取为500~100,这是为了防止出现迭代次数过多,或者不收敛的情况,所设定的最大的执行次数。当适应度值变化小于某个值时,进化停止,如果始终达不到这个条件,就达到最大迭代次数时停止进化迭代。 2.3遗传算子的组成 2.3.1选择 遗传算法使用选择运算来实现对群体中的个体进行优胜劣汰操作:适应度高的个体被遗传到下一代群体中的概率大;适应度低的个体,被遗传到下一代群体中的概率小。选择操作的任务就是按某种方法从父代群体中选取一些个体,遗传到下一代群体。 SGA(基本遗传算法)中采用轮盘赌选择方法。 轮盘赌选择又称比例选择算子,基本思想:各个个体被选中的概率与其适应度函数值大小成正比。设群体大小为n ,个体i 的适应度为 Fi,则个体i 被选中遗传到下一代群体的概率为: 在本程序的算法实现中,为了加速优化,没有采用这种方式,而是用的计算上一代各个个体的适应度并排序,如果上一代的个体的适应度比当前代的最大适应度值大,就采用一定的方式遗传到下一代,替换当前代的个体。否则就不进行选择遗传。 2.3.2交叉 所谓交叉运算,是指对两个相互配对的染色体依据交叉概率按某种方式相互交换其部分基因,从而形成两个新的个体。交叉运算在GA中起关键作用,是产生新个体的主要方法。 遗传算法中,交叉算子因其全局搜索能力而作为主要算子,变异算子因其局部搜索能力而作为辅助算子。遗传算法通过交叉和变异这对相互配合又相互竞争的操作而使其具备兼顾全局和局部的均衡搜索能力。所谓相互配合.是指当群体在进化中陷于搜索空间中某个超平面而仅靠交叉不能摆脱时,通过变异操作可有助于这种摆脱。所谓相互竞争,是指当通过交叉已形成所期望的积木块时,变异操作有可能破坏这些积木块。如何有效地配合使用交叉和变异操作,是目前遗传算法的一个重要研究内容。 由于交叉是产生新个体的主要方法,所以一般情况下交叉概率比较大,交叉概率,一般取为0.4~0.6。 交叉算子从两个双亲子串中通过复制选定位产生两个新的后代,每个后代的第i位,是从它的某个双亲的第i位复制得来的,至于双亲中的哪一个在第i位起作用,这是由另外一个被称为交叉掩码的位串决定的。 1. 单交叉点法 (用于二进制编码) 选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。在单点交叉中交叉掩码总是这样组成的,它以连续的n个1开始。 如:交叉前: 00000|01110000000010000 11100|00000111111000101 交叉后: 00000|00000111111000101 11100|01110000000010000 2. 双交叉点法 (用于二进制编码) 选择两个交叉点,子代基因在两个交叉点间部分来自一个父代基因,其余部分来自于另外一个父代基因. 如:交叉前: 01 |0010| 11 11 |0111| 01 交叉后: 11 |0010| 01 01 |0111| 11 3. 基于“ 与/或 ”交叉法 (用于二进制编码) 对父代按位"与”逻辑运算产生一子代A;按位”或”逻辑运算产生另一子代B。该交叉策略在解背包问题中效果较好 . 如:交叉前: 01001011 11011101 交叉后: 01001001 11011111 4. 单交叉点法 (用于互换编码) 选择一个交叉点,子代的从初始位置出发的部分从一个基因复制,然后在另一个基因中扫描,如果某个位点在子代中没有,就把它添加进去。 如:交叉前: 87213 | 09546 98356 | 71420 交叉后: 87213 | 95640 98356 | 72104 5. 部分匹配交叉(PMX)法(用于互换编码) 先随机产生两个交叉点,定义这两点间的区域为匹配区域,并用交换两个父代的匹配区域。 父代A:872 | 130 | 9546 父代B:983 | 567 | 1420 变为: TEMP A: 872 | 567 | 9546 TEMP B: 983 | 130 | 1420 对于 TEMP A、TEMP B中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换。匹配关系:1<——>5 3<——>6 7<——>0 子代A:802 | 567 | 9143 子代B:986 | 130 | 5427 6. 顺序交叉法(OX) (用于互换编码) 从父代A随机选一个编码子串,放到子代A的对应位置;子代A空余的位置从父代B中按B的顺序选取(与己有编码不重复)。同理可得子代B。 父代A: 872 | 139 | 0546 父代B: 983 | 567 | 1420 交叉后: 子代A: 856 | 139 | 7420 子代B: 821 | 567 | 3904 7. 循环交叉(CX)法(用于互换编码) CX同OX交叉都是从一个亲代中取一些城市,而其它城市来自另外一个亲代,但是二者不同之处在于:OX中来自第一个亲代的编码子串是随机产生的,而CX却不是,它是根据两个双亲相应位置的编码而确定的。 父代A:1 2 3 4 5 6 7 8 9 | | | | | 父代A:5 4 6 9 2 3 7 8 1 可得循环基因:1->5->2->4->9->1 用循环的基因构成子代A,顺序与父代A一样 1 2 4 5 9 用父代B剩余的基因填满子代A: 1 2 6 4 5 3 7 8 9 子代B的编码同理。(循环基因 5->1->9->4->2->5) 2.3.3变异 变异是指依据变异概率将个体编码串中的某些基因值用其它基因值来替换,从而形成一个新的个体。GA中的变异运算是产生新个体的辅助方法,它决定了GA的局部搜索能力,同时保持种群的多样性。交叉运算和变异运算的相互配合,共同完成对搜索空间的全局搜索和局部搜索。 注:变异概率Pm不能太小,这样降低全局搜索能力;也不能太大,Pm > 0.5,这时GA退化为随机搜索。变异概率,一般取为0.001~0.1 1. 基本位变异算子 (用于二进制编码) 基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。 如:变异前: 000001110000000010000 变异后: 000001110001000010000 2. 逆转变异算子(用于互换编码) 在个体中随机挑选两个逆转点,再将两个逆转点间的基因交换。 如:变异前: 1346798205 变异后: 1246798305 2.3.4 运行参数 GA运行时选择的参数应该视解决的具体问题而定,到目前为止,还没有一个适用于GA所有应用领域的关于算法参数的理论。下面是一般情况下使用GA时推荐的参数: 1) 交叉率 交叉率一般来说应该比较大,推荐使用80%-95%。 2) 变异率 变异率一般来说应该比较小,一般使用0.5%-1%最好。 3) 种群的规模 种群规模指的是群体中个体的个数。实验发现,比较大的种群的规模并不能优化遗传算法的结果。种群的大小推荐使用20-30,一些研究表明,种群规模 的大小取决于编码的方法,具体的说就是编码串(Encoded String)的大小。也就是说,如果说采用32位为基因编码的时候种群的规模大小最好为32的话,那么当采用16位为基因编码时种群的规模相应应变为原 来的两倍。 4) 遗传运算的终止进化代数 个人的想法是,设定一个计数器,如果连续N代出现的最优个体的适应度都一样时,(严格的说应该是,连续N代子代种群的最优个体适应度都<=父代最优个性的适应度)可以终止运算。 也可以简单的根据经验固定进化的代数。 II 运算流程 图中的“是否满足停止准则”便可参照上节中“遗传运算的终止进化代数” 下面是补充内容,于本算法没有太多的关系。 灾变与精英主义 灾变 遗传算法的局部搜索能力较强,但是很容易陷入局部极值。引用网上的一段原话: “那么如何解决遗传算法容易陷入局部极值的问题呢?让我们来看看大自然提供的方案。六千五百万年以前,恐龙和灵长类动物并存,恐龙在地球上占绝对统 治地位,如果恐龙没有灭绝灵长类动物是绝没有可能统治地球的。正是恐龙的灭绝才使灵长类动物有了充分进化的余地,事实上地球至少经历了5次物种大灭绝,每 次物种灭绝都给更加高级的生物提供了充分进化的余地。所以要跳出局部极值就必须杀死当前所有的优秀个体,从而让远离当前极值的点有充分的进化余地。这就是灾变的思想。” 灾变就是杀掉最优秀的个体,这样才可能产生更优秀的物种。那何时进行灾变,灾变次数又如何设定? 何时进行灾变,可以采用灾变倒计数的方式。如果n代还没有出现比之前更优秀的个体时,可以发生灾变。灾变次数可以这样来确定,如果若干次灾变后产生的个体的适应度与没灾变前的一样,可停止灾变。 精英主义 当利用交叉和变异产生新的一代时,我们有很大的可能把在某个中间步骤中得到的最优解丢失。 精英主义的思想是,在每一次产生新的一代时,首先把当前最优解原封不动的复制到新的一代中。然后按照前面所说的那样做就行。精英主义方法可以大幅提高运算速度,因为它可以防止丢失掉找到的最好的解。 矛盾 由上面看来,灾变与精英主义之间似乎存在着矛盾.前者是将产生的最优个体杀掉,而后者是将最优秀个体基因直接保存到下一代. 应该辩证地看待它们之间的矛盾,两者其实是可以共存的.我们在每一代进行交叉运算时,均直接把最优秀的个体复制到下一代;但当连续N代,都没有更优 秀的个体出现时,便可以猜想可能陷入局部最优解了,这样可以采用灾变的手段.可以说,精英主义是伴随的每一代的,但灾变却不需要经常发生,否则算法可能下 降为随机搜索了. 当然,每个算法中不一定要用精英主义和灾变的手段,应该根据具体的问题而定. 2.4基本的遗传算法的优点与不足 遗传算法的优点: (1)群体搜索,易于并行化处理; (2)不是盲目穷举,而是启发式搜索; (3)适应度函数不受连续、可微等条件的约束,适用范围很广。 (4)容易实现。一旦有了一个遗传算法的程序,如果想解决一个新的问题,只需针对新的问题重新进行基因编码就行;如果编码方法也相同,那只需要改变一下适应度函数就可以了。 遗传算法的不足: 1、早熟。这是最大的缺点,即算法对新空间的探索能力是有限的,也容易收敛到局部最优解。
2、大量计算。涉及到大量个体的计算,当问题复杂时,计算时间是个问题。
3、处理规模小。目前对于维数较高的问题,还是很难处理和优化的。
4、难于处理非线性约束。对非线性约束的处理,大部分算法都是添加惩罚因子,这是一笔不小的开支。
5、稳定性差。因为算法属于随机类算法,需要多次运算,结果的可靠性差,不能稳定的得到解。 2.5遗传算法的改进 尽管遗传算法有许多优点,也有许多专家学者对遗传算法进行不断研究,但目前存在的问题依然很多,如: (1)适应度值标定方式多种多样,没有一个简洁、通用的方法,不利于对遗传算法的使用。 (2)遗传算法的早熟现象即很快收敛到局部最优解而不是全局最优解是迄今为止最难处理的关键问题。 (3)快要接近最优解时在最优解附近左右摆动,收敛较慢。 本节根据遗传算法所存在的这些问题分别从适应度值函数标定和增加群体多样性两方面着手解决。 遗传算法通常需要解决以下问题,如确定编码方案,适应度函数标定,选择遗传操作方式及相关控制参数,停止准则确定等。相应地,为改进简单遗传算法的实际计算性能,很多学者的改进工作也是分别从参数编码、初始群体设定、适应度函数标定、遗传操作算子、控制参数的选择以及遗传算法的结构等方面提出的。自从1975年J.H.Holland系统提出遗传算法的完整结构和理论以来,众多学者一直致力于推动遗传算法的发展,对编码方式、控制参数的确定和交叉机理等进行了深入的研究,提出了各种变形的遗传算法。其基本途径概括起来主要有下面几个方面: (1)改进遗传算法的组成成分或使用技术,如选用优化控制参数、适合问题特性的编码技术等。 (2)采用混合遗传算法(Hybrid Genetic Algorithm)。 (3)采用动态自适应技术,在进化过程中调整算法控制参数和编码精度。 (4)采用非标准的遗传操作算子。 (5)采用并行算法。 在许多资料中都介绍了七种改进遗传算法: (1)分层遗传算法(Hierarchic Genetic Algorithm); (2) CHC算法; (3) Messy 遗传算法; (4)自适应遗传算法(Adaptive Genetic Algorithm); (5)基于小生境技术的遗传算法(Niched Genetic Algorithm,NGA); (6)并行遗传算法(Parallel Genetic Algorithm); (7)混合遗传算法: ①遗传算法与最速下降法相结合的混合遗传算法。 ②遗传算法与模拟退火法(Simulated Annealing)相结合的混合遗传算法 2.6遗传算法的应用 遗传算法提供了一种求解复杂系统优化问题的通用框架,它不依赖于问题的具体领域,对问题的种类有很强的鲁棒性。所以,广泛应用于很多学科。下面是遗传算法的一此主要应用领域。 2.6.1函数优化 函数优化是遗传算法的经典应用领域,也是对遗传算法进行性能评价的常用算例。很多人构造出了各种各样的复杂形式的测试函数。有连续函数也有离散函数,有凸函数也有凹函数,有低维函数也有高维函数,有确定函数也有随机函数,有单峰值函数也有多峰值函数等。用这些几何特性各具特色的函数来评价遗传算法的性能,更能反映算法的本质效果而对于一些非线性、多模型、多目标的函数优化问题,用其他优化方法较难求解。而遗传算法却可以方便地得到较好的结果。 2.6.2组合优化 随着问题规模的增大,组合优化问题的搜索空间也急剧扩大。有时在目前的计算机上用枚举法很难或甚至不可能求出其精确最优解。对这类复杂问题,人们已意识到应把主要精力放在寻求其满意解上,而遗传算法是寻求这种满意解的最佳工具之一。实践证明,遗传算法已经在求解旅行商问题、背包问题、装箱问题、布局优化、图形划分问题等各种具有NP难度的问题得到成功的应用。 2.6.3生产调度问题 生产调度问题在很多情况下建立起来的数学模难以精确求解,即使经过一些简化之后可以进行求解.也会因简化得太多而使得求解结果与实际相差甚远。目前在现实生产中主要是靠一些经验来进行调度。现在遗传算法已成为解决复杂调度问题的有效下具。在单件生产车间调度、流水线生产间调度、生产规划、任务分配等方面遗传算法都得到了有效的应用。 2.6.4自动控制 在自动控制领域中有很多与优化相关的问题需要求解。遗传算法已在其中得到了初步的应用,并显示出良好的效果。例如用遗传算法进行航空控制系统的优化、使用遗传算法设计空间交会控制器、基于遗传算法的模糊控制器的优化设计、基于遗传算法的参数辨识、基于遗传算法的模糊控制规则的学习、利用遗传算法进行人工神经网络的结构优化设计和权值学习等。都显出了遗传算法在这此领域中应用的可能性。 2.6.5 机器人学 机器人是一类复杂的难以精确建模的人工系统,而遗传算法的起源就来自于人工自适应系统的研究。所以,机器人学理所当然地成为遗传算法的一个重要应用领域。例如,遗传算法已经在移动机器人路径规划、关节机器人运动轨迹规划、机器人逆运动学求解、细胞机器人的结构优化和行为协调等方而得到研究和应用。 2.6.6 图像处理 图像处理是计算机视觉中的一个重要研究领域。在图像处理过程中,如扫描、特征提取、图像分割等不可避免地会存在一此误差,从而影响图像的效果。如何使这些误差最小是使计算机视觉达到实用化的重要要求。遗传算法在这些图像处理中的优化计算方面找到了用武之地。目前已在模式识别(包括汉字识别)、图像恢复、图像边缘特征提取等方而得到了应用。 2.6.7 人工生命 人下生命是用计算机、机械等人下媒体模拟或构造出的具有自然生物系统特有行为的人造系统。自组织能力和自学习能力是人下生命的两大主要特征。人下生命与遗传算法有着密切的关系。基于遗传算法的进化模型是研究人下生命现象的重要基础理论。虽然人下生命的研究尚处于启蒙阶段,但遗传算法已在其进化模型、学习模型、行为模型、自组织模型等方面显示出了初步的应用能力,并且必将得到更为深入的应用和发展。人工生命与遗传算法相辅相成,遗传算法为人下生命的研究提供一个有效的下具,人下生命的研究也必将促进遗传算法的进一步发展。 2.6.8 遗传编程 1989年,美国Standford大学的Koza教授发展了遗传编程的概念,其基木思想是:采用树型结构表示计算机程序,运用遗传算法的思想,通过自动生成计算机程序来解决问题。虽然遗传编程的理论尚米成热,应用也有一此限制,但它已成功地应用于人工智能、机器学习等领域。目前公开的遗传编程实验系统有十多个。例如,Koza开发的ADF系统,While开发的GPELST系统等。 2.6.9 机器学习 学习能力是高级自适应系统所具备的能力之一,基于遗传算法的机器学习,特别是分类器系统,在很多领域中都得到了应用。例如,遗传算法被用于学习模糊控制规则,利用遗传算法来学习隶属度函数,从而更好地改进了模糊系统的性能;基于遗传算法的机器学习可用来调整人工神经网络的连接权,也可用于人工神经网络结构优化设计;分类器系统也在学习式多机器人路径规划系统中得到了成功的应用。 2.6.10 数据挖掘 数据挖掘是近几年出现的数据库技术,它能够从大型数据库中提取隐含的、先前未知的、有潜在应用价值的知识和规则。许多数据挖掘问题可看成是搜索问题,数据库看作是搜索空间,挖掘算法看作是搜索策略。因此,应用遗传算法在数据库中进行搜索,对随机产生的一组规则进行进化.直到数据库能被该组规则覆盖,从而挖掘出隐含在数据库中的规则。Sunil已成功地开发了一个基于遗传算法的数据挖掘下具。利用该工具对两个飞机失事的真实数据库进行了数据挖掘实验,结果表明遗传算法是进行数据挖掘的有效方法之一。
|