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
N=50 // Nombre total d'abeilles
T=999 // Nombre total d'itérations sur le déplacement des abeilles
Phi0=0.6 // Constante Phi0 de l'algorithme pour le terme d'inertie
// ===== INITIALISATION ===== //
DimP=size(Bornes,1) // Détermination de la dimension de l'espace des phases %
VitesseMax=(Bornes(:,2)-Bornes(:,1))/2 // Définition de la vitesse maximale des abeilles (au sens algébrique) %
VitesseMin=-VitesseMax // Définition de la vitesse minimale des abeilles (au sens algébrique) %
for i=1:N
    X(:,i)=rand(DimP,1).*(Bornes(:,2)-Bornes(:,1))+Bornes(:,1) // Nouvelle position de l'abeille i
    Vitesse(:,i)=rand(DimP,1).*(VitesseMax-VitesseMin)+VitesseMin // Nouvelle vitesse de l'abeille i
    F(:,i)=RosenbrockFunction(X(:,i)) // ou F=SphereFunction(X) // Evaluation de la fonction coût à la position actuelle
end
FOptimum=min(F) // Détermination de la meilleure fonction coût parmi l'ensemble des abeilles
Indices=find(F==FOptimum) // Recherche l'indice de la meilleure abeille
XOptimum=X(:,Indices) // Enregistrement de la position de la meilleure abeille
XOptiAbe=X // Position des optimum individuels de chaque abeille
FOptiAbe=F // Valeur de la fonction cout associée à la position des optimum individuels de chaque abeille
// ===== CODE DE CALCUL ===== //
for Indt=1:T
    for i=1:N
        Phi1=(Phi0+1)^2/2*rand(1,1) // Constante Phi1 de l'algorithme pour le terme de cognition
        Phi2=(Phi0+1)^2/2*rand(1,1) // Constante Phi2 de l'algorithme pour le terme social
        Vitesse(:,i)=Phi0*Vitesse(:,i)+Phi1*(XOptiAbe(:,i)-X(:,i))+Phi2*(XOptimum-X(:,i))
        X(:,i)=X(:,i)+Vitesse(:,i)
        for j=1:DimP // Est-on sorti du domaine de recherche ?
            if ( X(j,i)<Bornes(j,1) ) // Condition de sortie par la borne inférieure
                X(j,i)=Bornes(j,1) // On ramène l'abeille au bord du domaine de recherche
                Vitesse(j,i)=-0.5*Vitesse(j,i) // Modification de la vitesse de l'abeille (signe + norme)
            elseif ( X(j,i)>Bornes(j,2) ) // Condition de sortie par la borne supérieure
                X(j,i)=Bornes(j,2) // On ramène l'abeille au bord du domaine de recherche
                Vitesse(j,i)=-0.5*Vitesse(j,i) // Modification de la vitesse de l'abeille (signe + norme)
            end 
        end
        F(i)=RosenbrockFunction(X(:,i)) // ou F=SphereFunction(X) // Evaluation de la fonction coût à la position actuelle
        if ( F(i)<FOptimum ) // Mettre à jour les informations sur le groupe
            FOptimum=F(i) // Remise à jour du nouvel optimum du groupe d'abeilles
            XOptimum=X(:,i) // Enregistrement de la position de la meilleure abeille
        end
        if ( F(i)<FOptiAbe(:,i) ) // Mise à jour des informations sur la position idéale de l'abeille en cours
            FOptiAbe(i)=F(i) // Remise à jour du nouvel optimum de l'abeille en cours
            XOptiAbe(:,i)=X(:,i) // Enregistrement de la meilleure position de l'abeille en cours
        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)
