遗传算法的英文是genetic algorithm
本文统一用缩写GA表示遗传算法genetic algorithm
Matlab库 [https://github.com/guofei9987/genetic-algorithm-Matlab]https://github.com/guofei9987/genetic-algorithm-Matlab
一些问题
为何需要?
Matlab已经自带了遗传算法工具箱,为何还需要自己用代码实现遗传算法?
- Matlab自带的GA工具箱定制能力不如自编代码。例如无法解决TSP问题这是因为用遗传算法解决TSP问题时,crossover函数与一般不一样
- Matlab的GA工具箱不能实现多种群操作
- Matlab的GA工具箱不能实现精英策略
- 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
您的支持将鼓励我继续创作!