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