常见算法:遗传算法GA详细讲解(附源码,初学者首选)

 

一、遗传算法介绍:

遗传算法(Genetic Algorithm ,简称GA)起源于对生物系统所进行的计算机模拟研究,是由美国Michigan大学的Holland教授提出,后经由De Jong,Goldberg等归纳总结形成的一种基于生物遗传和进化机制的适合于复杂系统优化的自适应概率优化算法,传统的优化算法大多基于单个目标函数的梯度或者较高次数统计,以产生一个确定性的实验解序列(如梯度法等),而遗传算法不依赖于梯度信息,不仅不受目标函数连续可微的约束,还可以通过编码来实现任意设定其定义域。

 

二、遗传算法基本理论

遗传算法搜索最优解的方法是模仿生物的进化过程,模拟了自然选择和遗传中发生的复制、交叉和变异等现象。它从代表一个可能存在解集的一个种群(Population)开始,对种群反复进行选择(Selection)、交叉(Crossover)以及变异(Mutation)操作,估计各个个体的适应值(Fitness),根据“适者生存,优胜劣汰”的进化法则,使得群体越来越向最优解的方向进化。

生物进化和遗传算法对应关系列表
生物进化 遗传算法
环境

适应值函数

适者生存,优胜劣汰 适应值函数值越大的解被保留的概率越大
个体 问题的一个可行解
染色体 可行解的编码
基因 编码的元素
种群 一组可行解
交叉 以交叉方式由双亲产生后代的过程
变异 编码的某些分量发生变化

 

利用遗传算法来解决模型的求解问题,首选需要将模型的解选择适当的方式进行编码,并根据模型的目标建立个体适应度函数,然后随机生成初始种群(一组初始的可行解),再重复对种群进行选择、交叉、变异等遗传操作直到种群成熟,相应的流程图如下:

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第1张图片

 

下面针对遗传算法应用过程中涉及的重要内容进行介绍:
(1)染色体的编码与解码

编码就是讲表现型空间映射到基因型空间的过程,解码则反之,是从基因型空间映射到表现型空间的过程,根据编码是染色体等位基因采用的符号,可以将编码分为:二进制编码,实数编码,整数或字母排列以及一般数据结构编码。

二进制编码是最简单,最常用的编码方式,它采用一个二进制字符串来表征解,在精度允许的范围下,二进制编码可以将区间内的无穷多点用间隔足够小的有有限点来替代,以降低计算量同时保证精度。

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第2张图片

但是,普通的二进制编码方式可能具有较大的汉明距离,也称作汉明悬崖,例如当原始值 x 为15和16时,它的五位二进制表示为01111和10000,此时参数 x 要从15进化到16就必须改变所有位,有杂交和变异算子来实现汉明距离的可能性非常小,这将减低遗传算法的搜索效率,采用格雷编码的特点是任意两个整数的编码值之间只有一一个位是不同的,其它位都相同。

格雷编码是一种基于二进制编码的循环码,它需要对普通的二进制编码从最右一位起,依次将每一位与其左边一位异或运算,作为对应格雷编码在该位的值,最左边一位保持不变。

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第3张图片

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第4张图片

 

(2)个体适应度函数

遗传算法在搜索中不依赖外部信息,仅以适应函数为依据,利用群体中每个染色体(个体)的适应值函数来进行搜索,染色体适应值越大,被遗传到下一代的概率就越大;反之,其适应值越小,被遗传到下一代的概率就越小,因此,适应值函数的选择非常关键,直接影响到遗传算法收敛的速度以及能否找到最优解。

一般地,适应值函数有目标函数转化而来,常见的形式有:

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第5张图片

(3)选择算子

遗传算法模拟“物竞天择”的自然选择学说,选择提供了算法的驱动力,选择的思想就是适应值越大的染色体获得选择(复制)的机会越大,关于选择方式,Holland提出的最经典轮盘赌选择是最经典的。

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第6张图片

(4)交叉算子

遗传交叉操作发生在两个染色体之间,是遗传算法中最重要的遗传操作,它由两个被称为双亲的父代染色体经杂交以后,产生两个具有双亲部分基因的新的染色体,从而检测搜索空间中新的点。

交叉操作将种群内各个个体随机配对,对每一对个体随机产生一个交叉点,以某个概率(成为交叉概率Pc,一般Pc的取值范围为0.4到0.99之间)交换它们之间的交叉点后的部分染色体。

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第7张图片

(5)变异算子

遗传变异操作首先在种群中随机选择一个个体,对该个个体以一定的概率(称为变异概率Pm,一般地,Pm介于1/种群规模与1/染色体长度之间,平均约为0.0001~0.1)随机改变染色体中某一个货一些基因的值。对于二进制编码染色体,变异的基因由0突变成1或者由1突变成0,为新个体的产生提供了机会,促进了种群的多样性。

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第8张图片

三、MATLAB遗传算法工具箱

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第9张图片

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第10张图片

 

 

实战演练(附源码)

一元函数优化问题

 

 

opt_minmax=-1;     %目标优化类型:1最大化、-1最小化
num_ppu=50;        %种群规模:个体个数
num_gen=60;        %最大遗传代数
len_ch=20;         %基因长度
gap=0.9;           %代沟
sub=-1;            %变量取值下限
up=2.5;            %变量取值上限
cd_gray=1;         %是否选择格雷编码方式:1是0否
sc_log=0;          %是否选择对数标度:1是0否
trace=zeros(num_gen,2);   %遗传迭代性能跟踪器
fieldd=[len_ch;sub;up;1-cd_gray;sc_log;1;1];   %区域描述器
chrom=crtbp(num_ppu,len_ch);            %初始化生成种群
k_gen=0;
x=bs2rv(chrom,fieldd);                 %翻译初始化种群为10进制
fun_v=fun_sigv(x);                     %计算目标函数值
tx=sub:.01:up;
plot(tx,fun_sigv(tx))
xlabel('x')
ylabel('y')
title('一元函数优化结果')
hold on
while k_gen

 

 

多元函数优化问题

常见算法:遗传算法GA详细讲解(附源码,初学者首选)_第11张图片

 

clc
clear all
opt_minmax=-1;   %目标优化类型:1最大化、-1最小化
num_ppu=60;     %种群规模:个体个数
num_gen=100;    %最大遗传代数
num_v=2;        %变量个数
len_ch=20;      %基因长度
gap=0.9;        %代沟
sub=-10;        %变量取值下限
up=10;          %变量取值上限
cd_gray=1;      %是否选择格雷编码方式:1是0否
sc_log=0;       %是否选择对数标度:1是0否
trace=zeros(num_gen,2);   %遗传迭代性能跟踪器
fieldd=[rep([len_ch],[1,num_v]);rep([sub;up],[1,num_v]);rep([1-cd_gray;sc_log;1;1],[1,num_v])];   %区域描述器
chrom=crtbp(num_ppu,len_ch*num_v);           %初始化生成种群
k_gen=0;
x=bs2rv(chrom,fieldd);                       %翻译初始化种群为10进制
fun_v=fun_mutv(x(:,1),x(:,2));               %计算目标函数值
[tx,ty]=meshgrid(-10:.1:10);
mesh(tx,ty,fun_mutv(tx,ty))
xlabel('x')
ylabel('y')
zlabel('z')
title('多元函数优化结果')
hold on
while k_gen

 

你可能感兴趣的:(常见算法:遗传算法GA详细讲解(附源码,初学者首选))