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

📄 mosga2_1.m

📁 基于NSGA-II方法的多目标遗传算法程序,本程序为通用包,可自行修改.
💻 M
字号:
%多目标优化排序选择法主程序
function f=MOSGA2_1;
OptimizationStyle='Min';VarietyNumber=2;Xmin=[1,1];Xmax=[4,2];PopulationSize=100;GenotypeLength=5;MaxGeneration=30;Pc=0.9;Pm=0.01;
initpop=randint(PopulationSize,VarietyNumber*GenotypeLength+VarietyNumber+3);
initpop(:,VarietyNumber*GenotypeLength+VarietyNumber+3)=1;
oldpop=decode(VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,initpop);
oldpop=pareto(OptimizationStyle,VarietyNumber,PopulationSize,GenotypeLength,oldpop);
Generation=1;
while Generation<=MaxGeneration
    newpop=selection(PopulationSize,VarietyNumber,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,newpop(i,:),Pm);
    end
    newpop=decode(VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,newpop);
    newpop=pareto(OptimizationStyle,VarietyNumber,PopulationSize,GenotypeLength,newpop);
    oldpop=newpop;
    Generation=Generation+1;
end
x=newpop(:,VarietyNumber*GenotypeLength+1);
y=newpop(:,VarietyNumber*GenotypeLength+2);
f1=newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1);
f2=newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2);
subplot(2,2,1);
plot(x,y,'k.');
axis('square');
xlabel('x');
ylabel('y');
axis([1,4,1,3]);
subplot(2,2,2);
plot(f1,f2,'k.');
axis('square');
xlabel('f1');
ylabel('f2');
axis([0,4,0,4]);
[x,y]=meshgrid([1:0.05:4]);
f1=x.^2/4;
f2=x.*(1-y)+5;
subplot(2,2,3);
plot3(x,y,f1,'r',x,y,f2,'y');
x=1:0.1:4;
y=2;
for i=1:30
    for j=1:1
        [f3(i,j),f4(i,j)]=functionf([x(i),y(j)]);
    end
end
subplot(2,2,4);
plot(f3,f4,'k.');
axis('square');
xlabel('f1');
ylabel('f2');
axis([0,4,0,4]);

%最优个体排序子程序
function newpop=pareto(OptimizationStyle,VarietyNumber,PopulationSize,GenotypeLength,oldpop);
for i=1:PopulationSize
    temp1=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1);
    temp2=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2);
    for j=i+1:PopulationSize
        temp3=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+1);
        temp4=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+2);
        if (OptimizationStyle=='Max')
            if (temp1>=temp3&temp2>=temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
            elseif (temp1<=temp3&temp2<temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
            elseif (temp1<temp3&temp2<=temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
            end 
        else
            if (temp1<=temp3&temp2<=temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
            elseif (temp1>=temp3&temp2>temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
            elseif (temp1>temp3&temp2>=temp4)
                oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(i,VarietyNumber*GenotypeLength+VarietyNumber+3)&0;
                oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)=oldpop(j,VarietyNumber*GenotypeLength+VarietyNumber+3)&1;
            end
        end
    end
end
[tf,index]=sort(oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+3));
newpop=oldpop(index,:);
   
%选择(复制)算子程序
function newpop=selection(PopulationSize,VarietyNumber,GenotypeLength,oldpop);
nonzeronumber=sum(oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+3));
fitness(1:PopulationSize-nonzeronumber)=1;
fitness(PopulationSize-nonzeronumber+1:PopulationSize)=100;
totalfitness=sum(fitness);
prob=fitness/totalfitness;
prob=cumsum(prob);  
randnum=sort(rand(1,PopulationSize));
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

%交叉算子程序
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+3)];
    child2=[parent2(1:cpoint) parent1(cpoint+1:VarietyNumber*GenotypeLength+VarietyNumber+3)];
else
    child1=parent1;
    child2=parent2;
end

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

%解码程序
function decodedpop=decode(VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,pop);
decodedpop=pop;
for i=1:VarietyNumber
    decodedpop(:,VarietyNumber*GenotypeLength+i)=(2.^(size(pop(:,(((i-1)*GenotypeLength)+1):(i*GenotypeLength)),2)-1:-1:0)*...
    pop(:,(((i-1)*GenotypeLength)+1):(i*GenotypeLength))')'*(Xmax(i)-Xmin(i))/(2.^GenotypeLength-1)+Xmin(i);         
end
for i=1:PopulationSize
    [f1,f2]=functionf(decodedpop(i,(VarietyNumber*GenotypeLength+1):(VarietyNumber*GenotypeLength+VarietyNumber)));
    decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1)=f1;
    decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+2)=f2;
end

%计算目标函数值程序
function [f1,f2]=functionf(x);
f1=x(1)^2/4;
f2=x(1)*(1-x(2))+5;

⌨️ 快捷键说明

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