📄 自适应遗传算法2.m
字号:
figure(1);
fplot('abs(sin(30*variable)).*(1-variable/2)',[0,1]); %画出函数曲线
%定义遗传算法参数
NIND=100; %个体数目(Number of individuals)
MAXGEN=500; %最大遗传代数(Maximum number of generations)
PRECI=32; %变量的二进制位数(Precision of variables)
GGAP=1; %代沟(Generation gap)
trace=zeros(2, MAXGEN); %寻优结果的初始值
FieldD=[32;0;1;1;0;1;1]; %区域描述器(Build field descriptor)
Chrom=crtbp(NIND, PRECI); %初始种群
gen=0; %代计数器
variable=bs2rv(Chrom, FieldD); %计算初始种群的十进制转换
ObjV=abs(sin(30*variable)).*(1-variable/2); %计算目标函数值
Y=0;
while abs(Y-0.9739626456)>0.00000001
FitnV=ranking(-ObjV);
[c3,r3]=sort(FitnV);
for i=1:NIND*0.1
flag(i)=r3(i+NIND*0.9);
end
SelCh=select('rws', Chrom, FitnV, GGAP);
variable1=bs2rv(SelCh, FieldD);
ObjV1=abs(sin(30*variable)).*(1-variable/2);
FitnV1=ranking(-ObjV1);
avgFitnV1=sum(FitnV1)/NIND;
maxFitnV1=max(FitnV1);
for i=1:NIND/2;
ffFitnV1(i)=max(FitnV1(2*i-1),FitnV1(2*i));
end
for i=1:NIND/2;
if ffFitnV1(i)>avgFitnV1
pc(i)=0.7-((0.2*(ffFitnV1(i)-avgFitnV1))./(maxFitnV1-avgFitnV1));
else
pc(i)=0.7;
end
end
for i=1:NIND;
if FitnV1(i)>avgFitnV1
pm(i)=0.1-((0.099*(maxFitnV1-FitnV1(i)))./(maxFitnV1-avgFitnV1));
else
pm(i)=0.1;
end
end
for i=1:NIND/2
SelCh(i:2*i,:)=recombin('xovsp',SelCh(i:2*i,:),pc(i));
end
for i=1:NIND
SelCh(i)=mut(SelCh(i),pm(i));
end
Chrom=SelCh;
variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换
ObjV=abs(sin(30*variable)).*(1-variable/2); %计算子代的目标函数值
gen=gen+1; %代计数器增加
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, 'bo');
trace(1, gen)=max(ObjV); %遗传算法性能跟踪
trace(2, gen)=sum(ObjV)/length(ObjV);
end
variable=bs2rv(Chrom, FieldD); %最优个体的十进制转换
hold on, grid;
plot(variable,ObjV,'b*');
figure(2);
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -