De la Théorie à la Pratique
Pour mettre en oeuvre la théorie que vous venez dapprendre, jetons un il à un problème simple:
Etant donnés les nombres de 0 à 9 et les opérateurs numériques +, -, * et /, trouver une séquence qui représentera une valeur cible. Les opérateurs seront insérés en séquence, et ce de gauche à droite.
Donc, partant du nombre 23, la séquence 6+5*4/2+1 peut être une solution possible.
Si 75.5 est le nombre à rechercher, alors 5/2+9*7-5 est une solution viable.
Sil vous plait avant de continuer, soyez certains de comprendre le problème. Je sais que cest tiré par les cheveux mais jai pris cet exemple pour sa simplicité.
Tout dabord, nous devons encoder la solution en tant que chaine de bits un chromosome. Comment fait-on cela ? Et bien, on commence par représenter tous les différents signes disponibles pour trouver la solution : de 0 à 9 et +, -, * et /.
Ce qui représentera un gène. Chaque chromosome sera fait à partir de plusieurs gènes.
Quatre bits sont nécessaires pour représenter tous les signes :
0: 0000
1: 0001
2: 0010
3: 0011
4: 0100
5: 0101
6: 0110
7: 0111
8: 1000
9: 1001
+: 1010
-: 1011
*: 1100
/: 1101
La suite ci-dessus montre tous les gènes nécessaires pour résoudre le problème de tout à lheure. Les gènes 1110 & 1111 ne seront pas utilisés et lalgorithme les ignorera sil les rencontre.
Donc maintenant vous pouvez voir que la solution précédente pour la valeur 23, ' 6+5*4/2+1' peut être représentée par neufs gènes comme :
0110 1010 0101 1100 0100 1101 0010 1010 0001
6 + 5 * 4 / 2 + 1
Ces gènes sont assemblés pour former le chromosome:
011010100101110001001101001010100001
Quelques mots sur le décodage
Etant donné que lalgorithme fait des choix aléatoires, il arrive souvent que lon se retrouve avec des chaînes de bits de ce type :
0010001010101110101101110010
et en les décodant on trouve :
0010 0010 1010 1110 1011 0111 0010
2 2 + n/a - 7 2
Ce qui ne représente rien dans le cas de notre problème ! Par conséquent, lors du décodage lalgorithme ignorera chaque gène non conforme à la forme attendue, comme Nombre->opérande->nombre->opérande, et ainsi de suite.
En définissant cette règle, lexemple précédent devient :
2 + 7
Cette partie peut être la plus difficile dans la mise en place de lalgorithme. Cela dépend de la nature du problème à résoudre, mais généralement on donne la plus grande valeur daptitude au chromosome qui tend à résoudre le problème.
Par rapport au simple projet que je décrit ici, une valeur daptitude peut être assignée qui sera inversement parallèle à la différence entre la solution et la valeur du chromosome décodé.
En continuant sur lexemple du projet précèdent avec 42 comme valeur recherchée, le chromosome résultant serait :
011010100101110001001101001010100001
avec une aptitude de 1/(42-23) ou 1/19.
Il peut arriver quune solution débouche sur une division par zéro, comme avec1/(42-42).Néanmoins, ce nest pas un problème, puisque nous avons trouvé ce que lon cherchait ..une solution ! . Par conséquent, on peut tester ce résultat car lalgorithme sarrêtera en fonction.
Tout dabord veuillez relire ce tutorial
Si maintenant vous pensez quavez suffisamment compris comment lon résout ce problème, je vous recommanderai dessayer de coder lalgorithme génétique vous-même. Il ny a pas de meilleure méthode dapprentissage. Mais si toutefois, vous ny parvenez pas, jai préparé un source simple que vous pouvez trouver ici.
Essayez de jouer avec le taux de mutation, de croisement, la taille du chromosome, etc.. .afin de comprendre linfluence de chacun de ces paramètres sur lalgorithme.
Le code doit être suffisamment documenté pour vous permettre de comprendre ce quil se passe. Dans le cas contraire, faites-le moi savoir par email et je tenterais daméliorer les commentaires
Note : le code à télécharger analysera un chromosome binaire avec les valeurs évoquées précédemment et tentera de trouver une solution qui utilisera tous les symboles valides quil aura rencontré. Par conséquent, si lon cherche à trouver
42 , + 6 * 7 / 2 ne donnera pas un résultat valide même si les quatre premiers symboles ("+ 6 * 7") représentent une solution viable.
(Le code Delphi soumis par Asbjørn est ICI ainsi que la version Java de Tim Roberts téléchargeable ICI )
Quelques mots avant de conclure
Jespère que ce tutorial vous a aidé à avoir les bases des algorithmes génétiques.
Veuillez noter que seules quelques bases ont été abordées ici. Si les algorithmes génétiques vous ont intéressés, alors il y encore pas mal de connaissances à explorer. Par exemple, il existe dautres techniques de sélection, de croisement et dautres opérateurs de mutation à essayer et encore plein de trucs ésotériques comme le partage daptitude (fitness sharing) et des espèces avec lesquelles samuser. Toutes ces techniques, ou même certaines dentre-elles, amélioreront considérablement la performance de vos algorithmes génétiques.
Un truc à essayer
Si vous avez trouvé comment coder lalgorithme génétique du tutorial par vous-même, essayez donc un problème plus difficile :
Étant donné une aire remplie de disques ne se chevauchant pas et qui sont dispersés le long de sa surface, comme indiqué sur la capture 1,
Capture 1
Utilisez les algorithmes génétiques pour trouver un disque ayant le plus grand rayon et qui peut se placer parmis les autres disques sans les chevaucher, voir capture 2
Capture 2
Comme vous lavez certainement déjà compris, jai déjà écrit le code qui résout ce problème, donc si vous êtes coincé, vous le trouverez ICI (mais vous pouvez tenter de le trouver vous-mêmes, nest ce pas ;o) )
Pour ceux qui nont pas de compilateur, voici les exécutables.