2. Genetic Algorithm(1) ——进化算法

本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法。

内容依然来自博主的听课记录和教授的PPT。


Outline

  1. 简单基因算法
  2. 个体表示
  3. 变异
  4. 重组

1. 简单基因算法(Simple Genetic Algorithm)

Holland‘s早期的基因算法被认为是“简单的基因算法”或是“权威的基因算法”。(simple genetic algorithm or canonical genetic algorithm)

1. 直接举例说明

  问题描述:利用遗传算法求解区间[0,31]上的二次函数y=x2的最大值

  乍一看,是个很白痴的问题,那我们就用GA算法来套一下,看一下流程。

  [0, 31] 中的点x就是个体(individual), 函数值f(x)恰好就可以作为x的适应度(fitness),区间[0, 31]就是一个种群(population) 。

  种群规模设定为4,用5位二进制数编码染色体。

  假定4个个体:

    S1: 13 = 01101(二进制)

    S2: 24 = 11000

    S3: 8 = 01000

    S4: 19 = 10011

  

  第一列是编号,第二列是初始值的二进制值(initial population),第三列就是给定的初始值,第四列f(x) = x^2是适应度(fitness),当然适应度越高越符合预期。第五列是种群中各个体的选择概率(prob)(根据第四列能算出来的)。第七列是个体在配对池(mating pool)中的个数。

选择概率的计算公式为:

  

下面开始重组配对(crossover):

  

  上图表格是配对重组的过程。第一列依然是编号,第二列是配对池,第三列表示重组开始的点,第四列是配对重组后的后代,第五列是新的后代的值,第六列是适应度。

  下面是变异(mutation):

  

  前两列内容和之前的一样,第三列是变异后的二进制值,编号1的个体在第一位发生了变异,编号4的个体在第三位发生了变异。数值发生了改变,适应度也发生了变化。

  注:这里博主把教授的ppt给改了一下,因为博主不认为他原来写的数值是正确的。原数值如下:在S1的第四列,原ppt上的数字是26,第五列的数字是676。在S4的第四列,原ppt上的数字是18,第五列上的数字是324。当然下面的总和、平均值、最大值也都全部改了。

  有一个问题,为什么变异了第一个和第四个,而第二个却没有变异呢?计算机是如何判断让哪一个个体进行变异的呢?

  这里讲一个概念叫变异率(mutation rate),这是一个固定的值,在这个问题中我们设变异率0.001,也就是事先告诉计算机的一个数值。在基因的每一位上,也就是二进制码的每一位上,计算机会产生一个随机数,范围在[0,1]之间。接着计算机会将这个随机数与变异率进行比较,如果这个随机数小于这个变异率,那么在这一位上的基因将会发生反转。从这个变异的结果上来看,变异是朝着好的方向进行的。

  至此一轮的进化已经走完了,可以看到新的后代:

  S1: x = 28, f(x) = 784

  S2: x = 25, f(x) = 625

  S3: x = 27, f(x) = 729

  S4: x = 20, f(x) = 400

  可以对比一下第一张表格和最后一张表格,平均适应度由开始的293增加到了634.5,最适应的种群有最开始的576增长到了784。当然最终最好的、我们想要的结果是31^2 = 961。

  

2. 特点总结

  • 有一个二进制的表示(a binary representation)
  • 适应的、成比例的选择(fitness proportionate selection)
  • 低可能性的变异(a low probability of mutation)
  • 利用创新式的重组(recombination,crossover)来产生新的候补solution

  此外再补充一个教授ppt上的表格

  

  缺点总结:

  • Representation is too restrictive
  • Mutation & crossovers only applicable for bit-string & integer representations
  • Selection mechanism sensitive for converging populations with close fitness values
  • Generational population model (step 6 in SGA repr. cycle) can be improved with explicit survivor selection

2. 个体表示(Representation of Individuals)

2.1 二进制表示(Binary Representations)

  二进制表达是最简单的表达方式之一。比如上面的那个问题就是用的二进制表达。

  对于一个给定的问题,我们需要决定: 1.string的长度。2.如何用它来表示一个表型(phenotype)。

  具体来说,我们需要保证,我们的每一个二进制编码都能够表示一个有效的solution,反之亦然,所有可能的solution都可以被表达。

  教授的原文:In choosing the genotype-phenotype mapping for a specific problem, one has to make sure that the encoding allows that all possible bit strings denote a valid solution to the given problem and that, vice versa, all possible solutions can be represented.

2.2 其他表达方法

主要先拿二进制表达开刀,其他的表达先略过。

  除了二进制表示,还有一些其他表达方法,列举如下:

  • 整型表示(Integer Representations)
  • Real-Valued Representation
  • Floating-Point Representation
  • Permutation Representations

  有些问题并不总适用于二进制表示。比如在一个正方形网格地图上寻找路径的过程中,我们可能会使用整型{0,1,2,3}来表示方向{东,南,西,北}。这里显然整型会比二进制更加合适。

  

3. 变异(Mutation)

  变异本来是个生物学的名词,这里就是表明变异算子(variation operators)通过对基因型的一些随机变化,仅仅用一个父辈创造出了一个新的后代。

  原文如下:Mutation is the generic name given to those variation operators that use only one parent and create one child by applying some kind of randomised change to the representation(genotype).

3.1 二进制表达的变异(Mutation for Binary Representations)

  在最开始的例子中已经演示过二进制表达的变异。

  最常见的二进制变异就是考虑每一位上的基因是否反转(从1到0,从0到1),这个反转有一个极小的概率pm。  

3.2 其他表达的变异

主要先拿二进制表达开刀,其他的表达先略过。

  • 整型表达的变异(Mutation Operators for Integer Representations)
  • Mutation Operators for Floating-Point Representations
  • Mutation Operators for Permutation Representations

4. 重组(Recombination)

  重组被认为是基因算法中最重要的特征之一。

  重组的概念上一章讲过了,这里引一段教科书的描述。

  Recombination, the process whereby a new individual solution is created from the information contained within two (or more) parent solutions, is considered by many to be one of the most important features in genetic algorithms(GA).

  这里重组的概念,有时候会说recombination,有时候会说crossover。crossover更常用来表示two-parent case。

  重组算子(Recombination operators)的使用中会有一个重组率(crossover rate),这个概率的取值范围大约是[0.5,1.0]。通常在重组的过程中,一个位置上发生重组的概率会在[0,1),然后这个概率再和上面的我们实现设定好的重组率进行比较,倘若这个值低于了重组率,那么两个父辈就会通过重组产生两个新的后代。相反,则不发生重组,两个新的后代通过无性生殖(asexually)产生。也就是说,在经过一轮重组之后,有一部分后代(offspring)是直接copy父辈而产生的,另有一部分后代表达了之前没有见过的solutions。

  回顾一下重组率(crossover rate)和变异率(mutation rate)

  变异率(mutation rate)是用来控制染色体的一些部分如何独立地发生变化。所谓独立就只需要一个父辈就可以了。

  重组率(crossover rate)决定了一组父辈发生重组的机会。

4.1 二进制表达的重组算子(Recombination Operators for Binary Representations)

4.1.1 单个位置的交叉重组(One-Point Crossover)

  从某一个位置开始进行交叉重组。

  

4.1.2 多个位置的交叉重组(N-Point Crossover)

  从不止一个位置开始进行交叉重组。

  

这两个划分看上去有点多余,但人家西方教科书就这么区分开了。

4.1.3 均衡交叉重组(Uniform Crossover)

  与上面两种方式不同的是,uniform crossover这种重组方式是不依赖于基因的具体位置的。它首先在[0,1]上产生一组均匀分布的随机变量,组成一个string,其长度和父辈基因相同。然后有一个事先设定好的参数p(通常是0.5)。在第一个后代的每一位上,如果这个随机变量小于了这个参数,那么后代就遗传第一个父辈的基因,反之,如果这个随机变量大于了这个参数,那么后代就遗传第二个。第二个后代的基因则和第一个后代的重组方式完全相反。

  

  以上三种方式的小结和补充

  n-point crossover倾向于将位置接近的基因保持在一起。这种效果被称为位置偏向(positional bias)

  相反,uniform crossover没有任何的positional bias。他能够从每个父辈那里传递50%的基因并且防止单从某一个父辈那里获得大量的基因。这种效果被称作分布偏向(distributional bias)。

4.2 其他表达的重组算子

主要先拿二进制表达开刀,其他的表达先略过。

  • Recombination Operators for Integer Representations
  • Recombination Operators for Floating-Point Representations
  • Recombination Operators for Permutation Representations 
时间: 2024-08-06 20:08:32

2. Genetic Algorithm(1) ——进化算法的相关文章

[Evolutionary Algorithm] 进化算法简介

进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编码,种群初始化,交叉变异算子,经营保留机制等基本操作.与传统的基于微积分的方法和穷举方法等优化算法(具体介绍见博客[Math] 常见的几种最优化方法中的其他数学优化方法)相比,进化计算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织.自适应.自学习的特性,能够不受问题性质的限制,有效地

什么是遗传/进化算法?

这是基於 进化论 而启发出来的一种很特别的 机器学习 技巧.  我最近渐渐明白到它可能是破解 strong AI 的关键.  Ben Goertzel 和我见面的谈话中也特别注重这一方向.  原来 Alan Turing 很早就看到 进化 和 machine learning 之间有明显关系,而现时机器学习的一个很有名的研究者 Leslie Valiant 也在新书 (English version) 中谈论这课题. 进化论 首先,要理解什么是进化论.  举例来说,假设某只动物的基因变异 令牠比

Randomize select algorithm 随机选择算法

从一个序列里面选择第k大的数在没有学习算法导论之前我想最通用的想法是给这个数组排序,然后按照排序结果返回第k大的数值.如果使用排序方法来做的话时间复杂度肯定至少为O(nlgn). 问题是从序列中选择第k大的数完全没有必要来排序,可以采用分治法的思想解决这个问题.Randomize select 算法的期望时间复杂度可以达到O(n),这正是这个算法的迷人之处.具体的算法分析可以在<算法导论>这本书里查看. 贴出伪代码: RANDOMIZED-SELECT(A, p, r, i) 1 if p =

Genetic Algorithm Primary

Genetic algorithm is an algorithm which imitate the law of natural selection. The main step: Step 1:      Initialization     (Set Max evolutionary algebra and Create new individuals randomly) Step 2:      Individual evaluation (Evaluate the fitness o

差分进化算法 (Differential Evolution)

Differential Evolution(DE)是由Storn等人于1995年提出的,和其它演化算法一样,DE是一种模拟生物进化的随机模型,通过反复迭代,使得那些适应环境的个体被保存了下来.但相比于进化算法,DE保留了基于种群的全局搜索策略,采用实数编码.基于差分的简单变异操作和一对一的竞争生存策略,降低了遗传操作的复杂性.同时,DE特有的记忆能力使其可以动态跟踪当前的搜索情况,以调整其搜索策略,具有较强的全局收敛能力和鲁棒性,且不需要借助问题的特征信息,适于求解一些利用常规的数学规划方法所

1. Introduction ——进化算法

本系列博客开始介绍进化算法. 知识内容来源于本人在硕士阶段听的课程以及阅读的文献书籍.算是听课笔记或是读书笔记吧. 博主在国外读的书,可能就中英文混杂了. Outline 什么是进化算法 能够解决什么样的问题 进化算法的重要组成部分 八皇后问题(实例) 1. 什么是进化算法 遗传算法(GA)是模拟生物进化过程的计算模型,是自然遗传学与计算机科学相互结合的新的计算方法. <图片来源于,Frank Neumann, The University of Adelaide> 2. 能够解决什么样的问题

【转】STL算法 &lt;algorithm&gt;中各种算法解析

原文:http://blog.csdn.net/tianshuai1111/article/details/7674327 一,巡防算法 for_each(容器起始地址,容器结束地址,要执行的方法) #include <iostream> #include <algorithm> #include <vector> using namespace std; template<class T> struct plus2 { void operator()(T&

Matlab微分进化算法及优化函数测试

微分进化(Difference Evolution,DE)算法是一种优化算法,据称其比GA(遗传算法)等更为优秀. 借鉴网上实现的DE算法,用Matlab实现了对若干函数优化问题的解法,代码如下: function [] = de_test clear all; close all; clc; %解:X = [0, 0, ...] %nVar = 30 %dims: [-30, 30]     function fitness = sphere(vals)         prod = vals

差分进化算法优化集成参数

一.差分进化的思想 差分进化是在遗传算法的基础上发展而来的,与遗传算法相似,有变异.交叉.选择等操作,但是实现简单,收敛速度快.差分进化的过程是随机生成一个初始化群体,经过交叉.变异.选择三个操作,反复迭代,保留有用的个体,寻找最优解. 差分进化利用了贪婪的思想,在每一次的迭代中,保留最优解.通过当前种群个体跟经过交叉.变异后的个体以适应度值为标准,进行比较,保留最优的个体. (1)初始化 (2)变异 (3)交叉 (4)选择 其中,F是变异因子,用来控制两个随机个体差分向量的缩放程度.CR是交叉