基于Matlab的遗传算法

简介

遗传算法(Genetic Algorithm,GA)是由美国的John Holland于20世纪70年代提出的一种模拟自然进化过程的计算模型。它基于达尔文的生物进化理论,通过模拟生物进化过程中的自然选择和遗传机制,利用计算机仿真运算,将问题的求解过程转换为类似生物进化中的染色体基因的交叉、变异等过程。

遗传算法在组合优化、机器学习、信号处理、自适应控制和人工生命等领域被广泛地应用。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。

函数简介
 1.种群创建函数crtbp()

函数功能:创建任意离散离散随机种群
参数说明:Nind 为个体数量,Lind为个体长度,Chrome为种群编码,Base为基本字符向量
[Chorm,Lind,BaseV] = crtbp9(Lind,Nind,Base) ,注意Nind的数量=Basw的列数

[Chorm,Lind,BaseV] = crtbp(5,10,[2 2 2 2 2 2 2 2 2 2]);

例,创建一个种群个体为5,个体长度为8,各位的进制数[1 2 3 4 5 6 7 8]

clear;
[Chorm,Lind,BaseV] = crtbp(5,8,[1 2 3 4 5 6 7 8]);
2.适应度计算函数ranking()

FitnV = ranking(ObjV,RFun,SUBPOP)
参数说明
ObjV:目标值
 RFun:排序方法及压差选择 ps:压差的意义:匹配度最高值为压差
SUBPOP:ObjV子种群数量,默认为1

ObjV = [1;2;3;4;5;10;9;7;8;6];
%使用线性排序和压差为2估算适应度,下面的结果都是一样的
FitnV = ranking(ObjV);
FitnV = ranking(ObjV,[2,0]);
FitnV = ranking(ObjV,[2,0],1);



使用RFun中的值来估计适应度

RFun = [1,11,22,33,44,55,88,99,66,111];
FitnV = ranking(ObjV,RFun);

目标值的匹配度就是直接选择RFun里的,默认目标值最小对应的匹配值最大

3.选择函数 select()


select(SEL_F,Chrom,FItnV,GGAP,SUBPOP)
参数说明
SEL_F类型为字符串,代表低级选择函数,如'sus','rws'
GGAP 是指“Generational Gap”(代际差距)。
代际差距描述了在每一代中,有多少新的个体应该被产生来替换当前的种群。
 这是一个控制种群更新速率的参数。
例如,如果GGAP设置为0.9,这意味着在每一代中,90%的当前种群将被新的个体所替代。
这些新的个体通常是通过交叉、变异等操作产生的。

Chrom = [1 11 21;2 12 22;3 13 23; 4 14 24;5 15 25;6 16 26; 7 17 27 ;8 18 28];
FitnV = [1.5;1.35;1.21;1.07;0.92;0.78;0.64;0.5];
GGAP = 0.9;
SleCh = select('sus',Chrom,FitnV,GGAP);%注意这里的SleCh个体数量为70


交叉算子函数recombin(REC_F,Chrom,RecOpt,SUBPOP)
REC_F低级重组函数,例如'recdis','xovsp'
RecOpt为交叉概率的任选参数

clear;clc
Chrom = crtbp(5,10);
NewChrom = recombin('xovsp',Chrom);


mut变异算子函数
mut(OldChrom,Pm.BaseV)
Pm为变异概率,BaseV若省略则为二进制

clear;clc
OldChrom = crtbp(5,10);
NewChrom = mut(OldChrom,0.7);
4.重插入函数 reins()


若GGAP的数量小于1,经过select()函数则,子种群个体数量=GGAP.*原种群个体数量,则重插入函数会补全个体的数量
[Chrom,ObjVCh] = reins(Chrom,SelCH,insopt,ObjVCh,ObjVSel)
SelCH为子种群,ObjVCh,ObjVSel 分别代表父代的目标值,子代目标值
insopt为一个二维向量,第一个值子代插入父代的方法,0代表均匀插入;1代表基于匹配度的插入,子代会优先插入匹配度低的父代,默认为0
第二个值代表子种群中被子代个体插入的概率默认为1.0

clear();clc
Chrom = crtbp(5,10);
SelCh = crtbp(2,10);
Chrom = reins(Chrom,SelCh);
5.bs2rv()将2进制转换成10进制


Chrom = bs2rv(Chrom,FielD)
FieldD译码矩阵
FieldD(len;lb;ub;code;scale;lbin;ubin)
len为种群个体长度;lu,ub,代表种群的上界与下界;code为编码方式1为2进制,0为格雷编码
scale为刻度,0为算数刻度,1为对数刻度;lbin,ubin代表是否包含边界

clear;clc
Chrom = crtbp(4,8);
FieldD = [size(Chrom,2);-1;10;1;0;1;1];
value = bs2rv(Chrom,FieldD);
实例一:一元函数求最小值

%% GA:Single parameter
%date:2023.10.15
clc;clear;
close all;

% 绘图
figure(1)
hold on;
lb = 1;%X的变量下限
ub = 2;%X的变量上限
fplot( @(X)(sin(10.*pi.*X)./X),[lb,ub]);
xlabel('自变量X')
ylabel('函数值Y')

%定义遗传算法参数
NIND=40;%种群数量
MAXGEN=30;%最大遗传代数
PRECI=20;%个体长度
GGAP=0.95;%代沟
px=0.7;%交叉概率
pm=0.01;%变异概率
trace=zeros(2,MAXGEN);%起始值
FieldD=[PRECI;lb;ub;1;0;1;1];
Chrom=crtbp(NIND,PRECI);
%优化
gen=0;%代计数器,迭代次数
X=bs2rv(Chrom,FieldD);%2进制 ---> 10进制
ObjV = sin(10*pi.*X)./X;
while gen < MAXGEN
    FitV=ranking(ObjV);%分配适应度
    SelCh = select('sus',Chrom,FitV,GGAP);%自然选择
    SelCh=recombin('xovsp',SelCh,px);%基因重组
    SelCh=mut(SelCh,pm);%基因变异
    X=bs2rv(SelCh,FieldD);%2进制 ---> 10进制
    ObjVSel=sin(10.*pi.*X)./X;%计算子代目标值
    [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
    X=bs2rv(Chrom,FieldD);
    gen=gen+1;%迭代加一次
    
    [Y,I] = min(ObjV);%获取最优值,Y为最优解,I为个体序号
    trace(1,gen)=X(I);
    trace(2,gen)=Y;
end

plot(trace(1,:),trace(2,:),'bo');%每代最优解
grid on;
plot(X,ObjV,'b*');%最后一代种群

%画进化图
figure(2)
plot(1:MAXGEN,trace(2,:));
grid on;
xlabel("遗传代数")
ylabel("解的变换")
title("进化过程")
bestY=trace(2,end);
bestX=trace(1,end);
fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n'])

运行结果:

 最优解:
X=1.1491
Y=-0.8699

ps:遗传算法为启发式算法,每次得到的值都不一样,但是在种群数量足够的情况下,最终值都相差不大。

实列二:多元函数求最大值

%% GA_multiparameter
%date:2023.10.17
clc;clear;
close all;

%绘制函数图
figure(1)
lb_x=-2;ub_x=2;
lb_y=-2;ub_y=2;
fun = @(x,y) x.*cos(2.*pi.*y)+y.*sin(2.*pi.*x);
fmesh(fun,[lb_x,ub_x,lb_y,ub_y])
xlabel('X Axis Label')  
ylabel('Y Axis Label')  
zlabel('Z Axis Label')
hold on;
%view(3) 默认三维视角,view(az,el)
view(45,45)%感觉这个视角舒服一些

%定义遗传算法参数
NIND=40;%种群数量
MAXGEN=50;%最大遗传代数
PRECI=20;%个体长度
GGAP=0.95;%代沟
px=0.7;%交叉概率
pm=0.01;%变异概率
trace=zeros(3,MAXGEN);
FieldD=[PRECI PRECI;lb_x lb_y;ub_x ub_y;1 1;0 0;1 1;1 1];
Chrom = crtbp(NIND,PRECI.*2);

%%优化
gen=0;
XY = bs2rv(Chrom,FieldD);
X = XY(:,1);Y = XY(:,2);
ObjV=Y.*sin(2.*pi.*X)+X.*cos(2.*pi.*Y);

while gen < MAXGEN
    FitnV=ranking(-ObjV);%这里求的是目标函数的最小值,这个算法默认求最小值
    SelCh=select('sus',Chrom,FitnV,GGAP);%选择
    SelCh=recombin('xovsp',SelCh,px);%重组
    SelCh=mut(SelCh,pm);%变异
    XY=bs2rv(SelCh,FieldD);
    X = XY(:,1);Y = XY(:,2);
    ObjVSel=Y.*sin(2.*pi.*X)+X.*cos(2.*pi.*Y);
    [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);
    XY=bs2rv(Chrom,FieldD);
    disp([num2str(gen),'代'])
    gen = gen + 1;
    [Y,I]=max(ObjV);
    trace(1:2,gen)=XY(I,:);
    trace(3,gen)=Y;
end

plot3(trace(1,:),trace(2,:),trace(3,:),'bo')%绘制三维数据点,每一代的最优点
grid on;
plot3(XY(:,1),XY(:,2),ObjV,'bo')%画出最后一代的种群
hold off;

%%画进化图
figure(2)
plot(1:MAXGEN,trace(3,:));
grid on;
xlabel("遗传代数")
ylabel("进化过程")
title("进化过程")
bestZ = trace(3,end);
bestY = trace(2,end);
bestX = trace(1,end);  
fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n','最优解:\nY=',num2str(bestZ)])

运行结果:

 最优解:
X=-1.7667
Y=1.5143
最优解:
Z=3.2655

ps:遗传算法为启发式算法,每次得到的值都不一样,但是在种群数量足够的情况下,最终值都相差不大。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值