📄 gaexperiment.m
字号:
%具有自适应的遗传算法
%目标函数y=10*sin(5*x)+7*cos(4*x)-(x-7).^2+62;,其中0<=x<=12
%最优点约为7.8493,函数最大值约为78.2747
%编码长度为20位,编码精度为12/1024^2
%种群规模设为40,遗传算子分别为比例选择,单点交叉和单点变异
%变异概率的动态调整采用灾变法,即在算法迭代后期增大变异概率
%此方法可以极大的避免算法过早收敛于局部最优解
%虽然表面上看采用灾变法后平均适应度曲线波动比较大
%但实际上这不仅不会降低最终结果的精度,反而能够进一步提高精度
%最大进化代数为300代,保优操作
%initial;
%global G;
%for G=1:200
% calulate; 计算每个个体的适应度
% keepbest; 根据计算结果进行保优
% crossover;交叉
% mutation; 变异
% selection;选择
%end
function GAexperiment
clear all;
close all;
%初始化函数,随机形成规模为40初始种群
% function [pop]=initial
pop(40,20)=0; %生成初始种群函数
best_individual(20)=0; %最优个体
adapt_ave(300)=0; %种群平均适应值
adapt_best(300)=0;
f=1;
q=0;
for i=1:40
for j=1:20
if rand>0.5
pop(i,j)=1;
else
pop(i,j)=0;
end
end
end
% pop
for G=1:300 %循环开始
%计算适应度
% function [adapt,ada_ave]=adapting(pop)
adapt(40)=0;
for i=1:40
for j=1:20
if pop(i,j)==1
adapt(i)=adapt(i)+2^(20-j);
end
end
adapt(i)=adapt(i)*12/1024^2;
adapt(i)=10*sin(5*adapt(i))+7*cos(4*adapt(i))-(adapt(i)-7)^2+62;
end
%寻找最优个体
max=0;
p=0;
for i=1:40
if adapt(i)>max
max=adapt(i);
p=i;
end
end
%保优操作
best_pos=p;
for i=1:20
best_individual(i)=pop(best_pos,i);
end
%交叉操作,概率线性变化,单点交叉
for i=1:2:39
cross_P=rand; %产生一个随机数,用于和交叉概率进行比较
if cross_P<0.6 %(-0.6*G+180.6)/300 %交叉概率线性变换,由0.6下降到0.002
cross_pos=round(20*rand); %交叉位置为1-10
if cross_pos==0 %若位置为0,则不进行交叉操作
continue; %跳出for循环
end
for j=cross_pos:20
temp=pop(i,j);
pop(i,j)=pop(i+1,j);
pop(i+1,j)=temp;
end
end
end
%变异操作,单点变异,变异概率线性调整
% function pop=mutation(pop)
for i=1:40
if rand<(0.09*G+0.19)/200 %变异概率自适应线性调整,由0.0014升至0.1360
M_pos=round(20*rand); %变异概率在算法迭代后期显著增大,即灾变法
if M_pos~=0 %若变异位为0则无意义
pop(i,M_pos)=1-pop(i,M_pos);
end
end
end
%计算平均适应度
adapt_ave(G)=0;
for i=1:40
adapt_ave(G)=adapt_ave(G)+adapt(i);
if adapt_best(G)<adapt(i)
adapt_best(G)=adapt(i);
end
end
adapt_ave(G)=adapt_ave(G)/40; %平均适应度
% The select operator function
% function new_pop=select(pop,ada)
ada_sum=0;
ada_temp=0;
for i=1:40
ada_sum=ada_sum+adapt(i);
end
for i=1:39 %选择39次,最后一个个体留给历代最优解
r=rand*ada_sum; %随机产生一个数
ada_temp=0; %初始化累加值为0
j=0;
while(ada_temp<r)
j=j+1;
ada_temp=ada_temp+adapt(j);
end %退出循环时的j值即为被选择的个体序号
for k=1:20
new_pop(i,k)=pop(j,k);
end
end
% 最优解复制
for i=1:20
new_pop(40,i)=best_individual(i);
end
%将选择产生的新群体复制给pop种群
for i=1:40
for j=1:20
pop(i,j)=new_pop(i,j);
end
end
%复制结束,新种群产生
%绘制点状图,显示历代个体的分布情况
if or(G==1,G==q)
for i=1:40
sum=0;
for j=1:20
sum=sum+pop(i,j)*2^(20-j);
end
result(i)=sum*12/1024^2;
end
x=0:0.01:12;
y=10*sin(5*x)+7*cos(4*x)-(x-7).^2+62;
figure(f)
plot(x,y);
hold on;
f=f+1;
for i=1:40
h(i)=10*sin(5*result(i))+7*cos(4*result(i))-(result(i)-7)^2+62;
end
scatter(result,h,'r');
grid on;
hold on;
if q==0
xlabel('1');
else
xlabel(q);
end
q=q+50;
end %绘制点状图结束
end %主程序结束
%结果统计
n=1:1:300;
figure(8);
plot(n,adapt_ave,'b');%绘制平均适应度变化曲线
hold on;
plot(adapt_best,'g'); %绘制最优个体的变化曲线
grid on;
best=0;
for j=1:20
if best_individual(j)==1
best=best+2^(20-j);
end
end
best=best*12/1024^2;
disp('最优个体为')
disp(best);
disp('最优解为')
best=10*sin(5*best)+7*cos(4*best)-(best-7)^2+62;
disp(best);
for i=1:2
i=i-1;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -