%genetický algoritmus pro výpočet odchylky kvadrátů, založeno na laboratorních cvičeních z předmětu FEAL - evoluční algoritmy
function [posunVyslednySSD, minValueSSD] = evolucneSSD(obraz1, obraz2, pocetjedincu, pocetreplikaci, pst_mutace)
maximumiteraci=50;                                                          %po kolika iteracích se provede nové roztřídění, není-li výsledek
jedinec=zeros(pocetjedincu,2);                                              %definování počátečních jedinců
kvalita=zeros(pocetjedincu,1);                                              %definování počáteční kvality           
for i=1:pocetjedincu                                                        %pro každého jedince
    jedinec(i,:)=randi([-50,50],1,2);                                       %pro jedince je generována dvojice čísel z intervalu
    kvalita(i,1)=kritSSDgenetic(jedinec(i,:),obraz1,obraz2);                %je volána kriteriální funkce jejímž výstupem je kvalita jedince
end
staraelita=min(kvalita);                                                    %určena nejvyšší kvalita 
iterace=1;                                                                  %definováni první iterace
while iterace<=maximumiteraci                                               %pokud nebylo dosaženo maxima iterací        
    [elita_kvalita elita_index]=min(kvalita);                               %je vybrán nejlepší jedinec
    elita_hodnoty=jedinec(elita_index,:);                                   %nejlepší jedince postupuje do další generace
    jedinec=soubojSSD(jedinec,kvalita);                                     %je provedena selekce souboje, volání funkce souboj, jejímž výstupem je úspěšnější jedinec
    jedinec=mutaceSSD(jedinec,pst_mutace);                                  %provedení mutace, volání funkce mutace    
        % Přenos elitního jedince
    for i=1:min(pocetjedincu,pocetreplikaci);                               %předání elitního jedince, dle počtu replikací, ten je standardně roven jedné
        jedinec(i,:)=elita_hodnoty;                                         %předání elitního jedince do další generace   
    end
     % Výpočet kvalit aktuální populaci
    for i=1:pocetjedincu;                                                   %pro každého jedince
        kvalita(i,1)=kritSSDgenetic(jedinec(i,:),obraz1,obraz2);            %je stanovena kvalita, na základě kriteriální funkce   
    end
     % Pokud se nezlepšila kvalita nejlepšího jedince, je započtena další iterace   
    if staraelita==elita_kvalita;                                           %pokud se nejepší jedinci rovnají, nedošlo tedy ke zlepšení
        iterace=iterace+1;                                                  %je navýšena iterace
    end
    staraelita=elita_kvalita;                                               %uložení elity
 end
 minValueSSD=min(min(kvalita));                                             %nalezení nejlepšího jedince ve výsledné populace   
 maxKvalitaSSD=(kvalita==min(min(kvalita)));                                %hodnota nejvyšší kvality   
 posunVyslednySSD=jedinec(maxKvalitaSSD,:);                                 %získání nejlepšího jedince    
