%algoritmus světlušky pro výpočet odchylky kvadrátů, založeno na laboratorních cvičeních z předmětu FEAL - evoluční algoritmy
function [posunXsvetluskySSD,posunYsvetluskySSD,hodnotaOdch] = svetluskySSD(obraz1,obraz2,n_ff,alpha,gamma,beta0,delta)
fcn_handle=@kritSSDfire;                                                    %jako kriteriální funkce je zvolena odchylka kvadrátů
xmin=-50;                                                                   %vymezení operačního prostoru kriteriální funkce
xmax=50;                                                                    %vymezení operačního prostoru kriteriální funkce    
ymin=-50;                                                                   %vymezení operačního prostoru kriteriální funkce
ymax=50;                                                                    %vymezení operačního prostoru kriteriální funkce
% generovani pocatecni populace
x_co=round(xmin+rand(n_ff,1)*(xmax-xmin));                                  %nahodne generovane souradnice x svetlusky
y_co=round(ymin+rand(n_ff,1)*(ymax-ymin));                                  %nahodne generovane souradnice y svetlusky        
z_co=fcn_handle(x_co,y_co,obraz1,obraz2);                                   %získání funkční hodnoty světlušky    
x_temp=x_co;                                                                %zapis do pracovních promenných
y_temp=y_co;                                                                %zapis do pracovních promenných
z_temp=z_co;                                                                %zapis do pracovních promenných    
for ii=1:100                                                                 %pro stanovený počet iterací
    z_temp=fcn_handle(x_temp,y_temp,obraz1,obraz2);                         %získání funkční hodnoty světlušky
    [jas_temp index]=sort(z_temp,'descend');                                %seřazení svetlušek od nejlepší po nejhorší
    x_temp=x_temp(index);                                                   %seřazení souřadnic
    y_temp=y_temp(index);                                                   %seřazení souřadnic
    x_0=x_temp;                                                             %uložení do pracovní proměnné
    y_0=y_temp;                                                             %uložení do pracovní proměnné
    jas_0=jas_temp;                                                         %aktuální řešení pro danou iteraci
    for ind=1:length(x_temp)                                                %pro všechny světlušky
        for ind2=1:length(x_temp)                                           %je brána každá dvojice
            if jas_0(ind)>jas_0(ind2)                                       %je provedeno srovnání jasů, horší světlušce jsou přporítány nové souřadnice
                r=sqrt(((x_temp(ind2))-(x_temp(ind)))^2+((y_temp(ind2))-(y_temp(ind)))^2);%výpočet vzdálenosti mezi světluškami
                x_temp(ind)=round(x_temp(ind)+beta0*exp(-gamma*r^2)*(x_temp(ind2)-x_temp(ind))+alpha*(rand(1)-0.5)); %výpočet nové souřadnice v ose x                  
                y_temp(ind)=round(y_temp(ind)+beta0*exp(-gamma*r^2)*(y_temp(ind2)-y_temp(ind))+alpha*(rand(1)-0.5)); %výpočet nové souřadnic v ose y
            end
        end
    end
    x_temp(x_temp>xmax)=xmax;                                               %ošetření aby světlušky neopustily operační prostor ktiteriální funkce
    x_temp(x_temp<xmin)=xmin;                                               %ošetření aby světlušky neopustily operační prostor ktiteriální funkce
    y_temp(y_temp>ymax)=ymax;                                               %ošetření aby světlušky neopustily operační prostor ktiteriální funkce
    y_temp(y_temp<ymin)=ymin;                                               %ošetření aby světlušky neopustily operační prostor ktiteriální funkce
    alpha=alpha*delta;                                                      % uprava miry nahodného pohybu pohybu světlušek
end
posunXsvetluskySSD=x_0(end);                                                %výběr nejlepšího jedince
posunYsvetluskySSD=y_0(end);                                                %výběr nejlepšího jedince
hodnotaOdch=jas_0(end);                                                     %hodnota kosinového kritéria
