Projet d`optimisation

Transcription

Projet d`optimisation
Projet d’optimisation
Introduction aux algorithmes génétiques
Thibault XAVIER
November 13, 2015
Contents
1 Notions générales et hérédité
1.1 Principe général . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 La stratégie "1+1" . . . . . . . . . . . . . . . . . . . . . . . .
3
3
3
2 Construction d’un algorithme génétique
2.1 Nouvel exemple . . . . . . . . . . . . . .
2.2 Création et évaluation de la population
2.3 Formation des paires . . . . . . . . . . .
2.4 Croisement, itération et algorithme . . .
6
6
7
8
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Analyse des résultats et améliorations
11
3.1 Premier test . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2 Performance de l’algorithme et prévision. . . . . . . . . . . . 12
3.3 Possibilités et champs d’application. . . . . . . . . . . . . . . 15
1
Introduction
Face à des problèmes d’optimisation, plusieurs méthodes numériques ont été
évoquées en cours. Si des résolutions par des méthodes «mathématiques»
(du type gradient conjugué) sont possibles, elles ne sont pas toujours adaptées et efficaces pour tous les problèmes. Comment alors peut-on procéder
différemment à une optimisation? Dans les années 50, un groupe de scientifique de l’université du Michigan découvre qu’une réponse peut se trouver
devant nos yeux: la nature. En effet, la nature exprime à elle seule une optimisation permanente: les espèces qui vivent aujourd’hui sont celles qui sont
les plus adaptées à leur milieu. Les individus se reproduisent, leur génome
subit des mutations qui leur sont favorables ou pas, puis la sélection naturelle fait son office pour nous présenter, après des millions de générations,
cette «solution» qu’est l’ensemble du monde vivant.
De cette observation sont nés les algorithmes génétiques, qui exploitent
exactement le même principe. Une optimisation multi-critères, procédant
par itération, avec mutations et sélection (le vocabulaire de la biologie est
conservé). L’objectif de ce rapport est de faire une introduction à ce type
d’algorithme, d’en présenter les intérêts, et de s’essayer à l’écriture d’un
programme.
Charles Darwin “Quand je pense à mes adorables orchidées, avec leurs
cinq commencements d’anthères, avec leur unique pistil transformé en rostellum, avec toute la cohésion de leurs parties, il me semble incroyablement
monstrueux de regarder une orchidée comme si elle avait été créée telle que
nous la voyons aujourd’hui. ”
2
Chapter 1
Notions générales et hérédité
1.1
Principe général
Comme énoncé en introduction, le principe d’algorithme génétique s’appuie
sur ce qui est à œuvre dans la nature. Des individus d’une population
s’accouplent, et leurs enfants possèdent un patrimoine génétique issu de leurs
deux parents (héritage). Il peut également survenir un certain nombre
de mutations, aléatoires. Enfin, une sélection est faite sur la nouvelle
génération selon un ou plusieurs critères. L’ensemble du processus est un
processus d’évolution
1.2
La stratégie "1+1"
Commençons par présenter une première stratégie d’évolution, appelée «stratégie
d’évolution 1+1». Cette méthode exploite le concept d’héritage depuis un
parent et de mutation. Un individu parent possède un certain patrimoine
génétique qu’il va transmettre à son enfant, mais chaque gène va subir une
petite mutation aléatoire. On évalue alors la «performance» de l’enfant par
rapport à un ou plusieurs critère. S’il est meilleur que le parent, il survit,
sinon, on revient au parent. De générations en générations, on espère alors
converger vers un individu «optimal» vis à vis des critères fixés.
Appliquons ceci à la minimisation d’une fonction de plusieurs variables
très simple
f = x2 + y 2 + z 2
(1.1)
dont le minimum 0 est obtenu en (0,0,0)
Nous partons d’un parent [2,3,4], et nous allons créer le premier individu
en procédant à des mutations. Ces mutations sont symbolisés par un tirage
aléatoire de x,y,z d’après une loi normale centrée sur [2,3,4] et de variance
varx,vary,varz qui vont représenter l’amplitude des mutations.
3
Figure 1.1: Tirage proche de l’optimum
On regarde ensuite si l’enfant est plus performant que son parent: si
c’est le cas, on se basera sur lui pour procéder à la génération suivante (c’est
l’étape de sélection).
f(Xchild ) < f(Xparent ) ?
Le script matlab est fourni en annexe. Le lecteur est invité à le faire
tourner en changeant les données utilisateurs (amplitude des mutations, parent initial et nombre de générations).
On peut faire quelques commentaires sur les résultats donnés par le code.
• Le résultat converge vers la solution, mais est sensible à la présence
de minima locaux (ce qui n’est pas le cas pour la fonction choisie,
mais évident d’après la construction de l’algorithme). Pour palier à ce
problème, on peut prendre plusieurs parents initiaux, mais il ne sera
jamais garanti d’avoir atteint le minimum global.
• La finesse du résultat obtenu, ainsi que la vitesse de convergence,
dépend du nombre d’itération et de la variance choisie. Au début du
calcul, on améliore le résultat très régulièrement (si le parent initial est
loin de l’optimum), mais petit à petit, la fréquence des améliorations
diminue. En effet proche de l’optimum, il y a peu de chance que le
nouveau tirage soit meilleur, comme l’illustre la Figure 1.1:
4
On se rend bien compte que la finesse du résultat dépend alors directement de la variance. Pour pouvoir approcher le résultat, il est «nécessaire»
de procéder par petites mutations. En réalité, même à grande variance, on
continuera de converger vers l’optimum, mais il faudra un nombre d’itération
conséquent (il sera très peu probable que la mutation soit favorable). Un
algorithme optimisé serait d’accorder la variance à l’écart à la solution (par
exemple: si on ne trouve pas d’enfant meilleur après 15 générations, on
diminue la variance).
5
Chapter 2
Construction d’un
algorithme génétique
L’algorithme précédent mettait en avant la notion d’héritage et de mutation
qui sont en place dans les algorithmes génétiques. Cependant, ces notions
ne sont pas, présentées ainsi, représentatives de ce qui se passe dans la
nature. En effet, dans la nature, le patrimoine génétique de l’enfant est
celui des deux parents, et on ne raisonne pas sur un individu seul mais sur
une population. Des croisements ont lieu entre des individus au patrimoine
génétique différent. La sélection est donc une étape à exprimer différemment
(si on sélectionne uniquement le meilleur à chaque génération, on perd toute
la diversité génétique et donc les possibilités d’optimisations).
Reprenons donc un exemple similaire au précédent, à savoir un exemple
de minimisation de fonction, mais en adoptant cette nouvelle approche.
2.1
Nouvel exemple
On cherche à maximiser la fonction f :
f(x) = - (x-46)2 + 50000
en cherchant parmi les entiers compris entre 0 et 255, c’est à dire les
entiers que l’on peut coder sur 8bits. On va être amené à utiliser la notation
binaire de ces entiers, et il convient d’être au clair sur sa mise en œuvre.
Le paragraphe suivant est un rappel du principe de conversion entre une
notation décimale et binaire.
Un entier peut être défini par une suite de symboles, ne pouvant prendre
pour valeur que 1 ou 0. Ces symboles sont appelés «bits» (ou en anglais
binary digit). Un nombre est obtenu en faisant la somme des 2n-1 où n
correspond à la valeur du n-ième bit.
6
Par exemple, le nombre 117 peut s’écrire
0*27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 24 + 0 ∗ 23 + 1 ∗ 22 + 0 ∗ 21 + 1 ∗ 20
Sur 8 bits, on écrira donc 117 comme 01110101.
2.2
Création et évaluation de la population
L’écriture en bits va nous permettre de mettre en place notre algorithme
génétique. En effet, on va considérer que chaque bits est un gène. Un
groupe de gène est porté par un chromosome, l’ensemble des chromosomes
déterminant un individu. Pour notre exemple, on va considérer que chaque
individu comporte 2 chromosomes (A et B), et que chaque chromosome porte
4 gènes. Par exemple, «l’individu» 117 va être décrit par:
- Chromosome A: 0111
- Chromosome B: 0101
Prenons, pour l’exemple, une population de 4 individus générés aléatoirement (qu’on généralisera à n) :
204: 1100|1100
19: 0001|0011
142: 1000|1110
56: 0011|1000
Ces 4 individus constituent la première génération et leur patrimoine
génétique va être utilisé pour créer la génération suivante. On va former
2 paires (Npaires) d’individus. Mais comment choisir ces paires? C’est
là qu’intervient l’étape de sélection, et plusieurs méthodes existent. Dans
tous les cas, on a besoin d’évaluer la «qualité» de chaque individu. Dans
notre exemple, c’est simplement l’entier dont l’image par f est la plus grande
(puisqu’on cherche à maximiser la fonction).
Table 2.1: Evaluation des 4 nombres
Nombre f(nombre) Fréquence Classement
204
25036
15.17 %
4
19
49271
29.86 %
2
142
40784
24.73 %
3
56
49900
30.24 %
1
7
2.3
Formation des paires
Pour former les paires, on peut choisir plusieurs méthodes. Nous allons les
lister rapidement en présentant leurs avantages et inconvénients.
La première consiste à ne pas prendre en compte les performances de
chaque individu en formant les paires de manière aléatoire (sélection uniforme). Cette méthode, même si elle est la plus simple à implémenter, est
rejetée car elle ne comporte pas véritablement d’intérêt ni de sens physique.
La seconde méthode consiste à ne sélectionner que les meilleurs individus de la population (on en fixe le nombre) pour créer la génération suivante (Élitisme). Cette solution peut paraître attrayante (elle avance une
bonne vitesse de convergence), néanmoins elle écarte rapidement les individus les moins performants, et donc réduit considérablement la diversité
génétique. Hors, cette diversité génétique peut permettre de créer des solutions intéressantes supplémentaires (on y reviendra plus bas). Une variante
est la sélection dite par tournoi, dans laquelle on forme plusieurs groupe
de manière aléatoire, et on sélectionne le ou les meilleurs éléments, ce qui
permet de mieux prendre en compte les individus moins performants.
Enfin, le dernier type de méthode, et peut-être le plus utilisé de toutes,
est la sélection « par roulette ». Il s’agit simplement d’une sélection par
tirage aléatoire selon une loi non uniforme. En fait, on maximise la probabilité de tirage des éléments les plus performants (roue biaisée). On peut au
choix définir la chance de tirage d’un élément basé sur leur rang ou sur leur
fréquence de performance (ie dans notre cas f(x)/(somme(f(x)) ). On choisira
cette dernière méthode pour l’implémentation dans le code d’optimisation,
car elle n’écarte pas la diversité génétique brutalement comme dans le cas
d’une sélection par élitisme, et représente tout de même bien que les individus les mieux adaptés ont plus de chance de se reproduire.
Il est nécessaire de clarifier que la sélection se fait sur l’ensemble des
individus à chaque tirage, c’est à dire que certains individus peuvent être
sélectionner plusieurs fois (il peut même y avoir clonage), et d’autres peuvent
disparaître. Il y’a donc une probabilité non nulle que les meilleurs individus
ne se reproduisent pas, ce qui peut paraître aberrant pour l’optimisation!
Néanmoins, en pratique, cela ne se produit pas car on prend une population
assez large. De plus certains algorithmes implémentent une «sécurité» en
faisant d’emblée passer le ou les meilleurs individus à la génération suivante
avant d’effectuer les croisements.
8
2.4
Croisement, itération et algorithme
La création des nouveaux individus se fait en croisant les différents chromosomes (dans notre cas, les paquets de 4 bits). A partir d’un couple (A+B), on
peut créer deux enfants on prenant l’un ou l’autre des chromosomes (A1|B2
ou B1|A2). Là aussi plusieurs variantes existent et le croisement pourrait
constituer seul l’objet d’un devoir. On peut en effet choisir de pondérer la
probabilité de choix des chromosomes par les performances de l’individu, ou
encore d’autoriser les recouvrements entre chromosomes (prendre des parties de A et des parties de B pour un même chromosome). On s’astreindra
à une simple croisement.
Enfin, les gènes des enfants ne sont pas exactement ceux issus des parents. En effet, il peut occasionnellement se produire des mutations, qui vont
modifier les gènes. Ces mutations, si on les assimilent généralement à un
phénomène nuisible, peuvent être extrêmement favorable pour l’évolution
(et donc pour l’optimisation) car elles créent de la diversité génétique, ce
qui permet d’élargir le champ des possibles par rapport à la population initiale. On fixera donc une probabilité de mutation par génération et par gène
(de l’ordre du dixième de %, les mutations étant peu fréquentes).
Après avoir créé les enfants, il faut définir la nouvelle population. Il
serait tentant de prendre simplement la nouvelle génération et d’oublier
l’ancienne, ce qui n’est pas en soit une bonne solution, car les nouveaux
individus ne sont pas nécessairement meilleurs que les anciens. Il n’est pas
judicieux d’avoir une population plus grande ou plus petite que l’ancienne.
Dans un cas, le temps de calcul exploserait à chaque génération, et dans
l’autre, la population s’éteindrait rapidement. Il convient donc de conserver
une taille de population fixe, et de procéder à une sélection. Comme pour
déterminer les couples, on faire la sélection de différentes manière, qui vont
conditionner l’efficacité de l’optimisation. Pour notre cas, on fera un tirage
aléatoire pondéré par la performance.
Pour résumer, on va procéder de la sorte avec notre programme Matlab:
• Création des individus initiaux (entier 8bits)
• Sélection (roue biaisée)
• Croisement et mutation
• Sélection de la nouvelle générations
• Itération suivante. . .
9
Les codes Matlab sont fournis en annexe de ce rapport, et l’utilisateur
est invité à lire le programme pour bien en assimiler le fonctionnement, et
à l’essayer en faisant varier les différents paramètres. L’utilisateur peut à
sa convenance modifier la taille d’individus, le nombre de paires à former à
chaque génération, la fréquence de mutation et le nombre de générations à
simuler. Nous allons, dans la partie suivante, s’intéresser au résultat donné
par un essai, et proposer de premières améliorations.
10
Chapter 3
Analyse des résultats et
améliorations
3.1
Premier test
Nous allons faire tourner le code et observer le résultat donné avec les
paramètres suivants :
• Nindividus = 20; %T ailledelapopulation
• npaires = 10; %nombredepaireàf ormerpourlescroisements
• ngen = 100000; %nombred0 itération
• tauxmutation = 0.01; %f réquencedemutation
On obtient, pour un temps d’éxecution de l’ordre de la minute :
Table 3.1: Résultats obtenus
Nombre Occurence
37
1
45
1
53
11
61
4
117
3
On peut observer que la population comporte assez peu d’individus différents, et que certaines espèces ont commencé à proliférer. Au bout de
100 000 générations, l’optimisation suit son cours, et nous pouvons faire un
certains nombres de conclusions et tenter de prévoir la suite du processus.
11
3.2
Performance de l’algorithme et prévision.
Pour les paramètres choisis, l’algorithme est relativement lent à converger.
De plus, la population comporte beaucoup d’individus 53. Parce qu’ils sont
proches de la solution optimale (46) et nombreux, il est probable qu’elle devienne majoritaire et que la quasi-totalité du reste des individus disparaissent.
On peut pronostiquer cette évolution à cause de la méthode de sélection
choisie. En effet, la dernière génération obtenue donne la roue biaisée de
sélection suivante:
Roue biaisée obtenue
Il est donc fort probable que l’espèce 53 s’instaure à terme. De plus, si
une espèce s’instaure, il y a peu de chance que les mutations à elle seules
améliorent la population. En effet, si un nouvel individu est créé, il y’a de
grandes chances qu’il ne soit pas sélectionné.
De ce premier résultat, on peut suggérer des améliorations potentielles
pour notre code.
Premièrement, on peut considérer que l’évaluation de performance est à
revoir. En effet, la performance du nombre 45 et la performance du nombre
37 sont les mêmes. De plus, le nombre 45, même s’il est seul dans la population, devrait avoir une meilleure chance d’être conservé, car il est très
proche de la solution !
12
Le problème vient de deux choses. D’une part, tel qu’il a été écrit, on
peut considérer que le problème est mal conditionné. En effet, on rappelle
que la formule de f est f(x) = (x-46)2 + 50 000. Proche de la solution, l’écart
de valeurs entre f(x) et f(x+dx) est écrasé par l’ajout de la constante 50 000,
comme on peut le voir sur l’évaluation des performance Proba(nombre) sur
la Table 3.2. La seconde raison est bien sûr le processus de sélection lui
même, qui ne conserve pas forcément le meilleur individu: des mauvais
individus, mêmes s’ils sont mauvais, auront de par leur nombre autant de
poids qu’un individu performant. Pour améliorer la convergence, on pourrait
procéder à un élitisme partiel sans pour autant enlever d’emblée tout le
patrimoine génétique. Par exemple, on pourrait sélectionner d’emblée n/10
des meilleurs éléments pour la reproduction. L’avantage est également que
les mutations bénéfiques auraient de meilleures chance de perdurer dans le
temps.
Nombre
53
61
117
45
37
Table 3.2: Probabilité de sélection
Proba(nombre) Occurence Proba totale
0.0508
11
55.88 %
0.0506
4
20.24 %
0.0457
3
13.71%
0.0508
1
5.08%
0.0508
1
5.08%
Enfin, on peut ajuster les différents paramètres. La fréquence de mutation, le nombre d’individus, le nombre de paire, le nombre de génération ont
chacun leur influence. . . Passons les brièvement en revue et essayons nous
à quelques analyses.
Le nombre d’individus conditionne directement le temps de calcul et
l’espace mémoire requis par l’algorithme. Un grand nombre d’individu va
permettre d’avoir de la diversité génétique, et à terme d’obtenir plusieurs
famille de d’individus solution, mais si l’évaluation de la performance de
chaque individu est coûteuse, il faut maintenir n assez petit. Des algorithmes
génétiques complexes fonctionnent avec une dizaine d’individus. Il en est de
même pour le nombre de paire à former.
13
Le nombre de génération est à maximiser, car l’algorithme tend à donner
les optima locaux pour un grand nombre de génération. Néanmoins, là
aussi, tout dépend du temps de calcul dont l’utilisateur dispose. De plus,
l’optimisation va être dirigée par différents phénomènes au cours du temps:
• Dans les premières générations, le croisement entre des individus différents va permettre de balayer rapidement une grande gamme d’individus
possible et de procéder à une amélioration grossière.
• En se rapprochant de plus en plus de la solution, les individus vont
devenir viable et les améliorations auront principalement lieu par mutation. La convergence est donc plus lente, sauf si on applique des
sélections drastiques (élitisme, . . . ).
La fréquence de mutation a une importance majeure, car elle dirige
l’optimisation en fin de processus. Néanmoins, il faut conserver une fréquence
de mutation modérée pour ne pas dénaturer complètement les solutions
obtenues! Dans la pratique, on conserve cette fréquence à l’ordre du
Enfin, un paramètre capital dont nous n’avons pas encore parlé est le
nombre de chromosomes. En effet, nous avons pour l’étude diviser le nombre
en 2 chromosomes. Le premier contient les grandes puissances de 2 dans le
codage en binaire, et va donc être ajusté rapidement. Le second correspond
à des réglages plus fins (de 0 à 15) et va donc être plus difficile à sélectionner.
On pourrait donc fractionner les ensembles de gènes en plusieurs morceaux,
ce qui élargirait d’emblée les variations génétiques possible (au détriment du
temps de calcul).
14
3.3
Possibilités et champs d’application.
L’objet de la partie précédente était de mettre en place un premier algorithme génétique et de s’en approprier le fonctionnement. Néanmoins, la
force d’un algorithme génétique n’est pas visible dans un cas aussi d’une
maximisation de fonction à un paramètre.
En effet, nous avons vu une manière de coder un individu en passant
par des bits, et que ce codage permettait facilement de mettre en place une
approche «biologique» (échange de chromosomes, mutations, etc.). Or il est
possible de binariser de vastes variétés d’objets.
Par exemple, on pourrait imaginer décrire un individupar une chaîne de
bits:
• Premier gène «alimentation» (3bits): 111 dans le cas carnivore, 000
dans le cas herbivore (les nombres intermédiaires représenteraient un
régime mixte plus ou moins carnivore).
• Second gène « Présence de branchie »(1bit): 1 ou 0
• Troisième gène «Nombre de pattes»(3bits): entre 110 et 000
• ...
On va donc pouvoir très facilement accéder à une optimisation multicritères. L’enjeu est alors de correctement évaluer les individus créés.
Aujourd’hui, les algorithmes génétiques sont très utilisés dans le domaine
de l’intelligence artificielle, de la reconnaissance de forme, mais également
comme approche pour la résolution de problèmes d’optimisation scientifique,
notamment sur des problèmes multi-critères.
15
Conclusion
En conclusion, les algorithmes génétiques représentent une nouvelle fois la
force du bio-mimétisme. Observer et imiter la nature, qui elle a eu des
millions de générations pour résoudre un des problèmes d’optimisation les
plus complexes qu’on puisse envisager, celui de la vie. Une réflexion rapide
rappelle la quantité incroyable de critères dont peuvent dépendre la survie
des espèces, ou guider leur processus d’adaptation.
La puissance de l’outil informatique permet de simuler ces évolutions de
générations en générations en des temps très courts (comparés aux temps biologiques) et de modifier à notre guise les différents paramètres de l’évolution.
En plus d’une certaine beauté, ces algorithmes ont démontré une très
bonne efficacité dans des cas complexes, ce qui tend à vouloir poursuivre
leur développement.
En guise de source, je citerai le travail de recherche bibliographique et de
vulgarisation effectué sur http://khayyam.developpez.com/articles/algo/genetic/.
Merci également à Léo Grasset pour sa chaîne DirtyBiology ainsi qu’aux
auteurs de Pause Process, qui vulgarisent avec brio et humours les questions
de sciences ou d’informatique, et qui m’ont très largement inspiré ce sujet
de travail.
16