⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gaexperiment.m

📁 遗传算法matlab程序
💻 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 + -