【アルゴリズムを作る】Matlab遺伝アルゴリズムツールボックスgatbx小試験


これは2014年4月に他のブログで書いたCSDNのブログに転載したものです.
最近許先生はある先輩に多目的計画問題を解決する遺伝アルゴリズム(以下、多目的GAと略称する)を見せてもらい、フォーラムでイギリスのsheffield大学が開発したmatlab遺伝アルゴリズムツールボックスgatbxを見つけて、手を入れてみました.『Matlab遺伝アルゴリズムツールボックスと応用』(雷英傑ら編著、西安電子科学技術大学出版社)による2つのGAプログラムを添付する.もちろん、ツールボックスが実現できるマルチターゲットGAの問題はまだ探求中ですが、ツールボックスの機能は限られているに違いありません.複雑なアルゴリズムを実現するには、自分でコードを書く必要があるかもしれません.
1.単純遺伝アルゴリズム
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%program name:      
%time:2014/04/02
%input: 
%output:         、       、        (      )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

NIND=30;              %    (Numbe of individuals)
MAXGEN=30;            %      (Maximum number of generations)
NVAR=40;              %    
PRECI=1;              %        (Precision of variables)
GGAP=0.9;             %  (Generation gap)

Chrom=crtbp(NIND, NVAR*PRECI);  %      
gen=0; %    
for i=1:NIND %                 ,          target
    ObjV(i,1)=target(Chrom(i,:));
end

while gen
    FitnV=ranking(ObjV);                             %      (Assign fitness values)
    SelCh=select('sus', Chrom, FitnV, GGAP);         %  :   Chrom      GGAP   
    SelCh=recombin('xovsp', SelCh, 0.7);            %  
    SelCh=mut(SelCh);                                %  
    [m n]=size(SelCh);
    for i=1:m              %  Selch           
        ObjVSel(i,1)=target(SelCh(i,:));
    end
    %   :                      ,         
    [Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel);     
    gen=gen+1;                                 %      
    trace(gen,1)=min(ObjV);                    %        ,                     
    trace(gen,2)=sum(ObjV)/length(ObjV);       %        ,               
end

[Result, I]=min(ObjV);  
Result   %         
Chrom(I,:)    %         

plot(trace(:,1));   %           ,        ,         
hold on;                  %                        
plot(trace(:,2),'-.');
grid;
legend('    ','       ')

2.多目的計画問題の遺伝アルゴリズム(並列選択法)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%program name:         (     )
%time:2014/04/04
%input: 
%output:         、       、        (      )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

NIND=100;
MAXGEN=50;
NVAR=2;
PRECI=20;
GGAP=0.9;
trace1=[];trace2=[];trace3=[]; %    

%       (Build field descriptor)
FieldD=[rep([PRECI],[1,NVAR]);[1,1;4,2];rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI);
v=bs2rv(Chrom,FieldD);         %         ,v             
gen=1;

while gen
[NIND,N]=size(Chrom);         %           、    
M=fix(NIND/2);         %  ,M            
ObjV1=myf1(v(1:M,:)); %               (     myf1)     FitnV1=ranking(ObjV1); %     
SelCh1=select('sus',Chrom(1:M,:),FitnV1,GGAP); %  
ObjV2=myf2(v((M+1):NIND,:)); %               (     myf2)    
FitnV2=ranking(ObjV2);
SelCh2=select('sus',Chrom((M+1):NIND,:),FitnV2,GGAP);
SelCh=[SelCh1;SelCh2]; %     
SelCh=recombin('xovsp',SelCh,0.7); %  
Chrom=mut(SelCh); %  
v=bs2rv(Chrom,FieldD);
trace1(gen,1)=min(myf1(v)); %    
trace1(gen,2)=sum(myf1(v))/length(myf1(v));
trace2(gen,1)=min(myf2(v));
trace2(gen,2)=sum(myf2(v))/length(myf2(v));
trace3(gen,1)=min(myf1(v)+myf2(v));
trace3(gen,2)=sum(myf1(v))/length(myf1(v))+sum(myf2(v))/length(myf2(v));
gen=gen+1;
end

[Result, I]=min(myf1(v)+myf2(v));
Result %         
Chrom(I,:) %         

figure(1); %      (myf1)         
plot(trace1(:,1));hold on;plot(trace1(:,2),'-.');
plot(trace1(:,1),'.');plot(trace1(:,2),'.');%  
grid;legend('    ','       ')
xlabel('    ');ylabel('     ');

figure(2); %      (myf2)         
plot(trace2(:,1));hold on;plot(trace2(:,2),'-.');
plot(trace2(:,1),'.');plot(trace2(:,2),'.');
grid;legend('    ','       ')
xlabel('    ');ylabel('     ');

figure(3); %                
plot(trace3(:,1));hold on;plot(trace3(:,2),'-.');
plot(trace3(:,1),'.');plot(trace3(:,2),'.');
grid;legend('    ','       ')
xlabel('    ');ylabel('     ');

figure(4); %          
plot(myf1(v));hold on;plot(myf2(v),'.-.');
grid;legend('       ','       ');