clc() // Nettoyage l'espace de travail
clear // Nettoyage toutes les variables en mémoire
getd // Mise en mémoire de toutes les fonctions se situant dans le répertoire de travail
// ===== PARAMETRES DE L'ALGORITHME ===== //
Bornes=[-10 10 ; -10 10 ; -10 10 ; -10 10] // Bornes de l'espace des phases
NbAbeilles=50 // Nombre total d'abeilles
NbDeplacements=999 // Nombre total de déplacements des abeilles
Phi0=0.6 // Paramètre relatif au terme d'inertie pour le déplacement des abeilles
// ===== INITIALISATION ===== //
DimN=size(Bornes,1) // Détermination de la dimension de l'espace des phases
Vitesse(:,2)=(Bornes(:,2)-Bornes(:,1))/2 // Définition de la vitesse maximale (au sens algébrique)
Vitesse(:,1)=-Vitesse(:,2) // Définition de la vitesse minimale (au sens algébrique)
for i=1:NbAbeilles
    PositionAbeille(:,i)=rand(DimN,1).*(Bornes(:,2)-Bornes(:,1))+Bornes(:,1) // Nouvelle position d'une abeille
    VitesseAbeille(:,i)=rand(DimN,1).*(Vitesse(:,2)-Vitesse(:,1))+Vitesse(:,1) // Nouvelle vitesse d'une abeille
    FCoutAbeille(:,i)=RosenbrockFunction(PositionAbeille(:,i)) // ou F=SphereFunction(X) // Evaluation de la fonction coût à la position actuelle
    PosOptiAbeille(:,i)=PositionAbeille(:,i) // La position optimale de l'abeille en cours
    FCOptiAbeille(:,i)=FCoutAbeille(:,i) // La fonction coût associée à la position optimale de l'abeille en cours
end
FOptimum=min(FCOptiAbeille) // Recherche de la position optimale du groupe d'abeilles
Indice=find(FCOptiAbeille==FOptimum) // Recherche du numéro de l'abeille la mieux positionnée
XOptimum(:,1)=PosOptiAbeille(:,Indice) // La position de l'abeille la mieux placée
// ===== CODE DE CALCUL ===== //
for j=1:NbDeplacements // Boucle sur l'ensemble des sauts à effectuer
    for i=1:NbAbeilles
        VitesseAbeille(:,i)=Phi0*VitesseAbeille(:,i)+(Phi0+1)^2/2*rand(DimN,1).*(PosOptiAbeille(:,i)-PositionAbeille(:,i))+(Phi0+1)^2/2*rand(DimN,1).*(XOptimum(:,1)-PositionAbeille(:,i)) // Mise à jour de la vitesse de l'abeille en cours
        PositionAbeille(:,i)=PositionAbeille(:,i)+VitesseAbeille(:,i) // Mise à jour de la position de l'abeille en cours
        for p=1:DimN // Vérification que la nouvelle position est toujours dans le domaine de recherche
            if ( PositionAbeille(p,i) < Bornes(p,1) ) // Dépassement de la borne inférieure pour le paramètre p
                PositionAbeille(p,i)=Bornes(p,1) // Repositionnement de l'abeille sur le bord du domaine de recherche
                VitesseAbeille(p,i)=-0.5*VitesseAbeille(p,i) // Modification de la vitesse de l'abeille
            elseif ( Bornes(p,2) < PositionAbeille(p,i) ) // Dépassement de la borne supérieure pour le paramètre p
                PositionAbeille(p,i)=Bornes(p,2) // Repositionnement de l'abeille sur le bord du domaine de recherche
                VitesseAbeille(p,i)=-0.5*VitesseAbeille(p,i) // Modification de la vitesse de l'abeille
            end
        end
        FCoutAbeille(:,i)=RosenbrockFunction(PositionAbeille(:,i)) // ou F=SphereFunction(X) // Evaluation de la fonction coût à la position actuelle
        if ( FCoutAbeille(:,i) < FCOptiAbeille(:,i) ) // Test sur l'amélioration de l'optimum de l'abeille
            PosOptiAbeille(:,i)=PositionAbeille(:,i) // La position optimale de l'abeille en cours
            FCOptiAbeille(:,i)=FCoutAbeille(:,i) // La fonction coût associée à la position optimale de l'abeille en cours
            if ( FCoutAbeille(:,i) < FOptimum ) // Test sur l'amélioration de l'optimum du groupe d'abeilles
                XOptimum(:,1)=PositionAbeille(:,i) // La position optimale de l'abeille en cours
                FOptimum=FCoutAbeille(:,i) // La fonction coût associée à la position optimale de l'abeille en cours
            end
        end
    end
end
// ===== EDITION DES RESULTATS ===== //
disp('Jeu de paramètres trouvés :')
disp(XOptimum)
disp('Valeur de la fonction coût associée à l optimum : ')
disp(FOptimum)
