2 Mayıs 2015 Cumartesi

Evolutionary Strategies Module Homework



1.     FONKSİYON İÇİN ÇÖZÜMLER

MATLAB SCRİPT KODU:

function z = Pfunction(x,y)
    z = (4 - 2.1*x.^2 + x.^4/3).*x.^2 + x.*y +(-4+4*y.^2).*y.^2;
end

oldBest_Person=100;
for t=1:10
iteration=500;
Parent_No=10;
Child_No=5;
Gama=1;

fprintf('\n Parent_No=%d, Child_No=%d, İterasyon=%d, Gama=%d \n',Parent_No,Child_No,iteration,Gama);

    seed=t;
    for i=1:Parent_No               
    %Ebeveynler belirleniyor.
    P_X(i) = rand()*((rand()>0.5)*2-1)*3;
    P_Y(i) = rand()*((rand()>0.5)*2-1)*2;
    %Ebeveynlerin uygunluğu hesaplanıyor.
    P_Fitness(i)=Pfunction(P_X(i),P_Y(i));
    end
   
    for m=1:iteration
        S=0; %succes variable       
        k=1;       
        %Her bir ebeveynden çocuk üretme.      
        for i=1:Parent_No
            for j=1:Child_No
                % Move Hareket Miktarı Belirleniyor.
                Move_X = rand()*((rand()>0.5)*2-1)*Gama;
                Move_Y = rand()*((rand()>0.5)*2-1)*Gama;
               
                % Ebeveynlerden çocuklar üretiliyor.
                C_X(k) = P_X(i) + Move_X;
                C_Y(k) = P_Y(i) + Move_Y;
               
                %Sınırların dışına çıkılması engelleniyor.
                if C_X(k)<-3 || C_X(k)>3
                C_X(k) = rand()*((rand()>0.5)*2-1)*3;
                end       
                if C_Y(k)<-2 || C_Y(k)>2
                C_Y(k) = rand()*((rand()>0.5)*2-1)*2;
                end
               
                % Çocukların uygunluk değerleri hesaplanıyor.
                C_Fitness(k) = Pfunction(C_X(k),C_Y(k));
               
                % Succes değerinin belirlenmesi.
                if P_Fitness(i) > C_Fitness(k)
                    S = S+1;
                end
                k=k+1;
            end
        end
       
        % Çocukların uygunluk değerleri küçükten büyüğe sıralanıyor.
        C_F = sort(C_Fitness);        
        C_Fitness_Best= C_F(:,1:Parent_No); %En uygun çocuklar alınıyor.
       
        % En uygun çocukların sıralamasına uygun olarak X,Y değerleride sıralanıyor.
        for i=1:Parent_No
            for j=1:k-1
                if C_Fitness_Best(i) == C_Fitness(j)
                    C_Best_X(i) = C_X(j);
                    C_Best_Y(i) = C_Y(j);
                end
            end
        end
       
        SR = S/Child_No*Parent_No; %success rate
        if SR>0.2
            Gama=0.85*Gama;
        elseif SR<0.2
            Gama=Gama/0.85;
        end
       
        % En uygun çocuklar ve ebeveynler ile bir aile oluşturuluyor.
        F_Fitness = [C_Fitness_Best, P_Fitness];
        F_X = [C_Best_X, P_X];
        F_Y = [C_Best_Y, P_Y];
       
        % Bireylerin uygunluk değerleri küçükten büyüğe sıralanıyor.
        F_F = sort(F_Fitness);       
        F_Fitness_Best= F_F(:,1:Parent_No); %En iyi bireyler seçiliyor.
       
        % En iyi bireyler sıralamasına uygun olarak X,Y değerleride sıralanıyor.
        for i=1:Parent_No
            for j=1:2*Parent_No
                if F_Fitness_Best(i) == F_Fitness(j)
                    F_Best_X(i) = F_X(j);
                    F_Best_Y(i) = F_Y(j);
                end
            end
        end
       
        % En uygun bireyler yeni ebeveynler olarak seçiliyor.
        P_X = F_Best_X;
        P_Y = F_Best_Y;
        P_Fitness = F_Fitness_Best;
       
        % Yeni ebevenylerin en iyisi belirleniyor.                     
        P_F =  sort(P_Fitness);
        Best_Person(m) = P_F(1);
        % Yakınsama grafiği için önceki en iyi Ebeveyn ile kıyaslama yapılıyor.
        if Best_Person(m) < oldBest_Person
        Yakinsama_iterasyonu = m;
        oldBest_Person = Best_Person(m);
        end       
    end
   
    % Yeni ebevenylerin en iyisinin X Y değerleri bulunuyor.
    G_P = Best_Person(m);
    for i=1:Parent_No
        if G_P == P_Fitness(i)
            G_P_X = P_X(i);
            G_P_Y = P_Y(i);
        end
    end

    % Her bir Seed değeri için sonuçlar Ekrana Yazdırılıyor.
    fprintf('Seed %d, G_P = %f, GlobalX = %f, GlobalY = %f \n',seed,G_P,G_P_X,G_P_Y);
end

% Fonksiyon Çizimi
dx = 0.05; %Çizim Sıklığı
Xlimits = -2:dx:2; % Çizim X ekseni sınırları
Ylimits = -1.5:dx:1.5; % Çizim Y ekseni sınırları
[X,Y] = meshgrid(Xlimits,Ylimits);
Z = Pfunction(X,Y);
subplot(211); surf(Y,X,-Z);
grid on;
xlabel('x');
ylabel('y');
zlabel('z');
hold on

%bulunan f değerinin çizilen grafik üzerince işaretlenmesi.
subplot(211); plot3(G_P_Y,G_P_X,-G_P, 'b*');

%Yakınsama grafiğinin çizdirilmesi.
it=1:iteration;
subplot(212); plot(it,Best_Person),xlabel('iterasyon sayısı'), ylabel('Global_Z')
hold on;
plot(Yakinsama_iterasyonu,Best_Person(Yakinsama_iterasyonu),'b*')
grid on;


PROGRAMIN KOŞTURULMASI:

Örnek:1

Yakınsama Grafiği: 

Örnek:2 

Yakınsama Grafiği: 

10 Farklı Seed Değeri İçin Sonuçlar:



2.     FONKSİYON İÇİN ÇÖZÜMLER

MATLAB SCRİPT KODU:

function z = Pfunction2(x,y)
z=-( (sin(x) .* (sin((1 * x.^2)/pi)).^20) + (sin(y) .* (sin((2 * y.^2)/pi)).^20) );
end

oldBest_Person=100;
for t=1:1
iteration=1000;
Parent_No=20;
Child_No=10;
Gama=1;

fprintf('\n Parent_No=%d, Child_No=%d, İterasyon=%d, Gama=%d \n',Parent_No,Child_No,iteration,Gama);

    seed=t;
    for i=1:Parent_No               
    %Ebeveynler belirleniyor.
    P_X(i) = rand()*pi;
    P_Y(i) = rand()*pi;
    %Ebeveynlerin uygunluğu hesaplanıyor.
    P_Fitness(i)=Pfunction2(P_X(i),P_Y(i));
    end
   
    for m=1:iteration
        S=0; %succes variable       
        k=1;
       
        %Her bir ebeveynden çocuk üretme.      
        for i=1:Parent_No
            for j=1:Child_No
                % Move Hareket Miktarı Belirleniyor.
                Move_X = rand()*((rand()>0.5)*2-1)*Gama;
                Move_Y = rand()*((rand()>0.5)*2-1)*Gama;
               
                % Ebeveynlerden çocuklar üretiliyor.
                C_X(k) = P_X(i) + Move_X;
                C_Y(k) = P_Y(i) + Move_Y;
               
                %Sınırların dışına çıkılması engelleniyor.
                if C_X(k)<-3 || C_X(k)>3
                C_X(k) = rand()*pi;
                end       
                if C_Y(k)<-2 || C_Y(k)>2
                C_Y(k) = rand()*pi;
                end
                
                % Çocukların uygunluk değerleri hesaplanıyor.
                C_Fitness(k) = Pfunction2(C_X(k),C_Y(k));
               
                % Succes değerinin belirlenmesi.               
                if P_Fitness(i) > C_Fitness(k)
                    S = S+1;
                end
                k=k+1;
            end
        end
       
        % Çocukların uygunluk değerleri küçükten büyüğe sıralanıyor.
        C_F = sort(C_Fitness);        
        C_Fitness_Best= C_F(:,1:Parent_No); %En uygun çocuklar alınıyor.
       
        % En uygun çocukların sıralamasına uygun olarak X,Y değerleride sıralanıyor.
        for i=1:Parent_No
            for j=1:k-1
                if C_Fitness_Best(i) == C_Fitness(j)
                    C_Best_X(i) = C_X(j);
                    C_Best_Y(i) = C_Y(j);
                end
            end
        end
       
        SR = S/Child_No*Parent_No; %success rate
        if SR>0.2
            Gama=0.85*Gama;
        elseif SR<0.2
            Gama=Gama/0.85;
        end
       
        % En uygun çocuklar ve ebeveynler ile bir aile oluşturuluyor.
        F_Fitness = [C_Fitness_Best, P_Fitness];
        F_X = [C_Best_X, P_X];
        F_Y = [C_Best_Y, P_Y];
       
        % Bireylerin uygunluk değerleri küçükten büyüğe sıralanıyor.
        F_F = sort(F_Fitness);       
        F_Fitness_Best= F_F(:,1:Parent_No); %En iyi bireyler seçiliyor.
       
        % En iyi bireyler sıralamasına uygun olarak X,Y değerleride sıralanıyor.
        for i=1:Parent_No
            for j=1:2*Parent_No
                if F_Fitness_Best(i) == F_Fitness(j)
                    F_Best_X(i) = F_X(j);
                    F_Best_Y(i) = F_Y(j);
                end
            end
        end
       
        % En uygun bireyler yeni ebeveynler olarak seçiliyor.
        P_X = F_Best_X;
        P_Y = F_Best_Y;
        P_Fitness = F_Fitness_Best;
       
        % Yeni ebevenylerin en iyisi belirleniyor.                   
        P_F =  sort(P_Fitness);
        Best_Person(m) = P_F(1);
        % Yakınsama grafiği için önceki en iyi Ebeveyn ile kıyaslama yapılıyor.
        if Best_Person(m) < oldBest_Person
        Yakinsama_iterasyonu = m;
        oldBest_Person = Best_Person(m);
        end       
    end
   
    % Yeni ebevenylerin en iyisinin X Y değerleri bulunuyor.
    G_P = Best_Person(m);
    for i=1:Parent_No
        if G_P == P_Fitness(i)
            G_P_X = P_X(i);
            G_P_Y = P_Y(i);
        end
    end 

    % Her bir Seed değeri için sonuçlar Ekrana Yazdırılıyor.
    fprintf('Seed %d, G_P = %f, GlobalX = %f, GlobalY = %f \n',seed,G_P,G_P_X,G_P_Y);
end

%fonksiyonun çizdirilmesi
[x,y]=meshgrid(0:0.05:pi,0:0.05:pi);
z=Pfunction2(x,y);
subplot(211); surf(x,y,z);
hold on

%bulunan f değerinin çizilen grafik üzerince işaretlenmesi.
subplot(211); plot3(G_P_X,G_P_Y,G_P, 'b*');

%Yakınsama grafiğinin çizdirilmesi.
it=1:iteration;
subplot(212); plot(it,Best_Person),xlabel('iterasyon sayısı'), ylabel('Global_Z')
hold on;
plot(Yakinsama_iterasyonu,Best_Person(Yakinsama_iterasyonu),'b*')
grid on;


PROGRAMIN KOŞTURULMASI:

Örnek:1

Yakınsama Grafiği: 

Örnek:2

Yakınsama Grafiği: 

10 Farklı Seed Değeri İçin Sonuçlar:

Related Posts Plugin for WordPress, Blogger...