【遗传算法】Matlab实现



🗓 2016年10月01日     📁 文章归类: Matlab     📝 Edit

版权声明:本文作者是郭飞。转载随意,标明原文链接即可。
原文链接:https://www.guofei.site/2016/10/01/gaMatlab.html


遗传算法的英文是genetic algorithm
本文统一用缩写GA表示遗传算法genetic algorithm

Matlab库 [https://github.com/guofei9987/genetic-algorithm-Matlab]https://github.com/guofei9987/genetic-algorithm-Matlab

一些问题

为何需要?

Matlab已经自带了遗传算法工具箱,为何还需要自己用代码实现遗传算法?

  1. Matlab自带的GA工具箱定制能力不如自编代码。例如无法解决TSP问题这是因为用遗传算法解决TSP问题时,crossover函数与一般不一样
  2. Matlab的GA工具箱不能实现多种群操作
  3. Matlab的GA工具箱不能实现精英策略
  4. Matlab的GA工具箱不能实现【遗传神经网络算法】

函数说明

创建种族

crtbase 创建基向量 crtbp 创建任意离散随机种群 crtrp 创建实值初始种群

适应度计算

scaling 线性适应度 ranking 秩适应度

选择算子

reins 一致随机和基于适应度的重插入 rws 轮盘赌 select 高级选择 sus 随机遍历采样

变异算子

mut 离散变异 mutate 高级变异 mutbga 实值变异

交叉算子

recdis 离散重组 recint 中间重组 reclin 线性重组 recmut 具有变异特征的线性重组 recombin 高级重组 xovdp 两点交叉=xovmp(~,~,2,0) xovdprs 减少代理两点交叉=xovmp(~,~,2,1) xovmp xovsh 洗牌交叉=xovmp(~,~,0,0) xovshrs 减少代理洗牌交叉= xovmp(~,~,0,1) xovsp 单点交叉= xovmp(~,~,0,1) xovsprs 减少代理单点交叉== xovmp(~,~,1,1)

多子群支持

migrate 在子种群见交换个体

实用函数

bs2rv 二值转实值 rep 矩阵复制

函数详解

bs2rv

Phen=bs2rv(Chrom,FieldD)

crtbase

创建基向量

BaseVec = crtbase(Lind, Base)

其中,Lind是基因长度,Base是值

例如:

BaseVec = crtbase([4,6], [8,5])

BaseVec=[8,8,8,8,5,5,5,5,5,5]

crtbp

创建离散初始种群

[Chrom, Lind, BaseV] = crtbp(Nind, Lind)
[Chrom, Lind, BaseV] = crtbp(Nind,BaseVec)
[Chrom, Lind, BaseV] = crtbp(Nind, Lind, Base)

其中,Nind是个体数量,Lind是个体长度

crtrp

创建实值初始种群

Chrom = crtrp(Nind,FieldDR)

Nind是种群数量,也就是矩阵的行数 FieldDR是2*Nvar的矩阵,第一行代表下界,第二行代表上界

Chrom是Nind*Nvar的实值矩阵

例如:

FieldDR=[-100,-50,-30,-20
    100,50,30,20]
Chrom=crtrp(6,FieldR)

migrate

在种群之间迁移个体

Chrom = migrate(Chrom, SUBPOP)
Chrom = migrate(Chrom, SUBPOP, MigOpt)
Chrom = migrate(Chrom, SUBPOP, MigOpt, ObjV)
[Chrom, ObjV] = migrate(Chrom, SUBPOP, MigOpt, ObjV)

其中,SUBPOP是一个正整数,代表子种群的个数,把整个种群从上到下平分为SUBPOP个种群

  • MigOpt有2个参数
    • MigOpt(1),种群之间的迁移概率,默认为0.2
    • MigOpt(2),迁移方式,0表示均匀迁移(默认),1表示基于适应度的迁移
    • MigOpt(3),迁移结构,0表示网状结构(默认),1表示近邻结构,2表示环状结构
  • ObjV,Chrom对应的函数值 当MigOpt(2)==1时,这个有用,并且输出的ObjV也是对应的

注:1近邻结构:1与2互相迁移,2与3互相迁移,…,n与1互相迁移。 2环状结构:1与2单向迁移,2与3单向迁移,…,n与1单向迁移

mut

离散变异算子

 NewChrom = mut(OldChrom,Pm,BaseV)

Pm:变异概率(默认0.7/Lind)

Mutate

高级变异函数

NewChrom = mutate(MUT_F, OldChrom, FieldDR)
NewChrom = mutate(MUT_F, OldChrom, FieldDR, MutOpt)
NewChrom = mutate(MUT_F, OldChrom, FieldDR, MutOpt, SUBPOP)
  • MUT_F,低级函数名字符串,例如’mutbga’或’mut’
  • FieldDR,对于实数基因,2Nvar,表示上下界;对于整数基因1Nvar表示上界+1
  • MutOpt,如果是11的,表示变异概率;如果是12的,MutOpt(2)表示压缩变异(参见mutbga)

Mutbga

实值种群变异

NewChrom = mutbga(OldChrom, FieldDR)
NewChrom = mutbga(OldChrom, FieldDR, MutOpt)
  • FieldDR:包含边界的矩阵(见crtrp)
  • MutOpt:MutOpt(1)变异概率(默认1/Nvar),MutOpt(2):是[0,1]之间的量,压缩变异的范围,默认为1

ranking

FitnV=ranking(ObjV)
FitnV=ranking(ObjV,RFun)
FitnV=ranking(ObjV,RFun,SUBPOP)
  • ObjV:函数值
  • RFun:[1,2]之间的标量:用线性排序,这个标量是压差
    • 有两个参数的向量:RFun(1):(默认2)
    • 对线性排序,压差RFun(1)必须在[1,2]之间;
    • 对非线性排序,压差RFun(1)必须在[1,length(ObjV)-2]之间
    • RFun(2):0代表线性排序(默认),1代表非线性排序
  • 长为length(ObjV)的向量:包含每一行的适应度值,最终输出的FitV是RFun 中的数字(示例中的RFun是从小到大排列的)
  • SUBPOP:多种群

注:Pos是排序的位置
对于线性排序FitnV(Pos)=2-sp+2(sp-1) (Pos-1)/(Nind-1)
对于非线性排序FitV(Pos)=NidX^(Pos-1)/∑X
其中X是多项式的根:(sp-1)
X^(Nind-1)+sp* X^(Nind-2)+…+sp*X+sp=0

recdis

离散重组

NewChrom=recdis(OldChrom)

原理:用Mask掩码表决定父代为子代贡献哪些基因 如果种群数是奇数,那么最后一行不参与运算

recint

中间重组,用于实值基因

NewChrom=recint(OldChrom)

原理:先产生中间比率表Alpha(可以是负的),根据中间比率表对父代的基因线性组合

reclin

线性重组,用于实值基因

NewChrom=reclin(OldChrom)

与recint的区别是,reclin的Alpha对每对双亲的所有基因使用同一Alpha,recint是每对基因使用新的Alpha

recmut

具有突变特征的线性重组,用于实值种群

NewChrom=recmut(OldChrom,FieldDR)
NewChrom=recmut(OldChrom,FieldDR,MutOpt)
  • FieldDR参见crtrp
  • MutOpt:
    • MutOpt(1)重组概率,默认1
    • MutOpt(2)压缩重组范围,[0,1],默认1

recombin

reins

rep

rws

scaling

select

sus

xovdp

xovdprs

xovmp

xovsh

xovshrs

sovsp

xovsprs


您的支持将鼓励我继续创作!