algorithme Genetique et Réseaux de neurones
J'ai toujours été intrigué par le theme de l'intelligence artificielle. C'est en 2018 que j'ai décidé de coder une IA qui serait capable d'apprendre à conduire dans un environnement virtuel. Ici les IA ont été codées dans le moteur graphique Unity 3D en language C#.
J'ai ainsi découvert l'existence des algorithmes génétiques et
appris à m'en servir pour entrainer des réseaux de neurones à effectuer les taches suivantes.
• "Apprendre" à tirer à l'arc
• "Apprendre" à conduire
Algorithme
génétique
J'ai d'abord codé mon premier algorithme génétique en Python. L'objectif était de résoudre le problème du voyageur de commerce : Déterminer le chemin le plus court qui visite chaque ville une seule fois et qui termine dans la ville de départ.
• Le bloc (A) représente l'avancement de l'algorithme à différents moments clefs.
On commence d’abord par créer un nuage de points : 15 points disposés aléatoirement sur une grille de 10x10 pixels.
L'algorithme génétique commence par la création d'une population de départ, ici une population de 100 trajets.
• Le bloc (B) correspond à la description de ces trajets. Ils sont tous caractérisés par une liste de points dont l'ordre est donné de manière aléatoire . Cette liste de points correspond à l'ADN d'un trajet.
Pour coller à la théorie de l'évolution de Charles Darwin, il faut maintenant procéder à une sélection naturelle. Pour cela, on classe les trajets en fonction de leur longueur. Plus le trajet est court, plus celui-ci sera haut dans le classement.
Maintenant que toute notre population de départ est classée, on sélectionne les 25 meilleurs trajets. Pour plus de diversité, et encore une fois en s’inspirant de la nature, on sélectionne également 25 chanceux. Ces 25+25 sélectionnés vont maintenant pouvoir se «reproduire».
• Le bloc (C) représente la reproduction qui consiste à choisir deux «sélectionnés» (un père et une mère) et de mélanger leur ADN pour donner 4 nouveaux trajets (4 enfants).
L'objectif est de conserver une population constante (ici de 100). On ajoute finalement une légère mutation à l'ADN des "enfants".
Ce processus de sélection/reproduction/mutation est répèté jusqu'à ce qu'il n'y ait plus de progression.
Apprendre à
tirer à l'arc
Captures d'écran du projet sur Unity 3D :
L'objectif était d'apprendre le tir à l'arc à une IA.
Je voulais qu'elle atteigne toujours sa cible de 10m à 80m. Peu importe la force et la direction du vent.
Environnement
Modélisation et controle du robot archer
Modélisation de l'environnement dans Unity
Le robot est muni d'un Réseau de neurones semblable à celui-ci :
Description des entrées :
• x1 : correspond à la position suivant l'axe x de la cible
• x2 : correspond à la position suivant l'axe y de la cible
• x3 : correspond à la force du vent suivant l'axe x
• x4 : correspond à la force du vent suivant l'axe y
Description des sorties :
• y1 : Rotation verticale de l'arc
• y2 : Rotation Horizontale de l'arc
• y3 : Puissance du tire
Nous allons entrainer ce réseau de neurones en suivant le même principe que celui présenté dans la rubrique algorithmes génétiques.
Résultats
Première génération.
Les tirs sont totalement aléatoires
Après 5 générations
On observe une concentration des tirs
Après 25 générations
Certains réseaux de neurones obtiennent des résultats satisfaisant et atteignent la cible.
L'expérience à ensuite étée réalisée avec des cibles positionnées aléatoirement. Les résultats ne sont pas encore suffisamment concluant. La puissance de calcul dont je dispose n'est pas suffisante pour une progression efficace sur ce projet. De plus il semblerait qu'un algorithme genetique n'etait pas la meilleur solution.
Apprendre à
conduire
Extrait d'une présentation du projet :
L'objectif était d'apprendre à une IA à completer un circuit le plus rapidement possible sans percuter l'environnement. Je voulais voir s'il etait envisageable d'utiliser une IA pour trouver la trajectoire optimale.
Environnement
J'ai d'abord codé dans Unity une scène dans laquelle il est possible de dessiner le circuit que l'on veut.
Le circuit doit au minimum comporter :
• un point de départ
• des murs qui forment un circuit fermé
• des CheckPoints (le dernier CheckPoint correspond à l'arrivée)
Réseau de neurones
J'ai ensuite codé une 2ème scène dans laquelle on peut créer son véhicule mais surtout dimensionner le réseau de neurones (RN) associé.
On peut choisir :
• le nombre d'inputs (1 - 6). Ce sont les capteurs de distance du véhicule
• le nombre de couches cachées (0 - 3). Ce sont des couches de neurones entre l'entrée et la sortie du RN
• le nombre de neurones par couche cachée (1 - 5)
Algorithme génétique
Il est maintenant temps de coder la partie "apprentissage" en utilisant un algorithme génétique:
• Notre population de départ est composée de 100 voitures munies de leur réseau de neurones.
Elles sont toutes envoyées sur le circuit où elles essayent d'aller le plus loin possible.
Une fois qu'elles ont toutes, soit complété le circuit, soit percuté un mur, elles sont classées par leur score.
(le score est calculé en fonction du temps et de la distance parcourue).
• Nous pouvons maintenant procéder à la sélection, la reproduction et la mutation
en suivant le même principe que celui présenté dans la rubrique algorithmes génétiques
(Ps: sur la photo au centre de la diapositive, les traits rouges correspondent aux capteurs des voitures)
Résultats
Nous pouvons observer ci-dessus l'évolution de l'IA après 100 générations.
Une grande partie des voitures arrivent au bout du circuit et certaines bien plus rapidement que d'autres.
Observations : Il est possible de sauvegarder les valeurs du RN de la meilleure voiture.
Lorsque l'on pose cette voiture dans un nouveau circuit qui lui est totalement inconnu, elle arrive sans aucun problème au bout de celui-ci.
D'un certaine façon la voiture à "appris" à conduire.