Algorithme génétique Python pour trouver des extrema globaux

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é:

  1. 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).
  2. 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

f(x,y)=sin(x)+cos(y)











Test 2

4x−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 3

g(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 1

f(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 2

g(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)

All Articles