遗传算法是一种全局最优化算法,是运用了进化论优胜劣汰原理的随机化搜索方法。
前些日子,在进行毕业设计的相关研究中,我接触到了遗传算法,用其对一个五元非线性函数进行最优化搜索。仿真平台使用的是matlab,主要使用的是谢菲尔德大学的matlab遗传算法工具箱。
具体程序如下:
clc
clear all
close all
lbx=-1;ubx=1; %函数自变量x范围【-1,1】
lby=-1;uby=1; %函数自变量y范围【-1,1】
%% 定义遗传算法参数
NIND=50; %个体数目
MAXGEN=50; %最大遗传代数
PRECI=20; %变量的二进制位数
GGAP=0.90; %代沟
px=0.97; %交叉概率
pm=0.001; %变异概率
trace=zeros(6,MAXGEN); %寻优结果的初始值
FieldD=[PRECI PRECI PRECI PRECI PRECI;lbx lby lbx lbx lbx;ubx uby ubx ubx ubx;1 1 1 1 1;0 0 0 0 0;1 1 1 1 1;1 1 1 1 1]; %区域描述器
Chrom=crtbp(NIND,PRECI*5); %初始种群
%% 优化
gen=0; %代计数器
XY=bs2rv(Chrom,FieldD); %计算初始种群的十进制转换
d1=XY(:,1);
d2=XY(:,2);d3=XY(:,3);d4=XY(:,4);d5=XY(:,5);
ObjV=func(d1,d2,d3,d4,d5,NIND); %计算目标函数值
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); %子代个体的十进制转换
d1=XY(:,1);d2=XY(:,2);d3=XY(:,3);d4=XY(:,4);d5=XY(:,5);
d1n=numel(d1);
ObjVSel=func(d1,d2,d3,d4,d5,d1n); %计算子代的目标函数值
[Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
XY=bs2rv(Chrom,FieldD);
gen=gen+1 %代计数器增加
%获取每代的最优解及其序号,Y为最优解,I为个体的序号
[Y,I]=max(ObjV);
trace(1:5,gen)=XY(I,:); %记下每代的最优值
trace(6,gen)=Y; %记下每代的最优值
end
figure(2);
plot(1:MAXGEN,trace(6,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
bestc1=trace(1,end)
bestc2=trace(2,end)
bestc3=trace(3,end)
bestc4=trace(4,end)
bestc5=trace(5,end)
bestSIR=trace(6,end)
其中,func即为目标函数,可自行编辑。
最优解的进化曲线如下图: