Les algorithmes génétiques sont un programme qui cherche la meilleure solution au problème en simulant des processus évolutifs naturels tels que "la survie des plus aptes", traversant les chromosomes et mutation. Cet article présentera brièvement les méthodes d'écriture des algorithmes génétiques, discutera de certains facteurs importants qui doivent être pris en compte lors de la rédaction de vos propres algorithmes et fournissent quelques exemples d'applications pratiques des algorithmes génétiques.
Points clés
Cracking Informations inconnues
Le temps est de 2369 ans, et les humains se sont propagés partout dans la mer des étoiles. Vous êtes un médecin jeune et intelligent stationné dans une base d'étoiles bien animée, animé de voyageurs interstellaires, de marchands et de hors-la-loi occasionnels. Peu de temps après votre arrivée, un commerçant de la base s'est intéressé à vous. Il prétend qu'il n'est qu'un simple tailleur, mais les rumeurs disent qu'il est un agent secret travaillant pour un régime particulièrement mauvais.
Vous commencez à déjeuner ensemble chaque semaine, en discutant des sujets de la politique à la poésie. Même après quelques mois, vous ne savez toujours pas s'il exprime des sentiments romantiques ou prend des secrets (vous n'avez certainement pas de secrets). Peut-être les deux.
Un jour au déjeuner, il vous a mis au défi: "J'ai un message pour vous dire, cher docteur! Je ne peux certainement pas vous dire ce que c'est. Mais je vous le dis, c'est 12 personnages. Ces personnages peuvent être n'importe lequel Lettre, l'espace ou la ponctuation.
Vous êtes retourné au bureau dans la cabine médicale, pensant toujours à ce qu'il vient de dire. Soudain, une expérience de simulation de séquençage de gènes que vous aviez déjà exécutée sur un ordinateur à proximité vous a donné une idée. Vous n'êtes pas un expert en décryptage de mot de passe, mais vous pouvez peut-être utiliser votre expertise en génétique pour déchiffrer ses informations!
Certaines théories
Comme je l'ai mentionné au début, un algorithme génétique est un programme qui utilise des opérations qui entraînent l'évolution pour rechercher des solutions. Après de nombreuses itérations, l'algorithme sélectionne les meilleurs candidats (deviner) à partir d'un ensemble de solutions possibles, les recombines et les vérifications que les combinaisons se rapprochent de la solution. Les pauvres candidats seront rejetés.
Dans la scène ci-dessus, tout personnage du message secret peut être A-Z, l'espace ou la ponctuation de base. Supposons que cela nous donne les 32 caractères suivants "Alphabet": ABCDEFGHIJKLMNOPQRSTUVWXYZ -.,!? eux sont corrects. Il faut trop de temps pour vérifier chaque possibilité. Au lieu de cela, l'algorithme génétique sélectionnera au hasard 12 caractères et demandera au tailleur / espion d'évaluer la proximité du résultat de ses informations. Ceci est plus efficace que les recherches par la force brute, car les scores nous permettent de régler les futurs candidats. La rétroaction nous permet de mesurer la forme physique de chaque supposition et, espérons-le, éviter de perdre du temps dans une impasse. Supposons que nous ayons fait trois suppositions: homlk? Wsrzdj, bgk ka! Qtpxc et xelpocv.xlf!. Le premier candidat a marqué 248,2, le second était de 632,5 et le troisième était de 219,5. La façon dont les scores sont calculées dépend de la situation, dont nous discuterons plus loin, mais supposons maintenant qu'elle est basée sur l'écart entre le candidat et les informations cibles: le score parfait est 0 (c'est-à-dire pas de déviation; le candidat et la cible sont La même chose), un score plus élevé signifie un plus grand écart. Les suppositions avec des scores de 248,2 et 219,5 sont plus proches du contenu des informations secrètes que la supposition avec des scores de 635,5. La future supposition est faite grâce à la combinaison des meilleures tentatives. Il existe de nombreuses façons de combiner les candidats, mais maintenant nous considérons une simple approche de croisement: chaque personnage de la nouvelle supposition a une probabilité de 50-50 copiée du premier ou du deuxième candidat parent. Si nous prenons les deux suppositions de Homlk? Wsrzdj et Xelpocv.xlf!, Alors le premier caractère de notre candidat descendant a une probabilité de 50% de H, une probabilité de 50% de x, et le deuxième caractère sera O ou E, et bientôt. La progéniture peut être bonjour? W.rld!.
générer de nouveaux candidats par croisement
Cependant, si nous n'utilisons que les valeurs du candidat parent, il peut y avoir un problème dans plusieurs itérations: manque de diversité. Si nous avons un candidat se compose de tout ce que A et l'autre se compose de tout B, alors tous les descendants générés par le crossover ne comprendront que A et B. Si la solution comprend C, nous serions malheureux.
Montrez-moi du code! Je soupçonne que compte tenu de la vue d'ensemble avancée et de la liste des termes, vous pourriez être tenté de voir du code en ce moment. Examinons donc un code JavaScript qui résout notre problème d'information secrète. Pendant le processus de lecture, je vous invite à réfléchir aux méthodes qui peuvent être considérées comme un "code de passe-partout" et quelles implémentations sont plus étroitement liées au problème que nous essayons de résoudre: Nous définissons d'abord un objet de données candidat, juste pour coupler les chromosomes avec leurs scores de fitness. Pour plus de commodité, une méthode de tri statique est également attachée; Ensuite, nous avons une classe Geneticalgorithme qui implémente l'algorithme génétique lui-même. Le constructeur utilise des objets qui résolvent divers paramètres requis pour la simulation. Il fournit un moyen de spécifier l'alphabet génétique, les messages cibles et d'autres paramètres qui définissent les contraintes dans lesquelles la simulation s'exécutera. Dans l'exemple ci-dessus, nous nous attendons à une population de 100 candidats par génération. À partir de cela, seulement 40 chromosomes seront sélectionnés pour la reproduction. Nous avons 3% de chances d'introduire une mutation, et lorsqu'elle se produit, nous changerons jusqu'à deux gènes. La valeur des MAXGERATIONS est utilisée comme mesure de protection; Il convient de mentionner que la population, la taille de sélection et le nombre maximal d'âges fournis lors de l'exécution de l'algorithme sont assez petits. Des problèmes plus complexes peuvent nécessiter un espace de recherche plus important, ce qui augmente à son tour l'utilisation de la mémoire de l'algorithme et le temps nécessaire pour fonctionner. Cependant, il est fortement recommandé d'utiliser des paramètres variants plus petits. S'ils deviennent trop gros, nous perdons tout avantage des candidats à l'élevage en fonction de la forme physique, et la simulation commence à devenir une recherche aléatoire. Des méthodes comme RandomInt (), init () et run () peuvent être considérées comme un passe-partout. Mais ce n'est pas parce qu'il y a un passe-partout qu'il n'aura pas un impact pratique sur la simulation. Par exemple, les algorithmes génétiques utilisent fortement le hasard. Bien que la fonction Math.Random () intégrée convient à nos fins, pour d'autres problèmes, vous avez besoin d'un générateur aléatoire plus précis. Crypto.getRandomValues () fournit des valeurs aléatoires cryptographiques plus fortes. Les performances sont également une considération. Je m'efforce d'être clair et facile à comprendre dans cet article, mais n'oubliez pas que l'opération sera répétée. Vous pouvez vous retrouver à micro-optimiser le code dans une boucle, à utiliser des structures de données de mémoire plus efficaces et à aligner le code au lieu de le séparer en fonctions / méthodes, le tout sans égard à votre langage d'implémentation. L'implémentation de calcFitness (), select (), reproduire () et même les méthodes stop () est spécifique au problème que nous essayons de résoudre. CalcFitness () Renvoie une valeur qui mesure la forme physique d'un chromosome basé sur certains critères attendus - dans notre cas, c'est à quel point il correspond bien à un message secret. Le calcul de la forme physique est presque toujours spécifique à la situation; notre implémentation calcule l'erreur quadratique moyenne en utilisant la valeur ASCII de chaque gène, mais d'autres indicateurs peuvent être plus appropriés. Par exemple, je peux calculer la distance de Hamming ou la distance de Levinstein entre deux valeurs et même combiner plusieurs mesures. En fin de compte, il est important que la fonction de fitness renvoie des mesures utiles en fonction du problème à accomplir, pas seulement du booléen "fit" / "non ajusté". SELECT () Méthode démontre une stratégie de sélection d'élite - seuls les candidats les plus appropriés de la population entière sont sélectionnés pour l'élevage. Comme je l'ai mentionné plus tôt, il existe d'autres stratégies, telles que la sélection du tournoi, qui sélectionne le candidat le plus approprié de l'ensemble des candidats individuels dans la population, et la sélection de Boltzmann, qui impose des candidats de plus en plus de plus en plus grands sur la sélection de la pression des candidats. Le but de ces différentes méthodes est de s'assurer que les chromosomes ont la possibilité de livrer des gènes qui pourraient s'avérer bénéfiques plus tard, même si cela peut ne pas être immédiatement apparent. Des descriptions approfondies de ces stratégies de sélection et d'autres, ainsi que d'exemples implémentations, sont facilement trouvées en ligne.
Application pratique de l'algorithme génétique
Jusqu'à présent, vous devriez avoir une compréhension de base de ce que sont les algorithmes génétiques et être suffisamment familier avec leur vocabulaire pour interpréter toutes les ressources que vous pourriez rencontrer dans votre propre recherche. Cependant, la compréhension des théories et des termes n'est que la moitié du travail. Si vous prévoyez d'écrire votre propre algorithme génétique, vous devez également comprendre votre problème spécifique. Avant de commencer, voici quelques questions importantes à vous poser: J'espère que je vous aidera également à comprendre comment les programmes s'inspirent de la nature - non seulement en forme, mais aussi en processus et en fonction. N'hésitez pas à partager vos propres pensées sur le forum. Des questions fréquemment posées sur les algorithmes génétiques Pour atténuer ce risque et maintenir la diversité tout en rétrécissant la portée des solutions, nous pouvons introduire de légers changements. Plutôt que de faire une segmentation 50-50 directement, nous permettons à une petite probabilité de remplacer toute valeur dans l'alphabet. Grâce à cette mutation, la progéniture peut devenir Hello World !.
La mutation
// ... (Candidate class and GeneticAlgorithm class code as provided in the original text) ...
Description de la stratégie de croisement en K
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!