赞
踩
遗传算法(Genetic Algorithm,GA)是由美国的John Holland于20世纪70年代提出的一种模拟自然进化过程的计算模型。它基于达尔文的生物进化理论,通过模拟生物进化过程中的自然选择和遗传机制,利用计算机仿真运算,将问题的求解过程转换为类似生物进化中的染色体基因的交叉、变异等过程。
遗传算法在组合优化、机器学习、信号处理、自适应控制和人工生命等领域被广泛地应用。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。

函数功能:创建任意离散离散随机种群
参数说明: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]);
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里的,默认目标值最小对应的匹配值最大
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);
若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);
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:遗传算法为启发式算法,每次得到的值都不一样,但是在种群数量足够的情况下,最终值都相差不大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。