如何在我的遗传算法中加入for循环?

时间:2017-10-29 20:59:47

标签: matlab

我正在尝试一种遗传算法,试图在100代的过程中找到优化的解决方案。我的代码将找到2代。我试图找到一种方法来添加一个for循环,以便在100代的整个过程中重复这个过程。

clc,clear
format shorte
k=80;
mu=50;
s=.05;
c1=k+(4/3)*mu;
c2=k-(2/3)*mu;

for index=1:50 %6 traits generated at random 50 times
    a=.005*rand-.0025; 
    b=.005*rand-.0025;
    c=.005*rand-.0025;
    d=.005*rand-.0025;
    e=.005*rand-.0025;
    f=.005*rand-.0025;

    E=[c1,c2,c2,0,0,0; 
       c2,c1,c2,0,0,0;
       c2,c2,c1,0,0,0;
       0,0,0,mu,0,0;
       0,0,0,0,mu,0;
       0,0,0,0,0,mu];
    S=[a;d;f;2*b;2*c;2*e]; 

    G=E*S; 
    g=G(1); 
    h=G(2);
    i=G(3);
    j=G(4);
    k=G(5);
    l=G(6);

    F=[(g-h)^2+(h-i)^2+(i-g)^2+6*(j^2+k^2+l^2)]; 
    PI=((F-(2*s^2))/(2*s^2))^2; %cost function, fitness assessed

    RP(index,:)=[a,b,c,d,e,f,PI]; %initial random population
end

Gen1=sortrows(RP,7,{'descend'}); %the initial population ranked

%for loop 1:100 would start here 
children=zeros(10,6); %10 new children created from the top 20 parents
babysitter=1;
for parent=1:2:20
    theta=rand(1);
    traita=theta*Gen1(parent,1)+(1-theta)*Gen1(1+parent,1);
    theta=rand(1);
    traitb=theta*Gen1(parent,2)+(1-theta)*Gen1(1+parent,2);
    theta=rand(1);
    traitc=theta*Gen1(parent,3)+(1-theta)*Gen1(1+parent,3);
    theta=rand(1);
    traitd=theta*Gen1(parent,4)+(1-theta)*Gen1(1+parent,4);
    theta=rand(1);
    traite=theta*Gen1(parent,5)+(1-theta)*Gen1(1+parent,5);
    theta=rand(1);
    traitf=theta*Gen1(parent,6)+(1-theta)*Gen1(1+parent,6);

    children(babysitter,:)=[traita,traitb,traitc,traitd,traite,traitf];
    babysitter=babysitter+1;
end

top10parents=Gen1(1:10,1:6);
Gen1([11:50],:)=[]; %bottom 40 parents removed

for newindex=1:30 %6 new traits generated randomly 30 times
    newa=.005*rand-.0025; 
    newb=.005*rand-.0025; 
    newc=.005*rand-.0025;
    newd=.005*rand-.0025;
    newe=.005*rand-.0025;
    newf=.005*rand-.0025;
    newgenes(newindex,:)=[newa,newb,newc,newd,newe,newf];
end

nextgen=[top10parents;children;newgenes]; %top 10 parents, the 10 new children, and the new 30 random traits added into one new matrix

for new50=1:50
    newS=[nextgen(new50,1);nextgen(new50,4);nextgen(new50,6);2*nextgen(new50,2);2*nextgen(new50,3);2*nextgen(new50,5)];

    newG=E*newS; 
    newg=newG(1); 
    newh=newG(2);
    newi=newG(3);
    newj=newG(4);
    newk=newG(5);
    newl=newG(6);

    newF=[(newg-newh)^2+(newh-newi)^2+(newi-newg)^2+6*(newj^2+newk^2+newl^2)]; %von-Mises criterion
    newPI=((newF-(2*s^2))/(2*s^2))^2; %fitness assessed for new generation

    PIcolumn(new50,:)=[newPI];
end

nextgenwPI=[nextgen,PIcolumn]; %pi column added to nextgen matrix

Gen2=sortrows(nextgenwPI,7,{'descend'}) %generation 2 ranked

所以我的问题是,为了使for循环工作,我怎样才能让世代计算自己。我已经找到了答案,而且我已经读过,自己计算矩阵并不是一个好主意。但是,我不知道如何做到这一点,除了找到一种方法,使genN矩阵在第一代后以1为增量向上计数。有什么建议吗?

谢谢

0 个答案:

没有答案