建模方法(五)-遗传算法的定义和应用

版权声明:本文为博主编写文章,未经博主允许转载,转载请注明出处: https://blog.csdn.net/qq_39742013/article/details/81915837

遗传算法(Genetic Algorithm)是从达尔文生物进化论中“适者生存”衍生出的算法,是对进化的模拟。它可以应用于TSP问题,组合优化问题等。拿TSP问题来说,我们将n个地点排成一个解(1,2...n),这个解相当于生物进化论中的个体,解的不断优化越来越靠近最优值时,相当于个体的进化过程使得个体更加适应他所处的环境,而个体的进化是包含基因突变,交配遗传和选择这些过程,在遗传算法中,解要靠近最优值它也需要“突变”,“交配”和“选择”,这里的突变交配选择对应的可能是将(1,2...n)中的某个子串进行了颠倒,如果他更适应环境(即耗费更小)就说明他更接近最优值,我们就希望把这个适应度高的个体进行遗传给子代。实质是遗传算法就是对穷举法进行了优化,他搜索的方向更具目的性。遗传算法的性能由初始解的产生、杂交算法和变异算子决定。其中杂交算子和变异算子起着决定性的作用。它和模拟退火算法一样都是搜索启发式算法的一种。

遗传算法的运算对象是表示个体的符号串,如上诉(1,2,...n)。个体就表示一个可行解。

遗传算法是对群体进行的进化操作,需要给其淮备一些表示起始搜索点的初始群体数据,即随机多个个体。进化就需要选择运算,交叉运算和变异运算。下面分别介绍。

在介绍之前还是要知道表示个体的字符串的生成方式(叫做个体的编码),编码就是为了计算机能够操作方便,占用资源少(如内存资源),一个基因型即字符串和一个表现型即个体是一一对应的。常用以下方法进行编码:

  • 基于二进制的编码
  • 基于矩阵的编码
  • 基于邻接的编码
  • 基于索引(Ordinary)的编码
  • 基于路径的编码

基于二进制的编码是一种传统的编码方式,那TSP问题来举例。例如现在有6个地点的一个序列或者说是解{1,2,3,4,5,6},这是自变量的取值也即表现型,而001 010 011 100 101 110则是基因型即编码。基因型很明显可以和表现型之间相互转化,即使用二进制<->十进制转化即可。但是这种方式的编码,在经过遗传操作以后很难保证后代还是一个可行解,还需要另外的修正操作;基于矩阵的编码、邻接的编码以及索引的编码均比较复杂,并且需要占用大量的内存,应用的不是很广泛;目前最普遍用的编码方式就是基于路径的编码方式,因为它最直观最容易理解,操作起来也比较方便,比如TSP问题就可以使用此类方法。

选择运算:遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。个体适应度与待解决问题的目标函数有关。把当前群体中适应度较高的个体按某种规则或模型遗传到下一代群体中。一般要求适应度较高的个体将有更多的机会遗传到下一代群体中。例如我们采用与适应度成正比的概率来确定各个个体复制到下一代群体中
     的数量即使用轮盘赌的选择方法。其具体操作过程是:
         •  先计算出群体中所有个体的适应度的总和;
         •  其次计算出每个个体的相对适应度的大小 即占总和的比值,它即为每个个体被遗传
             到下一代群体中的概率,
         •  每个概率值组成一个区域,全部概率值之和为1;
         •  最后再产生一个0到1之间的随机数,依据该随机数出现在上述哪一个概率区
             域内来确定各个个体被选中的次数。

交叉运算:交叉运算是遗传算法中产生新个体的主要操作过程,它以某一概率相互交换某两个个体之间的部分染色体。交叉算子有很多,对于不同问题,不同的交叉算子对遗传算法的性能影响不同。如TSP问题是一类顺序排列问题,这类问题中,邻域信息有非常重要的作用,而位置信息影响不大。因此在设计杂交算子时,若考虑到保留较多的邻域信息(保持一个排列中地点之间的相对位置),那么肯定有更好的性能。TSP问题常用的交叉算子有ER、OX1、POS、OX2。我们使用一个简单例子,来说明交叉运算的过程,例如

采用单点交叉的方法,其具体操作过程是:
       • 先对群体进行随机配对;
       • 其次随机设置交叉点位置;
       • 最后再相互交换配对染色体之间的部分基因。

变异运算: 变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进行改变,它也是产生新个体的一种操作方法。变异算子也很多,对于不同问题性能不同。可能问题的要求是允许在个体中出现重复值而像TSP就不允许,所以算子肯定不同,可以自己设计。对于TSP问题的常用变异算子有DM、IVM、ISM.我们还是用一个简单例子介绍变异运算过程。例如在二进制编码中我们采用基本位变异的方法来进行变异运算,其具体操作过程是:
        • 首先确定出各个个体的基因变异位置,下表所示为随机产生的变异点位置,
          其中的数字表示变异点设置在该基因座处;
        • 然后依照某一概率将变异点的原有基因值取反。

对群体P(t)进行一轮选择、交叉、变异运算(先选择再交叉,最后变异)之后可得到新一代的群体p(t+1)。      然后继续迭代,直到出现达到我们要求的解。      

猜你喜欢

转载自blog.csdn.net/qq_39742013/article/details/81915837