L'Évolution Différentielle (Differential Evolution ou DE en anglais) est une méthode d'optimisation pour des problèmes continus développée par R. Storn et K. Price en 1995 [Storn95] [Storn97].
À chaque génération
$\quad$ Pour tous les individus $i$ de la population
$\quad\quad$ 1. MUTATION:
$\quad\quad\quad$ 1.1 On choisi 3 individus différents au hasard $\boldsymbol{x}_{r1}$, $\boldsymbol{x}_{r2}$ et $\boldsymbol{x}_{r3}$
$\quad\quad\quad\quad$ $\boldsymbol{x}_{r2}$ et $\boldsymbol{x}_{r3}$ vont permettre de déterminer automatiquement la direction et l'amplitude le la mutation
$\quad\quad\quad\quad$ (i.e. la direction de recherche et son amplitude)
$\quad\quad\quad$ 1.2 On calcule un mutant $\boldsymbol{v}_{i} \leftarrow \boldsymbol{x}_{r1} + F . (\boldsymbol{x}_{r2} - \boldsymbol{x}_{r3})$
$\quad\quad$ 2. CROISEMENT:
$\quad\quad\quad$ On crée un individu "test" $\boldsymbol{u}_{i}$ dont les composantes sont aléatoirement prises soit dans $\boldsymbol{x}_i$ soit dans $\boldsymbol{v}_i$
$\quad\quad$ 3. SELECTION:
$\quad\quad\quad$ Si cet individu test $\boldsymbol{u}_{i}$ est meilleur que $\boldsymbol{x}_{i}$, il le remplace à la génération suivante.
Ci-dessous une écriture plus formelle de l'algorithme.
Notations:
Algorithm's parameters: $N$, $Cr$ and $F$
Input:
pour chaque generation $t = 1, \dots, T$
$\quad$ pour chaque individu $i = 1, \dots, N$
$\quad\quad$ 1. MUTATION:
$\quad\quad\quad$ Choisi aléatoirement 3 individus différents $\boldsymbol{x}_{r1,t}$, $\boldsymbol{x}_{r2,t}$ et $\boldsymbol{x}_{r3,t}$ dans la population
$\quad\quad\quad$ Construit un individu mutant $\boldsymbol{v}_{i,t} \leftarrow \boldsymbol{x}_{r1,t} + F (\boldsymbol{x}_{r2,t} - \boldsymbol{x}_{r3,t})$
$\quad\quad\quad$ où $F$ est un "facteur d'amplification" de la mutation.
$\quad\quad\quad$ L'algorithme extrait des informations de direction et de distance à produire pour sa composante aléatoire à partir des deux individus $\boldsymbol{x}_{r2,t}$ et $\boldsymbol{x}_{r3,t}$.
$\quad\quad$ 2. CROISEMENT: l'individu $\boldsymbol{x}_{i,t}$ est "mélangé" avec le mutant $\boldsymbol{v}_{i,t}$ pour former un individu test $\boldsymbol{u}_{i,t}$
$\quad\quad\quad$ Choisi aléatoirement une dimension $d_{r,i}$.
$\quad\quad\quad$ La $d^{ieme}$ composante $v_{d,i,t}$ de $\boldsymbol{v}_{i,t}$ sera toujours transmise à $\boldsymbol{u}_{i,t}$ afin de s'assurer qu'il obtienne au moins un élément de $\boldsymbol{v}_{i,t}$.
$\quad\quad\quad$ pour chaque dimension $d = 1, \dots, D$
$$ u_{d,i,t} \leftarrow \left\{ \begin{align} v_{d,i,t} \quad & \text{ si } \mathcal{B}(Cr) = 1 \text{ ou si } d = d_{r,i}\\ x_{d,i,t} \quad & \text{ sinon.} \end{align} \right. $$$\quad\quad\quad\quad$ où $\mathcal{B}(Cr)$ est une variable aléatoire suivant une loi de Bernoulli de paramètre $Cr$
$\quad\quad\quad\quad$ et ou $u_{d,i,t}$, $v_{d,i,t}$ et $x_{d,i,t}$ sont respectivement les $d^{ieme}$ composantes de $\boldsymbol{u}_{i,t}$, $\boldsymbol{v}_{i,t}$ et $\boldsymbol{x}_{i,t}$
$\quad\quad$ 3. SELECTION:
$\quad\quad\quad$ si $f(\boldsymbol{u}_{i,t}) < f(\boldsymbol{x}_{i,t})$
$\quad\quad\quad\quad \boldsymbol{x}_{i,t+1} \leftarrow \boldsymbol{u}_{i,t}$
$\quad\quad\quad$ sinon
$\quad\quad\quad\quad \boldsymbol{x}_{i,t+1} \leftarrow \boldsymbol{x}_{i,t}$
$\quad$ fin pour
fin pour
In [ ]:
# import python packages here...