Contexte
Récemment, dans le cadre d'activités de formation, j'ai eu besoin d'utiliser le bon ancien algorithme génétique afin de trouver les fonctions minimum et maximum de deux variables. Cependant, à ma grande surprise, il n'y avait pas d'implémentation similaire sur python sur Internet, et cette section n'était pas couverte dans l'article Wikipedia sur l'algorithme génétique.
J'ai donc décidé d'écrire mon petit package en Python avec une visualisation de l'algorithme, selon lequel il sera commode de configurer cet algorithme et de rechercher les subtilités du modÚle sélectionné.Dans ce court article, je voudrais partager le processus, les observations et les résultats.Le principe de l'algorithme
Je ne parlerai pas du principe global du travail des algorithmes génétiques, mais si vous n'en avez pas entendu parler, alors vous pourrez vous familiariser avec lui sur Wikipédia .Pour le moment, le package implémente une seule GA, qui est paramétrée par les données d'entrée via un guiche simple. Je vais vous parler briÚvement des fonctions génétiques sélectionnées et des solutions algorithmiques de base.L'individu monochromosomal porte dans chacun de ses gÚnes des informations sur la coordonnée x ou y correspondante. Une population est déterminée par de nombreux individus, mais la population est segmentée en 4 individus. Cette solution, bien sûr, est due à une tentative d'éviter la convergence vers un optimum local, car la tùche est de trouver un extremum global. Une telle partition, comme l'a montré la pratique, dans de nombreux cas ne permet pas à un génotype de dominer dans l'ensemble de la population, mais au contraire donne à «l'évolution» une plus grande dynamique. Pour chacune de ces parties de la population, l'algorithme suivant est appliqué:- La sélection s'effectue de maniÚre similaire à la méthode de classement. 3 individus sont sélectionnés avec les meilleurs indicateurs de fonction de fitness (c'est-à -dire que les individus sont triés dans l'ordre croissant / décroissant de la fonction définie par l'utilisateur, qui agit comme la fonction d'adaptation).
- Ensuite, la fonction de croisement est appliquée de maniÚre à ce qu'une nouvelle génération (ou plutÎt un nouveau segment d'une population de 4 individus) reçoive 2 paires de gÚnes non muets d'un individu avec une meilleure indication de la fonction fitness et une paire de gÚnes mutés de deux autres individus. Plus d'informations sur la compilation de la fonction de mutation seront écrites dans la section suivante.
Le principe de fonctionnement de la sélection, du croisement et de la mutation ressemble clairement à ceci (dans la génération N, les chromosomes des individus sont déjà triés dans le bon ordre, et un petit carré noir signifie mutation):
Tests et observations primaires
Nous testons donc cet algorithme sur deux exemples simples:Test 1


Test 24xâ5y3x2+2y2â2x+1



AprÚs avoir testé et étudié le fonctionnement de l'algorithme par la méthode du regard et du poke aléatoire, plusieurs hypothÚses-schémas ont été révélées:- L'erreur de l'algorithme est directement proportionnelle au nombre d'individus, mais en moyenne l'erreur est calculée au centiÚme, bien qu'avec des paramÚtres infructueux, l'erreur peut atteindre des dixiÚmes
- à l'heure actuelle, une mutation se produit en ajoutant un nombre aléatoire du demi-intervalle au gÚne
[â1,1)
en raison de laquelle les individus ne peuvent pas rester au voisinage de l'extremum et une fluctuation relativement forte se produit dans la distance entre les individus de diffĂ©rentes gĂ©nĂ©rations. Dans certains cas, de telles oscillations peuvent ĂȘtre utiles pour sortir d'un extremum local, par exemple, une fonction pĂ©riodique, mais les extrema peuvent ĂȘtre trĂšs Ă©loignĂ©s les uns des autres (distance au sens euclidien) - Dans de nombreux cas, le point extremum est atteint par des individus sur 5 Ă 15 gĂ©nĂ©rations, et les gĂ©nĂ©rations restantes «sautent» inutilement au voisinage de cet extremum
- La génération zéro est remplie de nombres aléatoires uniquement dans un carré
[â1,1)â[â1,1)
et il peut y avoir des cas oĂč ce carrĂ© recouvre un extremum local, ce qui ne nous convient pas
ConsidĂ©rons une surface avec de nombreux extrema de la forme:g(x,y)=âi=1nfn(h,x0,y0),f(h,x0,y0)=hâexp(â(xâx0)2â(yây0)2)
Les extrema de la fonction g seront aux points(x0,y0)
.Test 3g(x,y)=f1(2,0,0)+f2(5,3,3)
g(x,y)=2exp(âx2ây2)+5exp(â(xâ3)2â(yâ3)2)
Cet exemple confirme et illustre toutes les observations ci-dessus.Mise à niveau de l'algorithme génétique
Donc, pour le moment, la fonction de mutation est composĂ©e trĂšs primitivement: elle ajoute des valeurs alĂ©atoires Ă partir du demi-intervalle[â1,1)
au gÚne muté. Une telle invariance de mutation interfÚre parfois avec le bon fonctionnement de l'algorithme, mais il existe un moyen efficace de corriger ce défaut.Nous introduisons un nouveau paramÚtre, que nous appellerons la «plage de mutation» et qui montrera dans quel demi-intervalle le gÚne mute. Faisons en sorte que ce coefficient de mutation soit inversement proportionnel au nombre de générations. Ceux. plus le nombre de générations est élevé, plus les gÚnes muteront faibles. Cette solution vous permet de personnaliser la zone de départ et d'améliorer la précision des calculs si nécessaire.Test 1f(x,y)=sinx


Comme le montre l'exemple, maintenant, Ă chaque gĂ©nĂ©ration, la population converge de plus en plus vers un point extremum et calcule les valeurs les plus prĂ©cises en raison de faibles fluctuations.Mais qu'en est-il du problĂšme des extrĂȘmes locaux? Prenons un exemple familier.Test 2g(x,y)=f1(2,0,0)+f2(5,3,3)
g(x,y)=2exp(âx2ây2)+5exp(â(xâ3)2â(yâ3)2)



Nous voyons que maintenant l'idée de diviser la population en parties fonctionne comme prévu. Sans cette segmentation, les individus des premiÚres générations pourraient révéler un faux génotype dominant à un extremum local, ce qui conduirait à une réponse incorrecte dans la tùche. On note également une amélioration qualitative de la précision de la réponse en raison de la dépendance introduite de la mutation sur le nombre de générations.Sommaire
Je résume le résultat:...
- , . , , aka
- Comparaison dans le temps et l'efficacité d'algorithmes similaires avec des méthodes d'optimisation standard, par exemple, descente de gradient
- Nouvelles fonctionnalités du package (probablement)