Algorithmes génétiques & art évolutionnaire

Après avoir découvert l’existence des « réseaux de neurones » j’ai essayé d’en créer moi-même.

Première expérience : Random-image

../../_images/14.png

J’ai donc décidé d’inventer une implémentation (très simple, et extrèmement loin des « vrais » réseaux de neurones), basée sur le fait que chaque neurone représente une fonction arbitraire (cosinus, inverse, exponentielle, addition, multiplication…), et ils sont ensuite reliés entre eux par des synapses, de façon totalement aléatoire : En gros, on obtient un graphe orienté, généré complètement au hasard, ou chaque noeud représente une fonction. Les valeurs qui arrivent au neurone sont additionnées puis passé à la fonction du neurone.

Ensuite, je génère des images en fournissant au réseau de neurones un couple (x, y). Je lis la valeur finale de 3 autres neurones, ce qui me donne un triplet (rouge, vert, bleu).

Je peut donc associer à chaque pixel une couleur. Ensuite, je n’ai plus qu’à implémenter une fonction faisant muter aléatoirement un réseau de neurones, et je peux donc obtenir de jolies images par sélection naturelle. Ici, la « valeur sélective » de chaque réseau de neurone est déterminée par les goûts des utilisateurs. Par sélection successive, on obtient assez rapidement des images assez jolies.

../../_images/3.png

J’ai ensuite pu créer un logiciel permettant tout cela, que j’ai appelé « random-image ». Si vous voulez tester, vous pouvez télécharger le code source ici : random-image.zip.

../../_images/random-image.png

Si vous voulez voir d’autres images, voyez la galerie.

J’ai aussi pu générer des vidéos en faisant varier les valeurs de certains neurones constants au cours du temps (attention la qualité est assez médiocre) :

Autre expérience

J’ai aussi codé un petit jeu dans lequel des balles contrôlées par des réseaux de neurones se mangent entre-elles : Les plus grosses mangent les plus petites, chacune à conscience des balles pouvant la manger, et qu’elle peut manger, les plus proche. A chaque fois qu’une balle se fait manger, elle réapparaît avec le réseau de neurones de celle qui l’a mangée, légèrement muté.

On assiste au début à l’errance des balles sur le terrain, et si on attend un peu, on finit par les voir foncer sur la balle à manger la plus proche !

Arbres d’évaluation

../../_images/tree-graph.png

J’ai pu créer, en C++, une classe représentant une formule mathématique au moyen d’un arbre, dans lequel chaque nœud représente une fonction élémentaire.

Au final, on peut faire à peut près les même chose qu’avec mon « réseau de neurones », mais on n’a qu’une valeur de retour. Par contre c’est plus rapide, plus simple, et on ne risque pas d’avoir des problèmes de « boucles infinies » comme on peut en avoir avec des réseaux de neurones.

J’ai d’ailleurs pu lui faire résoudre cette énigme avec succès, et je me suis amusé à lui faire approximer des courbes tracées à la main par des formules mathématiques, ce qui est assez intéressant.

Si vous êtes intéressé par le sujet :