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

📄 niche_2.m

📁 一个经典的基于排挤机制的小生境遗传算法程序
💻 M
字号:
%小生境遗传算法主程序
function f=NicheSGA_4;
OptimizationStyle='Min';VarietyNumber=2;Xmin=[-10,-10];Xmax=[10,10];PopulationSize=100;GenotypeLength=20;MaxGeneration=500;
Pc=0.9;Pm=0.01;N=PopulationSize/2;L=0.5;Penalty=10^(-30);
initpop=randint(PopulationSize,VarietyNumber*GenotypeLength+VarietyNumber+2);
oldpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,initpop);
[B,index]=sort(oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2));
oldpop=[oldpop(index(:),:)];
temp1=oldpop(PopulationSize-N+1:PopulationSize,:);
k=1;
while k<=MaxGeneration
    newpop=selection(VarietyNumber,PopulationSize,GenotypeLength,oldpop);
    randorder=randperm(PopulationSize);
    for i=1:2:(PopulationSize-1)
        parent1=newpop(randorder(i),:);
        parent2=newpop(randorder(i+1),:);
        [child1,child2]=crossover(VarietyNumber,GenotypeLength,parent1,parent2,Pc);
        newpop(randorder(i),:)=child1;
        newpop(randorder(i+1),:)=child2;
    end
    for i=1:PopulationSize
        newpop(i,:)=mutation(VarietyNumber,GenotypeLength,Pm,newpop(i,:));
    end
    newpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,newpop);
    faveragevalue(k)=mean(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
    if (OptimizationStyle=='Max')
        optimization(k,VarietyNumber+1)=max(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
    else
        optimization(k,VarietyNumber+1)=min(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
    end
    [tf,index]=ismember(optimization(k,VarietyNumber+1),newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
    optimization(k,1:VarietyNumber)=newpop(index,VarietyNumber*GenotypeLength+1:VarietyNumber*GenotypeLength+VarietyNumber);
    temp2=[temp1' newpop']';
    temp2=niche(PopulationSize,VarietyNumber,GenotypeLength,N,L,Penalty,temp2);
    [B,index]=sort(temp2(:,VarietyNumber*GenotypeLength+VarietyNumber+2));
    temp2=[temp2(index(:),:)];
    temp1=temp2(PopulationSize+1:PopulationSize+N,:);
    oldpop=temp2(N+1:PopulationSize+N,:);
    k=k+1;
end
if (OptimizationStyle=='Max')
    optimizationf=max(optimization(:,VarietyNumber+1))
else
    optimizationf=min(optimization(:,VarietyNumber+1))
end
[tf,index]=ismember(optimizationf,optimization(:,VarietyNumber+1));
optimizationX=optimization(index,1:VarietyNumber)
temp1(N-(18-1):N,VarietyNumber*GenotypeLength+1:VarietyNumber*GenotypeLength+VarietyNumber+2)
x=temp1(N-(18-1):N,VarietyNumber*GenotypeLength+1);
y=temp1(N-(18-1):N,VarietyNumber*GenotypeLength+2);
z=temp1(N-(18-1):N,VarietyNumber*GenotypeLength+VarietyNumber+1);
plot3(x,y,z,'k.');
axis([-10,10,-10,10,-188,-186]);
grid on;

%选择(复制)算子程序
function newpop=selection(VarietyNumber,PopulationSize,GenotypeLength,oldpop);
totalfit=sum(oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2));
if (totalfit>1e-15)
    prob=oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2)/totalfit;
    prob=cumsum(prob);
    randnum=sort(rand(PopulationSize,1));
    oldorder=1;
    neworder=1;
    while neworder<=PopulationSize
          if (randnum(neworder)<prob(oldorder))
              newpop(neworder,:)=oldpop(oldorder,:);
              neworder=neworder+1;
          else 
              oldorder=oldorder+1;
          end
    end
else
    newpop=oldpop;
end

%交叉算子程序
function [child1,child2]=crossover(VarietyNumber,GenotypeLength,parent1,parent2,Pc);
if(rand<Pc)
    cpoint=round(rand*(VarietyNumber*GenotypeLength-2))+1;
    child1=[parent1(1:cpoint) parent2(cpoint+1:VarietyNumber*GenotypeLength+VarietyNumber+2)];
    child2=[parent2(1:cpoint) parent1(cpoint+1:VarietyNumber*GenotypeLength+VarietyNumber+2)];
else
    child1=parent1;
    child2=parent2;
end

%变异算子程序
function child=mutation(VarietyNumber,GenotypeLength,Pm,parent);
if(rand<Pm)
    mpoint=round(rand*(VarietyNumber*GenotypeLength-1))+1;
    child=parent;
    child(mpoint)=1-parent(mpoint);
else
    child=parent;
end

%小生境子程序
function newpop=niche(PopulationSize,VarietyNumber,GenotypeLength,N,L,Penalty,oldpop);
newpop=oldpop;
for i=1:PopulationSize+N-1
    for j=i+1:PopulationSize+N
        s=0;
        for k=1:VarietyNumber
            s=s+(oldpop(i,VarietyNumber*GenotypeLength+k)-oldpop(j,VarietyNumber*GenotypeLength+k))^2;
        end
        d(i,j)=sqrt(s);
        if (d(i,j)<L)
            if (oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)>=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+2))
                newpop(j,VarietyNumber*GenotypeLength+VarietyNumber+2)=Penalty;
            else
                newpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=Penalty;
            end
        end
    end
end

%解码及求适应度程序
function decodedpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,pop);
decodedpop=pop;
for j=1:PopulationSize
for i=1:VarietyNumber
    decodedpop(j,VarietyNumber*GenotypeLength+i)=(2.^(size(pop(j,(((i-1)*GenotypeLength)+1):(i*GenotypeLength)),2)-1:-1:0)*...
    pop(j,(((i-1)*GenotypeLength)+1):(i*GenotypeLength))')'*(Xmax(i)-Xmin(i))/(2.^GenotypeLength-1)+Xmin(i);         
end
end
for i=1:PopulationSize
    decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1)=functionf(decodedpop(i,(VarietyNumber*GenotypeLength+1):(VarietyNumber*GenotypeLength+VarietyNumber)));
    if (OptimizationStyle=='Max')
        if (decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1)>0)
            decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=1+0.05*decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1);
        else
            decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=1;
        end
    else
        if (decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1)<0)
            decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=1-0.05*decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1);
        else
            decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=1;
        end
    end
end

%计算目标函数值程序
function f=functionf(x);
f=(1*cos((1+1)*x(1)+1)+2*cos((2+1)*x(1)+2)+3*cos((3+1)*x(1)+3)+4*cos((4+1)*x(1)+4)+5*cos((5+1)*x(1)+5))*...
  (1*cos((1+1)*x(2)+1)+2*cos((2+1)*x(2)+2)+3*cos((3+1)*x(2)+3)+4*cos((4+1)*x(2)+4)+5*cos((5+1)*x(2)+5));

⌨️ 快捷键说明

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