Algorithmes génétiques

publicité
Université Paul Sabatier - ENSEEIHT
Option Méthodes d’Optimisation
Rapport de projet
Algorithmes génétiques
Nadia Selmani
Table des matières
1
Introduction
3
2
Principe
4
3
Mise en œuvre
3.1 Codage des données . . . . . . . . .
3.1.1 Codage binaire . . . . . . . .
3.1.2 Codage à caractères multiples
3.2 Évaluation . . . . . . . . . . . . . . .
3.3 Sélection . . . . . . . . . . . . . . . .
3.3.1 Roue de la fortune . . . . . .
3.3.2 N/2 élitisme . . . . . . . . . .
3.4 Sélection par tournoi . . . . . . . . .
3.5 Croisement . . . . . . . . . . . . . . .
3.6 Mutation . . . . . . . . . . . . . . . .
3.7 Critère d’arrêt . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
6
6
6
6
7
7
7
7
8
8
9
10
4
Résultats - Étude de la convergence
4.1 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Influence de la taille de la population . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Influence de la mutation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11
12
12
5
Conclusion
14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
“One general law, leading to the advancement of all organic beings, namely, multiply, vary,
let the strongest live and the weakest die.”
Charles Darwin - The Origin of Species[6]
2
1
Introduction
Les algorithmes génétiques sont des algorithmes permettant de résoudre des problèmes d’optimisation. Ils sont particulièrement utilisés lorsque l’on souhaite obtenir de bonnes solutions, pas
nécessairement optimales donc, assez vite.
Ils furent développés pour la première fois dans les années 60 au sein de l’Université du Michigan
par J. Holland ([1]) et ses collègues.
Ces algorithmes se basent sur la théorie darwinienne de l’évolution : les organismes vivant
changent constamment, les plus adaptés à leur environnement survivent, les autres disparaissent.
les espèces actuelles peuvent donc être vues comme des "versions optimisées" de leurs ancêtres. Si
ces méthodes ont connu au départ un succès timide, elles ont été popularisées aux États-Unis à la
fin des années 80, et au début des années 90 en Europe au travers des travaux de D. Goldberg([3]) et
de J.-M Alliot ([4]).
Aujourd’hui, les algorithmes génétiques sont utilisés pour résoudre des problèmes d’optimisation de forme, en aéronautique par exemple.
Ainsi, afin d’optimiser la forme des ailes de ses avions, Airbus donne à un algorithme génétique
une population initiale de formes a priori intéressantes, effectue une simulation dont le critère de
fin est une limite temporelle et optimise par la suite l’un des résultats finaux par d’autres méthodes
plus précises et mathématiquement très bien définies.
Ils sont également utilisés en statistique décisionnelle, au sein d’entreprises cherchant à maximiser leurs résultats tout en minimisant les coûts. Ils ont de plus donné naissance à la programmation
génétique, prélude probable à l’Intelligence Artificielle, puisqu’il s’agit d’apprendre à un programme
à en optimiser d’autres.
Cette méthode a ses avantages et ses inconvénients, qui seront présentés par la suite.
N.B. : Le présent rapport a pour vocation de présenter le principe et les différentes méthodes
d’implémentation d’un algorithme génétique simple. Les éléments mathématiques ayant trait à la
convergence de la méthode, demandant un certain niveau en théorie des schémas, ne seront pas
explicités. SI toutefois le lecteur souhaite en savoir plus, la page de J.-M. Alliot et ses références
constituent une bonne introduction ([2]).
3
2
Principe
Rappelons tout d’abord brièvement les différentes étapes de l’évolution génétique d’une population.
Considérons un ensemble d’individus, la population donc. Initialement, ces individus présentent
certaines caractéristiques, les gènes. L’ensemble des gènes d’un individu est appelé le génotype.
La première étape est la sélection : seuls les individus les mieux adaptés à leur environnement
peuvent se reproduire, et donc transmettre une partie de leurs "meilleurs" gènes à la génération
suivante.
Lorsque deux individus se reproduisent, leurs gènes sont croisés dans les cellules de l’enfant,
c’est-à-dire que certaines allèles de l’individu A se combinent avec d’autres allèles de l’individu B
pour former de nouveaux gènes. On appelle ce phénomène un brassage génétique. Il existe deux
types de brassages : les brassages interchromosomiques et les brassages intrachromosomiques. Ces
deux notions sont développées en annexe.
A ce premier facteur de diversité s’ajoute la possibilité d’une mutation de certains gènes. Généralement, la probabilité d’une mutation est très faible, mais ce phénomène doit être pris en compte
pour obtenir un algorithme complet.
L’enfant issu des individus A et B a donc un génotype différent de celui de ses parents.
Suite à cette reproduction, on obtient une nouvelle génération d’individus, qui devient la nouvelle population initiale. Les trois étapes de sélection, croisement et mutation sont à nouveau opérées
pour obtenir une nouvelle génération, et l’on réitère le processus un grand nombre de fois, puisque
la sélection naturelle se fait sur un temps long.
C’est ce principe-même, résumé dans la figure (1) qui est retranscrit dans les algorithmes génétiques, avec de légères variations liées notamment aux contraintes informatiques. En effet, la taille
de la population ne peut être ni croissante pour des raisons de coût en temps, ni décroissante, car
à mesure que le nombre d’individus diminue, des solutions potentiellement optimales peuvent
disparaître.
4
Figure 1 – Schéma simplifié du principe de fonctionnement d’un algorithme génétique
5
3
Mise en œuvre
Il existe,à chaque étape, plusieurs façons de mettre en œuvre un algorithme génétique. Nous ne
présenterons ici que les plus fréquemment utilisées.
On notera dans toute cette partie N le nombre d’individus formant la population.
3.1
Codage des données
3.1.1
Codage binaire
La première façon de procéder, très générale, consiste à coder les caractéristiques de la population
en bits, c’est-à-dire en une succession de 8 nombres entiers, 0 ou 1. Dès lors, toutes les opérations
précédemment exposées se font sur ces bits.
Ainsi, si la population initiale est composées de nombres compris entre 0 et 1 par exemple, on
multiplie la valeur de chaque individu par 28 et l’on transcrit la partie entière de ces nouveaux
nombres de la base décimale à la base binaire.
Ainsi, si x = 0.65, alors x × 28 = 166 et 166 s’écrit en binaire 10100110.
On peut également transcrire les caractéristiques de la population à l’aide de booléens, en
postulant que si l’individu n a la caractéristique 3, par exemple, alors le troisième chiffre du bit le
représentant sera un 1 (un 0 s’il ne l’a pas).
On peut également décider qu’une séquence de bits, soit un gène dans la terminologie appropriée, représente une variable d’optimisation. Ces gènes ne devront alors pas être "cassés" lors des
opérations suivantes.
Cette manière de coder présente l’avantage indéniable de la généralité. En effet, la nature même
du problème initial s’efface dès lors que la population initiale a été "traduite" en bits. Toutes les
opérations suivantes, de sélection, reproduction, croisement et mutation peuvent se faire de la
même manière quel que soit le problème original.
L’inconvénient de cette façon de faire est également sa généralité. Les caractéristiques d’une
population et les contraintes du problème ne sont pas toujours simples à traduire en binaire. De
plus, une fois la population finale obtenue, il peut être difficile d’interpréter les modifications qu’elle
a subie, et parfois, si les contraintes ont mal été spécifiées, cette population peut même ne pas être
solution du problème.
C’est toutefois la méthode qui a été implémentée dans le programme ci-joint.
3.1.2
Codage à caractères multiples
Cette façon de coder les données a tendance à se répandre aujourd’hui, du fait de son caractère
"naturel", mais souffre, au contraire de la méthode précédente, de son manque de généralité. Ainsi,
à chaque problème correspond un nouvel algorithme.
Toutefois, cette façon de procéder permet d’éviter les phases de transcription des données en
bits et vice versa.
J. Holland avait prouvé que le codage binaire était toujours plus efficace que le codage à caractères
multiples, mais cette preuve est aujourd’hui réfutée par certains, d’où le développement de ce codage
alternatif.
6
3.2
Évaluation
C’est là la partie la plus complexe et la plus coûteuse en temps de calcul d’un algorithme
génétique.
En effet, avant de sélectionner les individus, il est nécessaire d’évaluer leur adaptation au
problème considéré.
Pour cela, on définit pour chaque problème une fonction d’adaptation, ou "fitness" F(x), qui
mesure le niveau d’adaptation de chaque individu au problème d’optimisation. En général, on
cherche à faire en sorte que F(x) vaille 1 si l’individu est parfaitement adapté, 0 si il est parfaitement
inadapté([2]).
Cette fonction est appelée plusieurs fois, avant la sélection pour évaluer les individus de la
population-parent, et après la mutation, pour évaluer la population-enfant et mesurer son adaptation
au problème, et ce, à chaque itération.
Dans le programme en annexe, la fonction d’adaptation est exactement la fonction que l’on
cherche à maximiser, puisque cette dernière varie entre 0 et 1 sur l’intervalle [0,1[. Toutefois, en
général, ces fonctions sont bien plus complexes.
C’est cette évaluation qui donne la probabilité de sélection d’un individu p(i), telle que :
F (xi )
p(i) = Pn
∀i ∈ [1, n]
i=1 F (xi )
3.3
Sélection
3.3.1
Roue de la fortune
(1)
Il s’agit de la méthode de sélection la plus employée, et de celle qui a été mise en œuvre dans le
programme ci-joint.
Le principe est simple : à chaque individu correspond une probabilité d’être sélectionné, liée à
son adaptation au problème. On place ces individus sur une "roue de la fortune" biaisée imaginaire,
sur laquelle chaque individu occupe une place proportionnelle à son adaptation. Ceci correspond
aux probabilités cumulées pour chaque individu dans l’ordre dans lequel ils ont été rangés. On tire
ensuite aléatoirement N/2 nombres compris entre 0 et 1 et les individus dont la probabilité cumulée
se rapproche le plus des nombres tirés sont copiés dans la nouvelle génération. Les individus les
mieux adaptés, occupant une place plus importante sur cette roue de la fortune, ont donc plus de
chances d’êtres tirés au sort que les moins adaptés.
Ce principe, résumé dans la figure (2), permet d’obtenir une population sélectionnée bien adaptée
au problème, tout en gardant une certaine diversité génétique, puisque le hasard entre en jeu([7]).
3.3.2
N/2 élitisme
Il s’agit ici de ne sélectionner que les N/2 individus les mieux adaptés au problème. Le hasard
n’entrant absolument pas en jeu, cette méthode permet une convergence rapide, mais elle a le défaut
de limiter fortement la diversité génétique, or, rien ne prédit qu’un individu mal adapté, après
reproduction, croisement et mutation, ne peut donner un individu plus "acceptable".
7
Figure 2 – Principe de fonctionnement de la roue de la fortune biaisée
En général, il est donc plutôt d’usage de remplacer automatiquement un petit nombre d’individus
sélectionnés, choisis aléatoirement, par le même nombre d’individus les mieux adaptés de la
population-parent. Ceci permet à la fois d’accélérer la convergence tout en maintenant une pression
de sélection raisonnable.
3.4
Sélection par tournoi
Cette méthode de sélection consiste à choisir aléatoirement 2 individus, comparer leur niveau
d’adaptation et ne garder que le meilleur des deux, jusqu’à ce que l’on ai une nouvelle population
de N/2 individus. Ce type de sélection est peu utilisé.
3.5
Croisement
Il convient tout d’abord de spécifier le pourcentage de la nouvelle population qui sera croisé. Si
le croisement s’effectue à moins de 100%, ce ne sont pas N/2 individus qui constitueront la nouvelle
population, mais N, dont certains seront croisés, soit avec des individus de la population initiale,
soit entre eux, et d’autres non.
Ensuite, deux cas se présentent :
— soit il existe des gènes ne devant pas être cassés, et donc cette structure initiale doit être
préservée au cours du croisement ;
— soit chaque bit représente une information différente, auquel cas le croisement peut s’effectuer
à partir de n’importe quel locus.
Le second cas est celui développé dans le programme.
Deux points restent à présent en suspens : Quels individus seront croisés ensemble ? Où s’effectuera ce croisement ?
Ces deux questions sont réglées en tirant aléatoirement deux nombres, un pour l’individu et un
pour le locus, selon l’algorithme suivant :
8
On définit tout d’abord le nombre d’individus à croiser :
ncross = floor(N*pourcentage de croisement)
Puis, dans une boucle sur ces ncross individus :
Faire de i= 1 à ncross
Tirage aléatoire des deux nombres
cross1 = rand(0)
cross2 = rand(0)
Sélection des individus pour lesquels le croisement s’effectue
k = floor((N-1)*cross1)
Sélection des allèles à échanger
l = floor(7*cross2)
Brassage
Faire de j=7 à l par pas de -1
L’élément k sélectionné de la population intermédiaire reçoit les allèles 7 à l, de la droite vers la
gauche de l’élément k de la population initiale
uint (k, j) = u(k, j)
Fin faire
Fin faire
3.6
Mutation
La mutation est un phénomène assez rare, mais qui doit tout de même être pris en compte.
L’implémentation est très similaire à celle du croisement, excepté le fait que le seul allèle sélectionné ne soit pas échangé mais transformé en 1 s’il vaut 0 et vice versa.
La probabilité de mutation est assez faible, généralement comprise entre 0.1% et 1%.
La mutation permet, pour une population assez grande, d’éviter une convergence prématurée :
en effet, elle change au moins le génotype d’un individu, même ponctuellement, ce qui relance
entièrement le processus.
9
Il a également été prouvé que l’opérateur de mutation, dans l’analyse mathématique du problème,
était fondamental pour la convergence vers un optimum global.
Ces deux dernières étapes sont illustrées sur la figure (3).
Figure 3 – Analogie entre la biologie et l’algorithmique dans le cas du croisement et de la mutation
3.7
Critère d’arrêt
Généralement, le critère d’arrêt choisi l’est en fonction du temps de calcul : les algorithmes
génétiques n’ont pas vocation à trouver la solution optimale, mais un ensemble de "meilleures
solutions possibles" en un temps limité([5]).
Ici, le critère d’arrêt est différent. Il est défini tel que l’écart entre la valeur maximale de la
fonction d’évaluation et la moyenne des valeurs que prend celle-ci sur l’ensemble de la population
soit inférieur à un 1. Cela signifie que les valeurs prises par la fonction oscillent très peu autour
de sa valeur maximale, donc de l’individu le plus adapté. C’est donc que l’algorithme a convergé
vers une population adaptée de manière optimale au problème.
10
4
4.1
Résultats - Étude de la convergence
Résultats
Nous avons considéré le problème d’optimisation suivant ([2])
Maximiser f(x) = 4x(1-x) sur l’intervalle [0,1[.
Ce problème admet une solution analytique simple en x=0.5.
Le but de ce projet était de vérifier qu’une population de nombres aléatoires compris entre 0
et 1 pouvaient effectivement converger vers la solution connue en suivant simplement les lois de
l’évolution naturelle.
Pour une population assez grande, on obtient bel et bien une convergence, et ce, même pour des
précisions assez grandes (de l’ordre de 10−6 ).
Figure 4 – Distribution de la population à l’instant initial
Figure 5 – Distribution de la population à l’instant final
La comparaison entre les graphes (4) et (5) montre bien que la distribution aléatoire initiale,
11
pour une population de 400 individus ici, a convergé vers 2 possibilités d’optimum, toutes deux très
proches du maximum effectif.
L’erreur commise par l’algorithme est de 0.78% pour le résultats le plus proche, et de 1.6% pour
le plus éloigné, ce qui dénote d’un très bon accord entre l’optimum "naturel" et l’optimum réel.
Cet algorithme est donc efficace.
4.2
Influence de la taille de la population
La théorie prédit que le temps de calcul de l’algorithme croît en nln(n). On constate ici que,
pour une précision de 10−6 , si la population est trop faible, l’algorithme est très lent, et ne converge
éventuellement pas. Entre 100 et 800 individus, l’algorithme converge, mais avec une variation de
temps de calcul inattendue.
En effet, l’algorithme effectue 14 fois plus d’itérations pour 100 individus que pour 800 : le temps
de calcul semble décroître fortement à mesure que la population augmente. Mais si l’on pousse
à 1600 individus, il a tendance à stagner : même si la population tend vers la "bonne" solution, la
précision demandée n’est pas atteinte en un temps acceptable.
Ces résultats sont résumés dans le tableau ci-dessous :
N
50
100
200
400
800
1600
4.3
Nombre d’itérations
non-convergence
12 115
2843
504
863
non-convergence
Influence de la mutation
Pour un nombre d’individus fixé à 400, le pourcentage de mutations a été modifié.
Pour des pourcentages inférieurs à 3.10−3 , on constate que l’échantillon de population est trop
faible pour que la mutation ait un effet : l’algorithme converge donc toujours à la même vitesse.
Pour des pourcentages supérieurs, deux phénomènes se dégagent :
— soit l’algorithme converge plus vite vers des valeurs un peu mois bonnes, à 1/2% de la valeur
exacte cette fois-ci (voir figure (6) ;
— soit il converge beaucoup plus lentement.
Ces résultats sont regroupés dans le tableau ci-dessous :
Pourcentage de mutation
0.1%
1%
2%
3%
4%
5%
12
Nombre d’itérations
504
504
504
90
90
300 727
Figure 6 – Distribution de population à l’instant final avec mutation effective
La lenteur de la convergence quand la mutation est effective et augmente s’explique par le fait
que cette dernière relance ponctuellement le processus en permettant à un ou plusieurs individus,
celui ou ceux qui ont muté, de s’éloigner de la zone dans laquelle l’algorithme commençait à se
focaliser.
La mutation permet donc à l’algorithme de revisiter des zones de son domaine de recherche
afin d’être sûr qu’il n’a pas manqué un individu intéressant lors de ses premières itérations.
Cette opération est donc, comme vu précédemment, à la fois essentielle et coûteuse en temps.
13
5
Conclusion
Nous l’avons vu, un algorithme génétique peut-être un algorithme très efficace pour déterminer
un panel de solutions potentiellement optimales, qui peuvent par la suite être affinées par d’autres
méthodes d’optimisation.
L’avantage, et l’inconvénient, de ce type d’algorithmes, est qu’il cherche une solution "à l’aveugle",
au contraire de méthodes comme le gradient conjugué. Ceci peut faire perdre beaucoup de temps,
mais également révéler des alternatives intéressantes et inattendues. Toutefois, il est possible de
combiner plusieurs algorithmes afin de donner une direction privilégiée à cette méthode de sélection.
Les algorithmes génétiques sont donc une méthode d’optimisation intéressante et tendent à
montrer ce que C. Darwin avait compris il y a 150 ans : le hasard fait bien les choses.
14
Références
[1]
Adaptation In Natural And Artificial Systems. J. H. Holland, 1975.
[2]
J.-M. Alliot. Algorithmes évolutionnaires. 2011. url : http://www.alliot.fr/fgenetic.html.
fr.
[3]
Genetic Algorithms in Search, Optimization, and Machine Learning. D. Goldberg, 1989.
[4]
Intelligence Artificielle et Informatique Théorique. J.-M. Alliot et T. Schiex, 1993.
[5]
V. Magnin. Optimisation et Algorithmes Génétiques. 2008. url : http://magnin.plil.net/spip.
php?rubrique8.
[6]
The Origin of Species. C. Darwin, 1859.
[7]
S. Tollari. Algorithmes génétiques. 2003. url : http://sis.univ- tln.fr/~tollari/TER/
AlgoGen1/node5.html.
15
Téléchargement