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