ga.m

来自「主要用于遗传算法的简单应用,有利于初学者应用MATLAB软件.」· M 代码 · 共 66 行

M
66
字号
function []=main(N,pcro,pmut)
%遗传算法主函数
%用以实现求给定函数fun在给定区间[low,up]上的极大值
% pcro交叉概率,pmut变异概率,N为迭代次数
low=0; %区间下限
up=9;   %区间上限
n=50;          %种群个数
length=22;  %求得单个变量编码长度
pop=encode(length,n);    %用解码函数求得初始种群,n为种群个体个数
f='x+10*sin(x.*5)+7*cos(x.*4)';
gen=0;          %代数初始化
vfx=[];
mfx=[];
while(gen<=N)
    fval=zeros(1,n);   %初始化函数值
    fit=zeros(1,n);    %初始化适应度
    x=decode(pop(:,1:22),low,up);
    fx=eval(f);
    if gen==1
        figure(1);fplot(f,[low,up]);grid on;hold on;
        plot(x,fx,'k*');
        title('(a)染色体初始位置分布图');
        xlabel('x');ylabel('f(x)');
    end
    fsum=sum(fx);
    fmin=min(fx);
    fs=fsum-n*fmin;
    fit=(fx-fmin)/fs;                   %求个体的适应度
    
    q(1)=fit(1);
    for i=2:n
        q(i)=q(i-1)+fit(i);               %累加个体适应度形成赌轮
    end
    pop=select(pop,q,n);                  %选择
    pop=crossover(pop,pcro,n,length);     %交叉
    pop=mutation(pop,pmut,n,length);      %变异
    gen=gen+1;              %下一代
[x]=decode(pop(1,:),low,up);
fval=fun(x);
maxf=fval;
for i=1:n
    [x]=decode(pop(i,:),low,up);   %解码最终得到的个体
    fval=fun(x);                          %计算其函数值
    if fval>maxf                    %最优点及最优值得到最终种群中的
        maxf=fval;
        x0=[x];
    end
end
pfx=fsum/n;
mfx=[mfx pfx];
vfx=[vfx maxf];
if gen==N
    x=decode(pop(:,1:22),low,up);
    fx=eval(f);
    figure(2);fplot(f,[low,up]);grid on;hold on;
        plot(x,fx,'k*');
        title('(b)染色体最终位置分布图');
        xlabel('x');ylabel('f(x)');
end
end
figure(3);plot(vfx);
title('函数最优个体适应度值变化曲线')
xlabel('Generation');ylabel('maxf');
figure(4);plot(mfx);
title('函数平均个体适应度值变化曲线')
xlabel('Generation');ylabel('pf');

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?