% LaTeX

\documentclass[12pt,a4paper,french]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{french}
\usepackage{graphicx}

\author{Samuel L\textsc{andau}}
\date{7 avril 1999}
\title{Kermit et les piranhas\\-\\\'Evolution de l'architecture de contrôle d'un petit animat}

\begin{document}

\maketitle

\newpage

\abstract{Le projet consiste à faire évoluer les paramètres
d'un réseau de neurone à connexions simples (réseau simple ou
multicouches) en vue de contrôler un animat réactif. L'architecture et
l'expérience accumulée pouvant resservir pour implémenter
les architectures de contrôle de robots-footballeurs (RoboCup '99).\\
L'archive contenant les sources (Unix/X11), le manuel d'utilisation et 
des exemples est disponible à $<$http://www.ecoledoc.lip6.fr/\tilde{}landau/$>$}

\tableofcontents

\newpage

\section{Introduction}

L'idée maîtresse à la naissance du projet était de pouvoir implémenter
une architecture de contrôle qui permette de commander facilement un
robot. Lui donner une destination, et qu'il s'y rende coûte que coûte
sans que l'on ait à plus se préoccuper de lui, qu'il évite obstacles et
adversaires (s'agissant de robots-footballeurs, ceux de l'équipe
adverse) sans qu'il lui en soit explicitement intimé l'ordre à chaque
instant.\\
Une architecture simple et réactive a été choisie, sous la
forme d'un réseau de neurones simplement connecté, liant des senseurs
simulés (capteurs de gradient émis par la destination, capteurs de
présence à l'approche d'un prédateur) à des effecteurs simulés aussi
(un angle et la norme du vecteur vitesse).\\
 Les réseaux possédant sur chaque couche un neurone émettant un signal
constant mettant trop de temps à évoluer vers quelque chose
d'intéressant, les neurones supplémentaires ont été abandonnés pour
réduire le perceptron (qui peut être multicouche) à sa plus simple
expression. L'algorithme génétique fait évoluer les poids de ce
réseau, dont la géométrie est fixée au début de chaque évolution.

\section{L'environnement}

\begin{figure}[ht]
\centering
\includegraphics*[scale=0.6]{xkermit.eps}
\caption{Le monde et ses habitants}
\end{figure}

Le monde est constitué de deux rives, l'animat part de celle de gauche
et la cible est sur celle de droite. Entre les deux, une rivière 
où nagent les prédateurs. Tout est paramétrable : dimensions du monde, 
des prédateurs et de l'animat, des rives, nombre des prédateurs,
etc.\\
L'animat part avec un capital d'énergie qui est dépensée au fur et à
mesure que le temps passe, ainsi que lorsqu'il se fait mordre par un
prédateur. Il n'a pas été introduit de moyen pour lui de récupérer
l'énergie perdue, par un relai fournisseur d'énergie par exemple,
c'est hors du champ du contrôle simple voulu.



\section{L'architecture de contrôle}

L'architecture de contrôle est un perceptron qui peut être
multicouche. Les entrées correspondent aux ``senseurs'' de l'animat :
\begin{itemize}
\item deux capteurs de gradient, qui le perçoivent tel quel. Il faut remarquer
qu'assigner à chaque percepteur le gradient perçu moins la moyenne des
deux aurait résolu le problème de la même façon, mais l'on aurait
explicitement retiré une symétrie du problème, et donc facilité encore 
l'évolution, ce qui n'était pas le but.
\item 8 capteurs de présence, sensibles aux prédateurs. Ces capteurs
s'activent en deçà d'une certain distance de seuil, et le stimuli est d'autant
plus fort que le prédateur est proche sur le secteur donné. Le stimuli
est en fait simplement la distance du seuil moins la distance au plus
proche prédateur pour le secteur angulaire donné.
\end{itemize}
Et les sorties sont un angle (compris entre -$\pi$ et $\pi$) et  et la
norme de la vitesse (bornée par la vitesse maximum accordée à
l'animat) pour le prochain temps (cf. figure 1).\\

\begin{figure}[ht]
\centering
\includegraphics*[scale=0.25]{reseau.eps}
\caption{Architecture de contrôle}
\end{figure}



\section{Contraintes et choix pour l'environnement}

Il a été fait un certain nombre de choix, pour notamment accélérer
l'évolution, par exemple interdire à l'animat de toucher le parois
hautes et basses du monde : avant que cette contrainte ne soit
introduite, l'aspect opportuniste de l'évolution faisait que les
animat qui se contentaient d'aller vers la paroi et de la longer
étaient avantagés par rapport aux autres, alors qu'ils ne
remplissaient pas du tout la tâche.\\
Le capital d'énergie a été introduit pour forcer l'animat à aller au
moins à une certaine vitesse, puisque le temps écoulé lui fait perdre
de l'énergie. C'est aussi un moyen de matérialiser la punition des
morsures des prédateurs, dans le cas où l'on voudrait essayer de
résoudre ce même problème avec un algorithme d'apprentissage par
renforcement.\\
Le gradient (émis par la destination) décroît seulement en fonction de
la distance, pour simplifier les calculs, mais faire une fonction
qui dessine un champ de potentiels particulier, qui tende 
par exemple à attirer l'animat pour qu'il arrive dans un certaine
direction à destination est envisagé pour l'application aux
robots-footballeurs (afin d'arriver sur la balle avec une certaine
direction, plutôt vers les buts adverses qu'en leur tournant le dos
par exemple).\\
Tant pour l'animat que pour les prédateurs, il a été introduit un
seuil de ``sensibilité'' réglable, qui est le rayon en deça duquel
l'animat perçoit les prédateurs et vice-versa, ce seuil n'est pas
nécessairement le même pour les uns et pour les autres. Dans une
utilisation postérieure de cette architecture ces seuils seront normés 
pour pouvoir les changer en cours d'utilisation sans avoir à refaire
l'évolution pour en tenir compte.\\
Pour noter le génomes sur une base égale, la direction de départ de
l'animat et sa distance à la cible au départ sont établis de la même
façon : l'angle est de 90° par rapport à la direction vers la cible
(pour l'obliger à au moins faire un quart de tour), et la distance est 
établie au hasard au début de chaque simulation.\\
Enfin, le comportement des prédateurs est le suivant : se déplacer
``au hasard'' tant que la proie n'est pas dans leur champ, sinon aller 
droit dessus. Les prédateurs peuvent occuper la même position, rien
n'est prévu pour éviter leur collision.

\section{Choix et paramètres pour l'algorithme génétique}

Tout d'abord, il faut noter qu'il y a beaucoup de symétries dans ce
problème, dont la prise en compte aurait permis de le simplifier
beaucoup, trop même, c'est pourquoi il a été fait le choix de ne pas
tenir compte des symétries. En en tenant compte, et en remarquant
qu'une solution où les poids des capteurs d'odeur seraient opposés
pour la direction, et où les poids des capteurs de présence seraient
égaux pour chaque coté, mais opposés d'un coté à l'autre, toujours
pour l'angle, et où l'on mettrait les mêmes valeurs positives de partout
pour les poids de la vitesse, on se trouverait à ne faire évoluer que
deux ou trois nombres, les valeurs absolues des ensembles de
poid ci-dessus précisés, et en leur appliquant les contraintes
pour leur donner un signe on obtient une solution tout à fait
correcte. Mais l'évolution n'aurait rien 
``découvert'', l'objectif du projet n'était pas de résoudre le
problème au plus vite, car dans ce cas une solution se trouve
facilement à la main comme ci-dessus précisé.\\
Le génome est simplement un tableau de flottants codant les poids.\\
L'algorithme est \textbf{très} élitiste, il consiste à générer une nouvelle
génération à partir d'un pourcentage de la population, en croisant et
mutant, à intégrer cette nouvelle génération dans la population qui
s'en trouve agrandie, et ensuite à retirer les génomes les moins
adaptés. Cette politique a d'abord été choisie parce que la politique
classique de remplacement des générations ne donnait pas grand-chose
(même en gardant le meilleur d'une génération sur l'autre),
tout du moins pas assez vite, ce qui au vu de la simplicité du
problème n'était pas satisfaisant. Puis elle est apparue comme
évidente, en ce sens que ce problème n'a pas beaucoup de solutions
à moitié viables, mais par contre certaines familles de solutions
fonctionnent toujours (par exemple celles dérivées des
contraintes formulées ci-dessus). C'est-à-dire qu'il y a peut-être peu
de minima locaux. Donc dès qu'une solution pointe, l'évolution n'a
``plus qu'à'' s'engouffrer dedans, le problème  devient un problème
d'optimisation, d'affinage de paramètres plus qu'une véritable
recherche dans un espace. Dans ces conditions, l'algorithme est
assorti d'un très fort taux de mutation (90\% par exemple); avec une
population de taille respectable (500 individus), dans ces conditions,
l'évolution converge assez vite vers des individus qui remplissent la
tâche (en moins de 200 générations), puis vient l'affinage, ils le
font de mieux en mieux, de façon plus ``élégante'', en contournant
mieux les rpédateurs.\\
A noter que le crossover est à deux points, et que la mutation est une
mutation à probabilité gaussienne, la valeur du poids ne change pas du
tout au tout lors d'une mutations mais bouge plus ou moins doucement,
au hasard.\\
La fitness est une moyenne sur un certain nombre d'essais, entre
lesquels la cible -et donc l'animat aussi- sont replacés ``au
hasard'', ce toujours pour être le plus équitable possible, pour ne
pas pénaliser un bon génome, où, par malchance, l'animat serait contre 
le mur dès le départ, ou pour ne pas récompenser la chance qu'aurait
eu un animat vis-à-vis des prédateurs (qui la plupart du temps bougent
``au hasard''). Dans tous les cas une fitness simplement proportion du
gradient maximum atteint permet d'avoir une solution, mais dans le cas 
des réseaux multi-couches, tenir compte de l'énergie à l'arrivée a
permis d'affiner la solution. On observe alors des trajectoires plus
fluides, l'animat semble s'agiter moins en traversant la rivière.

\section{Comportements particuliers observés, au cours de l'évolution}

Au début, surtout, de l'évolution des comportements particuliers on
observe trois comportements particuliers : 
\begin{itemize}
\item l'animat ne va pas droit sur la cible, il décrit une courbe qui
semble longer seulement la cible, puis au dernier moment il tourne
d'un coup et va dessus. Cela s'explique par les poids des neurones sur 
les capteurs d'odeur, qui ne sont pas encore bien équilibrés au début
de l'évolution.
\item l'animat oscille au lieu d'avancer droit. Surement car les
poids des capteurs d'odeur n'étant pas encore affinés, ils sont trop
grands, et l'animat tourne alors trop violemment d'un coté ou de
l'autre pour suivre le gradient.
\item alors qu'il est à proximité d'un ou plusieurs prédateurs,
l'animat se met à tourner sur lui-même, ce qui lui est souvent fatal
car alors il se fait mordre facilement. Typiquement, les poids des
capteurs de présences mettent encore plus de temps que ceux d'odeur à
avoir des valeurs cohérentes entre eux, pour la survie de l'animat,
puisqu'il y en a 8 par défaut (4 fois plus).
\end{itemize}

\section{Résultats}
\subsection{Réseau simple couche}
\subsubsection{Sans pr\'edateurs}

Le suivi de gradient se fait tr\`es vite, en utilisant l'algorithme
et les param\`etres pr\'ecis\'es ci-dessus. Bien que les fitness soient
calculées sur des moyennes (ici 4 essais), comme aux positions près de 
la cible et de l'animat le monde est identique d'une fois sur l'autre
(pas de prédateurs) les palliers observés correspondent bien à la
distance au mur le plus proche que l'animat rencontre, car
généralement il va tout droit ou presque dans une direction donnée.\\
Les courbes en moyenne et au pire de chaque génération sont plus
lisses et se suivent de près, témoignant bien de ce que l'algorithme génétique 
choisi est très élitiste.
[figures 3 à 5]

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-simple-moyenne.eps}
\end{center}
\caption{R\'eseau simple couche, moyenne, sans pr\'edateurs}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-simple-meilleur.eps}
\end{center}
\caption{R\'eseau simple couche, meilleur, sans pr\'edateurs}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-simple-pire.eps}
\end{center}
\caption{R\'eseau simple couche, pire, sans pr\'edateurs}
\end{figure}

\subsubsection{Avec pr\'edateurs}

Avec prédateur l'évolution vers une solution satsfaisante prend
un peu plus de temps; bien que les courbes soient amputées elles
progressent très peu après la 100ème génération.\\
Ici, les pallier de la courbe du meilleur ne correspondent plus
nécessairement à une rencontre  avec un mur, car en moyenne l'animat a 
tout de même été confronté aux prédateurs.  Ceci vaut surtout pour les 
petits  palliers.\\
Même en tenant compte
de l'énergie restante à l'arrivée, l'animat n'évite jamais
correctement les prédateurs, l'effet ``toupie'' en leur présence ne
disparait jamais. Il reste toujours un secteur angulaire duquel
l'animat ne s'éloigne pas, ce qui et facile à interpréter pour le
réseau simple couche : le poids de ce secteur pour l'angle n'est pas
négatif si c'est un secteur à droite (incitant à tourner à gauche), ou
positif si c'est un secteur à gauche (incitant à tourner à
droite). Cette valeur est le fruit de l'évolution. Cependant comme
dans les autres cas l'animat réagi de façon correcte, et comme la
fitness est calculée sur une moyenne, le génôme en question est
sélectionné tout de même parmi les meilleurs et n'est pas ou presque
pas modifié. Pas assez en tout cas pour corriger l'effet observé.\\
Le résultat est donc encourageant, mais pas encore pleinement
satisfaisant à cause de l'évitement;des essais avec divers taux de
mutation (plus ou moins 
forts que 85\%) et sur un nombre plus grand de générations donnent des
résultats similaires.
[figures 6 à 8]
\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-normal-moyenne.eps}
\end{center}
\caption{R\'eseau simple couche, moyenne}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-normal-meilleur.eps}
\end{center}
\caption{R\'eseau simple couche, meilleur}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-normal-pire.eps}
\end{center}
\caption{R\'eseau simple couche, pire}
\end{figure}

\subsection{Réseau double couche}

Ces expériences faites suite à celles sur les réseaux simple couche se 
sont révélées plus concluantes, mais avec l'augmentation de la
complexité du réseau, il devient difficile d'interpréter les
comportements en fonction  des valeurs des poids. Par exemple la
notion de symétrie développée plus haut, qui est observée
systématiquement pour les réseaux simple couche, ne prévaut plus ici,
agrandissant ainsi l'espace des familles de vecteurs solution du
problème.\\
De façon surprenante, l'évolution ne prend pas beaucoup plus
de temps pour produire des animats capables de rejoindre la cible. Les 
courbes cependant continuent d'augmenter lentement mais de façon
notable après, car alors l'évolution va dans le sens d'une
amélioration de l'évitement des prédateurs, et les différences avec
les réseaux simple couche sont sans appel, l'évitement se fait
\emph{bien}.\\
Il a été choisi de mettre 3, puis 5 neurones sur la couche
intermédiaire, et aucune autre configuration n'a été testée car
l'une des deux architectures avait rempli les objectif, à savoir aller 
au plus juste sur la cible en évitant correctement les prédateurs la
plupart du temps.

\subsubsection{3 neurones sur la couche intermédiaire}

Des deux configurations multi-couches testées c'est celle qui donne
les meilleurs résultats. Notamment pour l'évitement de deux prédateurs 
en face à gauche et à droite de l'animat.\\
Comme son architecture de
contrôle est uniquement réactive et que tans que les entrées ne sont
pas nulles les sorties (donc la vitesse) ne le seront pas, on ne peut
pas s'attendre à ce qu'il s'arrête (ce qui de toute façon ne serait
pas souhaitable pour l'application aux robots footballeurs, les
adversaires ne passeront pas ``sans voir'' le robot qui a la balle par 
exemple...). On en peut pas non plus s'attendre à ce que dans ce
cas précis il fasse demi-tour, à cause de la symétrie des rôles joués
par les capteurs de présence. Introduire plus de capteurs de présence
n'aurait pas non plus changé grand-chose, la symétrie reste.\\
Malgré la symétrie, le réseau à 3 neurone sur la couche intermédaire a 
évolué vers une approche originale : si les prédateurs sont très
proches (et donc qu'ils sont sentis sur le premier et le dernier
capteur), l'animat les évite comme un bloc, il les contourne. S'ils
sont plus éloignés (par exemple second et avant-dernier capteur),
l'animat passe au milieu, et au fur et à mesure qu'il
s'approche, il accélère, et donc passe très vite entre les deux. Il
est difficile d'affirmer comme on pourrait le faire pour les réseau
simple couche que ``puisque les entrées des capteurs de proximité en
augmentant contribuent à faire augmenter la vitesse'', justement car
les poids ne respectent plus nécessairement de symétries comme ça a pu
être observé pour les réseaux simple couche.
[figures 9 à 11]

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-3-2-moyenne.eps}
\end{center}
\caption{R\'eseau double couche (3 sur la couche interm\'ediaire), moyenne}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-3-2-meilleur.eps}
\end{center}
\caption{R\'eseau double couche (3 sur la couche interm\'ediaire), meilleur}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-3-2-pire.eps}
\end{center}
\caption{R\'eseau double couche (3 sur la couche interm\'ediaire), pire}
\end{figure}


\subsubsection{5 neurones sur la couche intermédiaire}

Curieusement, même sur un plus grand nombre de générations (tests
jusqu'à 5000 générations), le réseau avec 5 neurones sur la couche
intermédiaire n'a jamais fait aussi bien que le précédent, justement
sur la question des évitements faciaux. Il ne les évite pas comem un
bloc s'ils sont proches, il passe toujours au mileu, mais n'accélère
pas, et donc se fait suvent beaucoup mordre dans ce cas de
figure. C'est peut-être du à un effet de moyenne, avec l'augmentation
du nombre de neurones sur la couche intermédiaire peut-être que les
influences des différences des entrées sont moins répercutées sur les
sorties, et qu'il assimile ça à un même ``motif'', à savoir par
exemple avoir deux prédateurs en face de soi.
[figures 12 à 14]

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-5-2-moyenne.eps}
\end{center}
\caption{R\'eseau double couche (5 sur la couche interm\'ediaire), moyenne}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-5-2-meilleur.eps}
\end{center}
\caption{R\'eseau double couche (5 sur la couche interm\'ediaire), meilleur}
\end{figure}

\begin{figure}[ht]
\begin{center}
\includegraphics*[scale=1]{mini-5-2-pire.eps}
\end{center}
\caption{R\'eseau double couche (5 sur la couche interm\'ediaire), pire}
\end{figure}


\section{Conclusions et perspectives}

Manifestement les r\'eseaux multi-couches convergent plus vite vers
des r\'eseaux qui \'evitent de fa\c{c}on plus souple les pr\'edateurs. Les 
essais sur un plus grand nombre de générations pour tenter d'améliorer les
évitements, en tenant compte de l'\'energie restante, sont concluants, 
m\^eme si l'animat continue de passer entre deux pr\'edateurs, au
moins il acc\'el\`ere pour leur \'echapper.\\

Pour les robots-footballeurs la perspective est donc de continuer \`a
ajouter des senseurs plus sp\'ecifiques, pour pouvoir:
\begin{itemize}
\item tenir compte de la balle et de ses mouvememts, et permettre de
tenter de la garder au ``pied''(dribble),
\item éviter les murs (avec un système de rayon réglable, pour
accepter tout de même de s'en approcher s'il faut dégager balle qui
est contre une paroi par exemple).
\end{itemize}
 Il faut aussi adapter un peu l'approche, en
conservant la base : dans le cas des robots-footballeurs il y a
beaucoup moins de ``prédateurs'', et ceux ci-ne bougent ni au
``hasard'', ni ne fondent sur un robot dès que celui-ci est dans le
champ (sauf s'il a la balle peut-être). L'approche par rayon de
détection, une fois normalisé, permet de changer en cours de jeu la
distance à laquelle le joueur accepte de s'approcher des autres
robots, typiquement : de loin s'il a la balle, de plus près s'il la
cherche ou s'il doit marquer un adversaire, et de très près s'il la
pousse vers les buts adverses, sous peine de, en voulant éviter le
gardien, s'éloigner des buts.

\end{document}
