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

📄 gae.m

📁 用matlab实现的标准的遗传算法和结合免疫算法,采用主函数调用各个算子来实现遗传算法的操作!
💻 M
字号:
%Genetic Algorithm with the Elitist Selection & Crossover--GAESC,optimizing Needle-in-a Haystack function
function GAESC()
clear all;
clc;
NC=2000;        %Max iteration generation
POPSIZE=100;    %population size
SUBLEN=30;      %subchromosome length
NUM_VAR=2;      %variable number,thus chromosome legth=SUBLEN*NUM_VAR
Pc=0.6;         %crossover probability
Pkc=0.2;        %Elitist-crossover probability
Pm=0.05;         %mutation probability
for v=1:1
P=round(rand(POPSIZE,SUBLEN*NUM_VAR));  %initialize population
Obj=CalObj(P,NUM_VAR);                  %calculate population object function value
Fit=CalFit(Obj);                        %calculate individual fitness in population
[Elite_fit,index]=max(Fit);             %find out the max fitness of the first generation
ObjMax=Obj(index);
Elite=P(index,:);                       %reserve the best individual to Elite
t=1;                                    %iteration generation
tic                                     %testtimer start
while t<=NC                             %start iteration
   P=Reproduce1(P,Fit,POPSIZE);          %reproduction
   P=Crossover(P,Pc);                   %crossover
   %P=EliteCrossover(P,Elite,Pkc);       %elitist crossover
   P=Mutate(P,Elite_fit,Fit,Pm);        %mutation
   Obj=CalObj(P,NUM_VAR);               %calculate population object function value
   Fit=CalFit(Obj);                      %calculate individual fitness in population
   P=EliteReserved(P,Elite,Elite_fit,Fit);                                  %make elite reserved
   [Elite,Elite_fit,ObjMax]=EliteUpdate(P,Elite,Elite_fit,Fit,ObjMax,Obj);  %get the best individual with max fitness
   %Fit_avg(t)=sum(Fit)/POPSIZE;
   J(t)=ObjMax;
   %J_online(t)=sum(Fit_avg)/t;
   %Javg(t)=sum(J)/t;
   t=t+1;                               % t plus 1,start next interation
end                                     % end interation
toc
M=find(J>=3689.9999,1)
format long,MaxObjValue=ObjMax
interation=1:NC;
%plot(interation,J,interation,Javg,'red',interation,J_online,'green'),grid
end

%************subfunction definition below***********
function decimal=DecodeChrom(chrom,num_subchrom)  %decode chromosome
len=length(chrom);
subl=len/num_subchrom;
point=len;
for i=num_subchrom:-1:1
    decimal(i)=0;
    k=0;
    while point>(i-1)*subl     
        decimal(i)=decimal(i)+chrom(point)*2^k;
        k=k+1;
        point=point-1;
    end
end

function obj=CalObj(pop,num_var)         %calculate populatin object function value
umin=-5.12;umax=5.12;
a=3.0;b=0.05;
[popsize,len]=size(pop);
subl=len/num_var;
for i=1:popsize
    temp=DecodeChrom(pop(i,:),num_var);
    x=umin+(umax-umin)*temp(1)/(2^subl-1.0);
    y=umin+(umax-umin)*temp(2)/(2^subl-1.0);
    if (x>=-5.12) && (x<0)
        obj(i)=(a/(b+x^2+y^2))^2+(x^2+y^2)^2;
    else if (x>=0) && (x<=5.12)
        obj(i)=90+(a/(b+x^2+y^2))^2+(x^2+y^2)^2;
        end
    end
end
    
function fit=CalFit(obj)       %calculate fitness
fit=obj;

function newpop=Reproduce(pop,fit,popsize)   %reproduction operation,proportional selcetion
sum_fit=sum(fit);
ps=fit/sum_fit;
for i=1:popsize-1
    ps(i+1)=ps(i+1)+ps(i);
end
for i=1:popsize
  index=1;
  p=rand();
  while p>ps(index)
      index=index+1;
  end
  newpop(i,:)=pop(index,:);
end

function newpop=Reproduce1(pop,fit,popsize)   %reproduction operation,remainder stochastic sampling with replacement
sigmafit=sum(fit);
ps=fit/sigmafit;
Ni=fix(popsize*ps);
sigmaNi=sum(Ni);
num=1;
for i=1:popsize
    pointer=1;
    while pointer<=Ni(i)
    newpop(num,:)=pop(i,:);
    num=num+1;
    pointer=pointer+1;
    end
end

newfit=fit-sigmaNi*sigmafit/popsize;
sigmafit=sum(newfit);
ps=newfit/sigmafit;
for i=1:popsize-1
    ps(i+1)=ps(i+1)+ps(i);
end
for i=num:popsize
  index=1;
  p=rand();
  while p>ps(index)
      index=index+1;
  end
  newpop(i,:)=pop(index,:);
end
        
function newpop=Crossover(pop,pc)      %crossover operation,2 points crossover
[popsize,len]=size(pop);
index=1:popsize;
for i=1:popsize                      
    point=ceil(rand()*(popsize-i));
    temp=index(i);
    index(i)=index(point+i);
    index(point+i)=temp;
end
for i=1:2:popsize-1
    p=rand();
    if p<pc
        p1=ceil(rand()*len);    %crossover point 1
        p2=ceil(rand()*len);    %crossover point 2
        direct=(p1<=p2)*1+(p1>p2)*(-1);
        for j=p1:direct:p2
            temp=pop(index(i),j);
            pop(index(i),j)=pop(index(i+1),j);
            pop(index(i+1),j)=temp;
        end
    end
end
newpop=pop;

function newpop=EliteCrossover(pop,elite,pkc)     %elite-crossover
[popsize,len]=size(pop);
for i=1:popsize
    p=rand();
    if p<pkc
        p1=ceil(rand()*len);    %crossover point 1
        p2=ceil(rand()*len);    %crossover point 2
        direct=(p1<=p2)*1+(p1>p2)*(-1);
        for j=p1:direct:p2
            pop(i,j)=elite(j);
        end
    end
end
newpop=pop;

function newpop=Mutate(pop,elite_fit,fit,pm)      %mutation operation,bit mutate
[popsize,len]=size(pop);
for i=1:popsize
    if fit(i)<=0.95*elite_fit
        pmm=pm;
    else
        pmm=0.1*pm;
        %pmm=pm;
    end
    for j=1:len
        p=rand();
        if p<pmm
            if pop(i,j)==0
                pop(i,j)=1;
            else
                pop(i,j)=0;
            end
        end
    end
end
newpop=pop;

function newpop=EliteReserved(pop,elite,elite_fit,fit)  %elitist reserved
newpop=pop;
if find(fit==elite_fit)
    ;
else
    [fit_min,index_min]=min(fit);
    newpop(index_min,:)=elite;
end

function [elite,elite_fit,obj_max]=EliteUpdate(pop,elite,elite_fit,fit,obj_max,obj); %update elite with max fitness
[fit_max,index_max]=max(fit);
if elite_fit>=fit_max
    elite=elite;
    elite_fit=elite_fit;
    obj_max=obj_max;
else
    elite_fit=fit_max;
    elite=pop(index_max,:);
    obj_max=obj(index_max);
end

⌨️ 快捷键说明

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