Maintenant qu’on sait créer une population de solutions, l’évaluer,
opérer une sélection des meilleures solutions et obtenir une nouvelle
génération par la reproduction, il reste à assembler toutes ces parties
et voir ce qu’il se passe…
Voici le code complet de notre algorithme:
Seules les dernières lignes de code sont nouvelles. Elles sont assez
simple à comprendre je pense, même si vous ne connaissez pas le
langage Ruby. On commence par définir le nombre qu’on recherche puis
on crée la population d’origine au hasard avec @population = make_population.
Ensuite on itère sur 50 générations avec 50.times do |generation|. C’est
notre première condition de sortie : quoiqu’il se passe, on arrête le
traitement au bout à la 50ème génération. Dans cette boucle on évalue
la génération en cours avec score_population et on la trie. Pour savoir
où on en est visuellement on extrait le meilleur score avec
best = @population.first.first et on affiche cette information à la ligne
suivante. Vient ensuite notre seconde et dernière condition de sortie avec
exit if best == 0 ; autrement dit on stoppe le traitement à la première
solution trouvée. Pour finir, on produit la génération suivante avec
next_generation.
Et ça donne quoi ?
La plupart du temps ça donne quelque chose comme ça:
Les générations successives convergent lentement vers la solution.
Si vous voulez voir la solution trouvée (c’est normal d’être curieux)
vous pouvez remplacez une ligne de code pour afficher la solution:
Alors, la plupart du temps, ça se passe bien. Mais parfois un phénomène
étrange se produit:
L’algorithme reste bloqué sur une valeur et on atteint la 50ème
génération sans avoir trouver de solution. What the fuck ? Et bien
l’algorithme a atteint ce qu’on appelle
l’extremum local. Pour faire
court, ça signifie qu’il ne peut pas faire mieux
avec les gènes dont il disposait à l’origine. Je developperais cette
idée dans un futur article. En attendant, comment on règle ça ?
En s’inspirant encore une fois de phénomènes naturels : la mutation
et/ou la diversité génétique.
C’est le sujet du prochain article.