遗传算法Genetic Algorithm

Origin

遗传算法的概念最早是由Bagley J.D 于1967年提出的。后来Michigan大学的J.H.Holland教授于1975年开始对遗传算法(Genetic Algorithm, GA)的机理进行系统化的研究。遗传算法是对达尔文生物进化理论(种群(Population)个体(individual)基因 ( Gene ) 染色体 ( Chromosome ) )的简单模拟,其遵循“适者生存”、“优胜劣汰”的原理。

自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。遗传算法也是当前“软计算”领域的重要研究课题。

Definition

计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传突变自然选择以及杂交等。

Theorem

遗传算法为什么能求一个问题的最优解,和多次迭代运算下为什么会收敛,证明是由模式scheme定理证明。

Introduction

  1. 编码与解码
    首先对求解问题进行编码和解码。对于函数优化问题,一般来说,有两种编码方式,一是实数编码,一是二进制编码,两者各有优缺点,二进制编码具有稳定性高、种群多样性大等优点,但是需要的存储空间大,需要解码过程并且难以理解;而实数编码直接用实数表示基因,容易理解并且不要解码过程,但是容易过早收敛,从而陷入局部最优。
  2. 初始化种群
    在开始遗传算法迭代过程之前,需要对种群进行初始化。设种群大小为pop_size,每个染色体或个体的长度为chromo_size,种群的大小决定了种群的多样性,而染色体的长度则是由前述的编码过程决定的。一般随机生成初始种群,但是如果知道种群的实际分布,也可以按照此分布来生成初始种群。假设生成的初始种群为(v1, v2, …, vpop_size)
  3. 选择操作(selection)
    选择操作即从前代种群中选择个体到下一代种群的过程。一般根据个体适应度的分布来选择个体。以初始种群(v1, v2, …, vpop_size)为例,假设每个个体的适应度为(fitness(v1), fitness(v2),…, fitness(vpop_size)),一般适应度可以按照解码的过程进行计算。以轮盘赌的方式选择个体。
    随机转动一下轮盘,当轮盘停止转动时,若指针指向某个个体,则该个体被选中。很明显,具有较高适应度的个体比具有较低适应度的个体更有机会被选中。但是这种选择具有随机性,在选择的过程中可能会丢失掉比较好的个体,所以可以使用精英机制,将前代最优个体直接选到下一代中。
    轮盘赌选择具体算法如下(这里假定种群中个体是按照适应度从小到大进行排列的,如果不是,可以按照某种排序算法对种群个体进行重排)。
  4. 交叉操作(cross;recombination)
    下面主要介绍几种常见的交叉操作的方式。

    4.1. 部分匹配法(Partially Matching Crossover, PMX)

    以两个父代个体为例:(1 2 3 4 5 6 7 8)和(2 4 6 8 7 5 3 1),随机选择两个交叉的点,假如第一个点为位置4,第二个交叉点为位置6,那么在两个点之间的位置将进行交叉,其它的位置进行复制或者用相匹配的数进行替换。在此实例中,第一个父代个体中4 5 6被选中,第二个父代个体中,8 7 5被选中。那么4 与8,5与7,6与5相匹配。匹配过程和如图2所示。

    PMX
    首先将4 5 6与8 7 5分别加入到子代2和子代1中相应的位置,然后将其他位置上的数字直接复制到相应的后代中,如果该数字已经在该子代中已经存在,则用相应的匹配法则进行替换,例如子代1中将7复制进去的时候,发现7已经存在在子代中,通过查找相应的匹配法则,发现,7与5匹配,然后复制5,又发现5也已经存在在该子代中,在此查找匹配法则,发现5与6匹配,将6复制,6不存在在该子代中,所以可以将6复制进去,如此反复,知道子代中城市的数目达到定义的长度,该子代创建完成。

    4.2 循环交叉法(Cycle Crossover, CX)
    依旧以两个父代个体为例:(1 2 3 4 5 6 7 8)和(2 4 6 8 7 5 3 1),在构造子代的过程中,首先从父代1中选取第一个元素,然后查找父代2中对应位置的元素在在父代1中的位置,将这个位置对应的元素假如到子代1中,如此过程反复,直到找到一个元素对应的父代2元素等于起始元素,次循环结束,然后将剩余未填充的位置用父代2相应的位置的元素进行填充,这样就可完成子代1的创建。子代2创建方法类似。CX操作过程如图2所示。

    CX

    首先选择父代1中的第一个元素1,将它加入到子代1中,然后检查父代2中对应位置,该位置元素为2,在父代1中查找该元素,该元素在父代1中的位置为2, 将2加入到子代1的第二个位置,再次检查父代2中第二个位置的元素,它为4,然后查找它在父代1中的位置为4,将4加入到子代1的第四个位置,然后将其加入到子代1中对应的位置4,在检查父代2中该位置的元素,它为8,查找到它在父代1中的位置为8,然后将其加入到子代1中位置8,再次查找父代2中位置8的元素,它为1,等于起始选择的元素,循环结束,然后将子代1中3,5,6,7元素为空的位置,用父代2对应位置的元素进行填充,这些元素为6,7,5,3,所以得到的子代1为(1 2 5 4 7 5 3 8)。同样的方法,得到子代2为(2 4 3 8 5 6 7 1)。

    4.3 次序交叉法1(Order Crossover, OX1)
    还以两个相同的父代个体为例:(1 2 3 4 5 6 7 8)和(2 4 6 8 7 5 3 1),随机选择两个交叉的点,假如第一个点为位置3,第二个交叉点为位置5,那么在两个点之间的位置将进行交叉。然后从第二个交叉点开始,将原来相应的父代按照顺序进行填充,如果选择的元素已经存在在该子代中,跳过该元素,选择下一个元素,这种过程反复进行,知道所有的城市都被选择一次。在此实例中,第一个父代个体中3 4 5被选中,第二个父代个体中,6 8 7被选中。匹配过程和如图4所示。
    OX1
    首先,将选择的位串进行替换,即3 4 5换到子代2中,6 8 7换到子代1中。现在从第二个交叉点开始,将父代1中的基因插入到子代1中, 所以,1 插入到第六个位置,2 插入到第七个位置,3插入到第八个位置,第二个交叉点后面已经填充满,将剩下的插入到第一个插入点前面的位置,所以4插入到第一个位置,5插入到第二个位置。这样,子代1构建完成。同样地方法,可以构建子代2.当遇到子代中已经存在的基因,就跳到下一个。

    4.4 次序交叉法2(Order Crossover, OX2)
    还以两个相同的父代个体为例:(1 2 3 4 5 6 7 8)和(2 4 6 8 7 5 3 1),随机选择几个交叉的点,假如第一个点为位置2,第二个交叉点为位置是3,第三个为位置6。首先找到父代2中相应位置的基因在父代1中位置,然后将其用父代2中选择的位置的基因进行替换插入到子代1中相应的位置中。然后将其它的位置用OX1相似的方法进行填充。这样就可以得到子代1.同样,替换角色,可以得到子代2。具体的操作过程如图5所示。
    OX2
    首先找到父代2中第,2,3以及第六个位置的基因,它们为4,6和5,这三个基因在父代1中的位置为4,5和6,将它们替换成4,6,5,加入到子代1中相应的位置,然后将父代1中的基因按照顺序插入到子代1中,如果该基因已经存在在位串中,则跳过该基因,继续下一个。这样就可以构建完子代1。子代2也可以以相同的方法构造完成。

    4.5 基于位置的交叉法(Position Based Crossover, POS)
    还以两个相同的父代个体为例:(1 2 3 4 5 6 7 8)和(2 4 6 8 7 5 3 1),随机选择几个交叉的点,假如第一个点为位置2,第二个交叉点为位置是3,第三个为位置6。将两个父代中这些选择基因按照顺序交换,并且插入到子代1和2中。然后对其它位置的基因,按照顺序插入。具体操作过程如图6所示。
    POX
    首先将2 3 6和4 6 8交换,分别插入到子代2和子代1相应的位置2,4,6中,然后将将父代1和父代2中的基因按照顺序插入到子代1和2中,如果该基因已经存在在位串中,则跳过该基因,继续下一个,知道位串的长度等于定义的长度。

    4.6 交替位置交叉法(Alternating Position Crossover,APX)
    以两个父代个体为例:(1 2 3 4 5 6 7 8)和(3 7 5 1 6 8 2 4),APX是一种简单的交叉操作方法,它是轮流选择父代1和2中的基因,直到子代的长度达到定义的长度为止。具体操作如图7所示。
    APX
    首先选择父代1中的第一个元素1,加入到子代1中,然后选择父代2中的第一个元素3,它不等于1所以也加入到子代1中,然后再选择父代1中的第二个元素2,它也不包含在当前的位串中,所以,也加入进去,然后再选择父代2中的第二个元素,……,直到子代1的长度达到8为止。同样的方法,可以得到子代2.

  5. 变异操作

    5.1 替换变异(Displacement Mutation, DM)
    DM先从父代个体中选择一个子位串,然后再随机在剩下的位串中选择一个为止,并插入该子位串,如图8所示。

    遗传算法Genetic Algorithm_第1张图片
    5.2 交换变异(Exchange Mutation, EM)

    EM是从父代个体中选择两个基因位置,然后互换这两个位置的基因。如图9所示。

EM

5.3 插入变异(Insertion Mutation, IM)

IM和DM类似,唯一的区别在于它是从父代个体中只选择一个基因,然后随机的插入到剩下的基因串中。如图10所示。

遗传算法Genetic Algorithm_第2张图片

5.4 简单倒位变异(Simple Inversion Mutation, SIM)

SIM先从父代个体中选择一个基因串,然后将这个基因串中所有的基因倒位放置,如图11所示。

SIM
5.5 倒位变异(Inversion Mutation, IVM)
IVM在SIM的基础上,随机选择一个插入位置,将这个到位后的基因串在插入到其中。如图12所示。

IVM

5.6 争夺变异(Scramble Mutation, SM)

SM非常简单,先随机从父代个体中选择一个基因串,然后将除了第一个基因外的基因均向前移动一位,将第一个基因移到最后一位。
SM

Example

Problem1: f(x)=x*sin(10πx)+2.0 x∈[-1,2],求函数f(x)的最大值。
analysis:
1)这个函数是多项式函数乘以三角函数组成,它不会是间断点和无穷点无限多和抖动的,g(x)=x是单调递增函数,s(x)=sin(10πx)是周期性单调函数,则f(x)的最值只可能出现在s(x)的周期点处,g(x)的周期为2π/10π=1/5.[-1,2]范围内以1/5为公差递增,正好对应16个数,将这16个数一一映射到一个4bit长的位串,4bit长的位串就是chromesome.
2)适应度函数设置,x∈[-1,2],f(x)=x*sin(10πx)+2.0,matlab画个图或者逻辑推导其值都是大于0的。则就以f(x)为适应度函数。

Problem2: Sysmetrical TSP.
analysis: chromesome表示就是以拓扑图点数为长度的整数排列。
TSP问题编码一般有五种种不同的方式:
基于二进制的编码
基于矩阵的编码
基于邻接的编码
基于索引(Ordinary)的编码
基于路径的编码
而我的源代码是基于路径的编码。

源码参看git链接
https://github.com/hengfanz

Reference
http://www.cnblogs.com/biaoyu/archive/2012/10/02/2710267.html

你可能感兴趣的:(计算机_算法_排序搜索)