遗传算法示例

clc,clear
lb=1;ub=2;
MAXGEN=20;%代数
Nind=40;%种群大小
Lind=20;%基因长度
GGAP=0.95;%代沟
px=0.7; %交叉率
pm=0.01; %变异率
ezplot('sin(10*pi*x)/x',[lb,ub]);%画出原函数图
hold on;
Chrom=crtbp(Nind,Lind);%创建种群
FieldD=[size(Chrom,2);lb;ub;1;0;1;1];%区域描述,用来将二进制转换为十进制。
X=bs2rv(Chrom,FieldD); %初始种群二进制到十进制转换
ObjV=sin(10*pi*X)./X;%计算目标函数值
gen=0;%代计数器
trace=zeros(2,MAXGEN);
while gen<20
FitnV=ranking(ObjV);%分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP);%随机选择;
SelCh=recombin('xovsp',SelCh,px);%重组
SelCh=mut(SelCh,pm);%变异
X=bs2rv(SelCh,FieldD);%子代个体的十进制转换
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);%记下每代最优
trace(1,gen)=X(I);
trace(2,gen)=Y;
end
plot(trace(1,:),trace(2,:),'bo');%画出每代最优点
plot(X,ObjV,'b*');%画出最后一代种群
bestY=trace(2,end)
bestX=trace(1,end)

n元时,基因长度Lind改变,一个个体由代表每个变量的基因Lind组成,所以其长度为Lind*n。相应改变的有:

①进制转换函数FieldD变为n列,每列按顺序用来描述其中一元的译码规范;

②进制转换后得到的子代个体为n列,每一列代表其中一元的取值;

猜你喜欢

转载自blog.csdn.net/a2210294/article/details/82721831