web-dev-qa-db-fra.com

Quels sont de bons exemples d'algorithmes génétiques / solutions de programmation génétique?

algorithmes génétiques (GA) et programmation génétique (GP) sont des domaines de recherche intéressants.

J'aimerais connaître les problèmes spécifiques que vous avez résolus avec GA/GP et les bibliothèques/frameworks que vous avez utilisés si vous ne les utilisiez pas vous-même.

Des questions:

  • Quels problèmes avez-vous utilisé GA/GP pour résoudre?
  • Quelles bibliothèques/frameworks avez-vous utilisé?

Je recherche des expériences de première main, alors ne répondez que si vous en avez.

225
knorv

Pas devoirs.

Mon premier travail en tant que programmeur professionnel (1995) consistait à écrire un système de trading automatisé basé sur un algorithme génétique pour les contrats à terme S & P500. L’application a été écrite en Visual Basic 3 [!] Et je n’ai aucune idée de la façon dont j’ai fait quoi que ce soit à l’époque, car VB3 n’avait même pas de cours.

L’application a commencé avec une population de chaînes de longueur fixe générées aléatoirement (la partie "gène"), chacune correspondant à une forme spécifique dans les données de prix minute par minute des contrats à terme S & P500, ainsi qu’à un ordre spécifique. (achat ou vente) et les montants stop-loss et stop-profit. Les performances de chaque chaîne (ou "gène") ont été évaluées sur une période de trois années de données historiques. chaque fois que la "forme" spécifiée correspond aux données historiques, je supposais l'ordre d'achat ou de vente correspondant et évaluais le résultat de la transaction. J'ai ajouté la mise en garde que chaque gène commençait avec une somme d'argent fixe et pouvait donc potentiellement faire faillite et être entièrement retiré du pool de gènes.

Après chaque évaluation d'une population, les survivants ont été croisés de manière aléatoire (en mélangeant simplement des bits de deux parents), la probabilité qu'un gène étant sélectionné en tant que parent étant proportionnelle au profit qu'il produisait. J'ai également ajouté la possibilité de mutations ponctuelles pour pimenter un peu les choses. Après quelques centaines de générations, je me suis retrouvé avec une population de gènes pouvant transformer 5 000 dollars en une moyenne d’environ 10 000 dollars sans risque de mort/fracture (sur la base de données historiques, bien sûr).

Malheureusement, je n’ai jamais eu la chance d’utiliser ce système en direct, mon patron ayant perdu près de 100 000 dollars en moins de trois mois, perdant ainsi toute volonté de poursuivre le projet. Rétrospectivement, je pense que le système aurait généré d’énormes profits - non pas parce que je faisais nécessairement quelque chose de bien, mais parce que la population de gènes que j’ai produite s’avérait biaisée vers les ordres d’achat (par opposition aux ordres de vente) d’environ 5: 1 ratio. Et comme nous le savons avec notre recul de 20/20, le marché a légèrement augmenté après 1995.

142
MusiGenesis

J'ai fait un peu de bestioles qui vivaient dans ce petit monde. Ils avaient un cerveau de réseau de neurones qui recevait certaines contributions du monde et la sortie était un vecteur de mouvement parmi d'autres actions. Leurs cerveaux étaient les "gènes".

Le programme a commencé avec une population aléatoire de créatures aux cerveaux aléatoires. Les neurones d'entrée et de sortie étaient statiques, mais ce qui était entre les deux ne l'était pas.

L'environnement contenait de la nourriture et des dangers. La nourriture a augmenté d'énergie et quand vous avez assez d'énergie, vous pouvez vous marier. Les dangers réduiraient l'énergie et si l'énergie était égale à 0, ils mourraient.

Finalement, les créatures ont évolué pour se déplacer dans le monde, trouver de la nourriture et éviter les dangers.

J'ai alors décidé de faire une petite expérience. J'ai donné à la créature un neurone de sortie appelé "bouche" et un neurone d'entrée appelé "oreille". Recommencé et étonné de constater qu'ils ont évolué pour maximiser l'espace et que chaque créature respective resterait dans sa partie respective (la nourriture était placée au hasard). Ils ont appris à coopérer les uns avec les autres et à ne pas se faire mutuellement. Il y a toujours eu des exceptions.

Ensuite, j'ai essayé quelque chose d'intéressant. Les créatures mortes deviendraient de la nourriture. Essayez de deviner ce qui s'est passé! Deux types de créatures ont évolué, l'une qui attaquait comme un essaim et l'autre qui évitait fortement.

Alors, quelle est la leçon ici? Communication signifie coopération. Dès que vous introduisez un élément où blesser un autre signifie gagner quelque chose, la coopération est détruite.

Je me demande comment cela se répercute sur le système des marchés libres et du capitalisme. Je veux dire, si les entreprises peuvent nuire à leur concurrence et s'en tirer , il est clair qu'elles feront tout ce qui est en leur pouvoir pour nuire à la concurrence.

Modifier:

Je l'ai écrit en C++ sans utiliser de framework. Écrit mon propre réseau neuronal et le code GA. Eric, merci de dire que c'est plausible. Les gens ne croient généralement pas dans les pouvoirs de GA (bien que les limitations soient évidentes) jusqu'à ce qu'ils jouent avec. GA est simple mais pas simpliste.

Pour les sceptiques, les réseaux de neurones se sont avérés capables de simuler n'importe quelle fonction s'ils avaient plus d'une couche. GA est un moyen assez simple de naviguer dans un espace de solution en recherchant un minimum local et potentiellement global. Combinez GA avec des réseaux de neurones et vous aurez un très bon moyen de trouver des fonctions qui trouvent des solutions approximatives à des problèmes génériques. Parce que nous utilisons des réseaux de neurones, nous optimisons la fonction pour certaines entrées et non certaines entrées d'une fonction car d'autres utilisent GA.

Voici le code de démonstration pour l'exemple de survie: http://www.mempko.com/darcs/neural/demos/eaters/ Instructions de construction:

  • Installez darcs, libboost, liballegro, gcc, cmake, make
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

Eaters Screenshot

89
mempko

J'ai utilisé un GA pour optimiser la répartition des places lors de la réception de mon mariage. 80 invités sur 10 tables. La fonction d'évaluation consistait à tenir les gens avec leurs dates, à mettre ensemble des personnes ayant quelque chose en commun et à garder des personnes avec des opinions opposées extrêmes à des tables séparées.

Je l'ai couru plusieurs fois. À chaque fois, j'ai eu neuf bonnes tables et une avec toutes les boules impaires. En fin de compte, ma femme s’est occupée des sièges.

L’optimiseur de mon voyagiste a utilisé une nouvelle cartographie des chromosomes pour établir un itinéraire, ce qui rendait triviale la reproduction et la mutation des chromosomes sans risque de générer des tournées non valides.

Mise à jour: Parce qu'un couple de personnes a demandé comment ...

Commencez avec un éventail d'invités (ou de villes) dans un ordre arbitraire mais cohérent, par exemple, par ordre alphabétique. Appelez cela la solution de référence. Pensez à l'index d'un invité comme son numéro de siège.

Au lieu d'essayer de coder cette commande directement dans le chromosome, nous codons des instructions pour transformer la solution de référence en une nouvelle solution. Plus précisément, nous traitons les chromosomes comme des listes d’index dans la matrice à permuter. Pour décoder un chromosome, nous commençons par la solution de référence et appliquons tous les swaps indiqués par le chromosome. L'échange de deux entrées dans le tableau donne toujours une solution valable: chaque invité (ou ville) apparaît toujours exactement une fois.

Ainsi, les chromosomes peuvent être générés aléatoirement, mutés et croisés avec d’autres et produiront toujours une solution valable.

49
Adrian McCarthy

En janvier 2004, j'ai été contacté par Philips New Display Technologies, qui créait les composants électroniques du tout premier encre électronique commerciale, le Sony Librie, sorti uniquement au Japon, bien avant que le Kindle Kindle et les autres ne soient commercialisés aux États-Unis. une Europe.

Les ingénieurs de Philips ont eu un problème majeur. Quelques mois avant que le produit ne soit censé arriver sur le marché, ils perdaient toujours des images fantômes à l'écran lorsqu'ils changeaient de page. Le problème était les 200 pilotes qui créaient le champ électrostatique. Chacun de ces pilotes avait une certaine tension qui devait être réglée entre zéro et 1000 mV ou quelque chose comme ça. Mais si vous en changiez un, cela changerait tout.

Il était donc hors de question d'optimiser la tension de chaque conducteur individuellement. Le nombre de combinaisons possibles de valeurs était en milliards et il fallait environ 1 minute à une caméra spéciale pour évaluer une seule combinaison. Les ingénieurs avaient essayé de nombreuses techniques d'optimisation standard, mais rien ne s'en allait de près.

L'ingénieur en chef m'a contacté parce que j'avais déjà publié une bibliothèque de programmation génétique à la communauté du logiciel libre. Il m'a demandé si les généralistes et les médecins pourraient m'aider et si je pouvais participer. C'est ce que j'ai fait et pendant environ un mois, nous avons travaillé ensemble. Moi, nous avons écrit et optimisé la bibliothèque GA, sur des données synthétiques, et l'avons intégré dans leur système. Ensuite, un week-end, ils l'ont laissé vivre en direct avec la vraie chose.

Le lundi suivant, j'ai reçu ces courriels de lui et de leur concepteur en matériel informatique, expliquant comment personne ne pouvait croire les résultats étonnants trouvés par GA. C'était ça. Plus tard cette année, le produit a frappé le marché.

Je n'ai pas été payé un centime pour cela, mais j'ai eu le droit de me vanter. Ils ont dit dès le début qu'ils avaient déjà dépassé leur budget, alors je savais quelle était la transaction avant de commencer à y travailler. Et c'est une belle histoire pour les applications des GA. :)

49
adi

J'ai utilisé des algorithmes génétiques (ainsi que des techniques connexes) pour déterminer les meilleurs paramètres pour un système de gestion des risques qui essayait d'empêcher les producteurs d'or d'utiliser des cartes de crédit volées pour payer des MMO. Le système accepterait plusieurs milliers de transactions avec des valeurs "connues" (fraude ou non) et déterminerait quelle était la meilleure combinaison de paramètres pour identifier correctement les transactions frauduleuses sans trop de faux positifs.

Nous avions des données sur plusieurs douzaines de caractéristiques (booléennes) d'une transaction, chacune ayant reçu une valeur et totalisé. Si le total était supérieur à un seuil, la transaction était une fraude. Le GA crée un grand nombre d'ensembles de valeurs aléatoires, les compare à un corpus de données connues, sélectionne ceux qui obtiennent les meilleurs résultats (à la fois pour la détection de fraude et pour la limitation du nombre de faux positifs), puis croisez les meilleurs candidats de chaque génération pour former une nouvelle génération de candidats. Après un certain nombre de générations, le meilleur ensemble de valeurs a été considéré comme gagnant.

Créer le corpus de données connues à tester était le talon d’Achille du système. Si vous attendiez des rétrofacturations, vous essuyiez plusieurs mois de retard lorsque vous tentez de répondre aux escrocs. Une personne doit donc examiner manuellement un grand nombre de transactions pour constituer ce corpus de données sans attendre trop longtemps.

Cela a finalement permis d'identifier la grande majorité des fraudes commises, mais il n'a pas pu être inférieur à 1% sur les éléments les plus exposés à la fraude (sachant que 90% des transactions entrantes pourraient être frauduleuses, cela se passait plutôt bien).

J'ai fait tout cela en utilisant Perl. Une exécution du logiciel sur une machine Linux relativement ancienne prend entre 1 et 2 heures (20 minutes pour charger des données sur un lien WAN, le reste du temps consacré au traitement). La taille de toute génération donnée était limitée par la RAM disponible. Je le répétais sans cesse avec de légers changements dans les paramètres, à la recherche d'un ensemble de résultats particulièrement satisfaisant.

Dans l’ensemble, il a évité certaines des gaffes associées à une tentative manuelle d’ajuster les valeurs relatives de dizaines d’indicateurs de fraude et a constamment proposé de meilleures solutions que celles que je pouvais créer à la main. Autant que je sache, il est toujours utilisé (environ 3 ans après que je l'ai écrit).

33
edebill

En plus de certains problèmes courants, comme le voyageur de commerce et une variante de programme Mona Lisa de Roger Alsing , j'ai aussi écrit n résolveur de Sudoku évolutif (qui nécessitait une pensée un peu plus originale de ma part, plutôt que de ré-implémenter l’idée de quelqu'un d’autre). Il existe des algorithmes plus fiables pour résoudre les Sudokus, mais l'approche évolutive fonctionne assez bien.

Ces derniers jours, j'ai joué avec un programme évolutif pour trouver des "jeux froids" pour le poker après avoir vu cet article sur Reddit. Ce n'est pas tout à fait satisfaisant pour le moment mais je pense pouvoir l'améliorer.

J'ai mon propre framework que j'utilise pour les algorithmes évolutifs.

21
Dan Dyer

Basculement de football. J'ai construit un système GA permettant de prédire le résultat semaine après semaine des matchs de l'AFL (Football Australien).

Il y a quelques années, je m'ennuyais de la piscine de football de travail standard, tout le monde se contentait de se connecter et de prendre les sélections de certains experts dans la presse. Donc, je me suis dit qu'il ne pourrait pas être trop difficile de battre un groupe de journalistes spécialisés dans le domaine de l'audiovisuel, n'est-ce pas? Ma première pensée a été de prendre les résultats de Massey Ratings , puis de révéler à la fin de la saison ma stratégie après avoir gagné la gloire et la gloire. Cependant, pour des raisons que je n'ai jamais découvertes, Massey ne suit pas AFL. Le cynique en moi croit que c'est parce que le résultat de chaque jeu AFL est devenu essentiellement une chance aléatoire, mais mes plaintes concernant les récents changements de règles appartiennent à un forum différent.

Le système tenait essentiellement compte de la force offensive, de la force défensive, de l’avantage du terrain, de l’amélioration d’une semaine sur l’autre (ou de son absence) et de la vitesse de changement de chacun d’eux. Cela a créé un ensemble d'équations polynomiales pour chaque équipe au cours de la saison. Le gagnant et le score de chaque match pour une date donnée peuvent être calculés. L'objectif était de trouver l'ensemble de coefficients qui correspondait le mieux au résultat de tous les jeux précédents et d'utiliser cet ensemble pour prédire le match de la semaine à venir.

En pratique, le système trouverait des solutions permettant de prédire avec précision plus de 90% des résultats du jeu précédent. Il serait alors possible de sélectionner environ 60 à 80% des jeux pour la semaine à venir (c’est-à-dire la semaine ne faisant pas partie de l’entraînement).

Le résultat: juste au-dessus du milieu du peloton. Aucun prix en espèces majeur ni un système que je pourrais utiliser pour battre Vegas. C'était amusant quand même.

J'ai tout construit à partir de rien, pas de framework utilisé.

21
Adrian

J'ai développé une brasserie maison GA pour un système de profil de surface laser 3D que ma société avait développé pour le secteur du fret en 1992. Ce système reposait sur une triangulation tridimensionnelle et utilisait un scanner à ligne laser personnalisé, une caméra 512x512 (avec capture personnalisée hw). La distance entre la caméra et le laser n'allait jamais être précise et le point central des caméras ne se trouvait pas dans la position 256 256 que vous espériez!

C'était un cauchemar d'essayer de calculer les paramètres d'étalonnage en utilisant une géométrie standard et une résolution d'équation de style de recuit simulé.

L'algorithme génétique a été mis au point en une soirée et j'ai créé un cube d'étalonnage pour le tester. Je connaissais les dimensions du cube avec une grande précision. L’idée était donc que mon GA pouvait développer un ensemble de paramètres de triangulation personnalisés pour chaque unité de numérisation qui permettrait de surmonter les variations de production.

Le tour a fonctionné un régal. J'ai été sidérée pour le moins! En environ 10 générations, mon cube 'virtuel' (généré à partir de l'analyse brute et recréé à partir des paramètres d'étalonnage) ressemblait à un cube! Après environ 50 générations, j'ai eu la calibration dont j'avais besoin.

17
Adam Crow

Il est souvent difficile d’obtenir une combinaison de couleurs exacte lorsque vous envisagez de peindre votre maison. Souvent, vous avez une couleur en tête, mais ce n’est pas l’une des couleurs, le vendeur vous le montre.

Hier, mon professeur, chercheur GA - a parlé d'une histoire vraie en Allemagne (désolé, je n'ai pas d'autres références, oui, je peux le trouver si quelqu'un le demande). Ce mec (appelons-le le mec couleur ) passait de porte à porte pour aider les gens à trouver le code de couleur exact (dans RGB ) ce serait le placard de ce que le client avait en tête. Voici comment il le ferait:

Le mec de la couleur transportait avec lui un logiciel qui utilisait GA. Il avait l'habitude de commencer avec 4 couleurs différentes, chacune codée comme un chromosome codé (dont la valeur décodée serait une valeur RVB). Le consommateur choisit l'une des 4 couleurs (la plus proche de ses attentes). Le programme assignerait alors la forme physique maximale à cet individu et passerait à la génération suivante utilisant mutation/croisement . Les étapes ci-dessus seraient répétées jusqu'à ce que le consommateur ait trouvé la couleur exacte, puis l'homme de couleur lui dise la combinaison RVB!

En attribuant une adaptation maximale à la couleur proche de ce que le consommateur a en tête, le programme de color guy augmente les chances de convergence vers la couleur, le consommateur a en tête exactement. J'ai trouvé ça très amusant!

Maintenant que j'ai -1, si vous prévoyez plus de -1, pls. élucider la raison de le faire!

11
user59634

Dans le cadre de mes études de premier cycle en CompSci, nous avons eu pour tâche de trouver des indicateurs jvm optimaux pour la machine virtuelle de recherche Jikes. Cela a été évalué à l'aide de la suite de tests de performance Dicappo, qui renvoie l'heure à la console. J'ai écrit un alogirthm gentic distribué qui a permuté ces indicateurs pour améliorer l'exécution de la suite de tests, bien qu'il ait fallu des jours pour que celui-ci compense l'instabilité matérielle affectant les résultats. Le seul problème était que je n'avais pas appris correctement sur la théorie du compilateur (qui était l'intention de la tâche).

J'aurais pu ensemencer la population initiale avec les indicateurs par défaut existants, mais ce qui était intéressant, c'est que l'algorithme trouvait une configuration très similaire au niveau d'optimisation O3 (mais était en réalité plus rapide dans de nombreux tests).

Edit: De plus, j’ai écrit mon propre cadre d’algorithme génétique dans Python pour l’affectation, et j’ai juste utilisé les commandes popen pour exécuter les différents points de repère. Cependant, s’il n’avait pas été une affectation évaluée, j’aurais examiné pyEvolve.

8
WIll

Il y a quelques semaines, j'ai suggéré un solution sur SO utilisant des algorithmes génétiques pour résoudre un problème de disposition de graphe. C'est un exemple de problème d'optimisation contraint.

Également dans le domaine de l'apprentissage automatique, j'ai mis en place un cadre de règles de classification basé sur GA dans c/c ++ à partir de zéro.
J'ai également utilisé GA dans un exemple de projet de formation réseaux de neurones artificiels (ANN) au lieu d'utiliser le fameux algorithme de rétropropation =.

En outre, et dans le cadre de mes recherches de troisième cycle, j'ai utilisé GA dans la formation Modèles de Markov cachés comme approche supplémentaire de la technologie EM Baum-Welch algorithme (dans c/c ++ à nouveau).

7
Amro

Tout d’abord, "Programmation génétique" de Jonathan Koza ( sur Amazon ) est à peu près le livre sur les techniques/algorithmes de programmation génétiques et évolutifs, avec de nombreux exemples. Je suggère fortement de vérifier.

En ce qui concerne ma propre utilisation d'un algorithme génétique, j'ai utilisé un algorithme génétique (développé localement) pour développer un algorithme en essaim pour un scénario de collecte/destruction d'objets (l'objectif pratique aurait pu être de nettoyer un champ de mines). Voici un lien vers le papier . La partie la plus intéressante de ce que j'ai fait était la fonction de mise en forme à plusieurs niveaux, qui était une nécessité car les fonctions de mise en forme simples ne fournissaient pas suffisamment d'informations pour que l'algorithme génétique puisse différencier suffisamment les membres de la population.

7
miko

Je fais partie d'une équipe qui étudie l'utilisation du calcul évolutif (EC) pour corriger automatiquement les bogues dans les programmes existants. Nous avons réparé avec succès un certain nombre de bugs réels dans des projets logiciels du monde réel (voir page d'accueil de ce projet ).

Nous avons deux applications de cette technique de réparation EC.

  • Le premier ( code et les informations de reproduction disponibles via la page du projet ) font évoluer les arborescences syntaxiques abstraites analysées à partir des programmes C existants et sont implémentées dans Ocaml à l'aide de notre propre moteur EC personnalisé.

  • Le second ( code et les informations de reproduction disponibles sur la page du projet ), ma contribution personnelle au projet, font évoluer l’assemblage x86 ou le code Java byte compilé à partir de programmes. écrit dans un certain nombre de langages de programmation. Cette application est implémentée dans Clojure et utilise également son propre moteur EC construit sur mesure.

Un aspect intéressant du calcul évolutif est la simplicité de la technique qui permet d’écrire vos propres implémentations personnalisées sans trop de difficulté. Pour un bon texte d’introduction librement disponible sur la programmation génétique, voir le Guide de terrain pour la programmation génétique .

7
eschulte

Il y a plusieurs années, j'ai utilisé ga pour optimiser les grammaires asr (reconnaissance vocale automatique) afin d'obtenir de meilleurs taux de reconnaissance. J'ai commencé avec des listes de choix assez simples (où le ga testait des combinaisons de termes possibles pour chaque emplacement) et je suis monté à des grammaires plus ouvertes et plus complexes. La forme physique a été déterminée en mesurant la séparation entre les termes/séquences sous une sorte de fonction de distance phonétique. J'ai également essayé de faire des variations faiblement équivalentes sur une grammaire pour en trouver une qui soit compilée en une représentation plus compacte (à la fin j'ai opté pour un algorithme direct, ce qui a considérablement augmenté la taille du "langage" que nous pouvions utiliser dans les applications). .

Plus récemment, je les ai utilisées comme hypothèse par défaut pour tester la qualité des solutions générées à partir de divers algorithmes. Cela a largement impliqué une catégorisation et différents types de problèmes d’ajustement (c’est-à-dire créer une "règle" qui explique un ensemble de choix faits par les relecteurs sur un ou plusieurs ensembles de données).

5
Steve Roberts

Un collègue et moi-même travaillons à une solution pour charger le fret dans des camions en utilisant les différents critères requis par notre société. J'ai travaillé sur une solution d'algorithme génétique alors qu'il utilisait un Branch And Bound avec un élagage agressif. Nous sommes toujours en train de mettre en œuvre cette solution, mais nous avons obtenu de bons résultats jusqu'à présent.

5
user192531

J'ai créé un framework complet GA nommé "GALAB" pour résoudre de nombreux problèmes:

  • localiser les ANT GSM (BTS) pour réduire les chevauchements et les emplacements vides.
  • Planification de projet avec contraintes de ressources.
  • Création d'image évolutive. ( Evopic )
  • Problème de voyageur de commerce.
  • Problèmes N-Queen & N-Color.
  • Knight's tour & Knapsack problèmes.
  • Carré magique et puzzles de Sudoku.
  • compression de chaîne, basée sur le problème Superstring.
  • Problème d'emballage 2D.
  • Minuscule vie artificielle APP.
  • Rubik puzzle.
4
MShams

Une fois, j'ai utilisé un GA pour optimiser une fonction de hachage pour les adresses de mémoire. Les adresses avaient une taille de page de 4K ou 8K, elles montraient donc une certaine prévisibilité dans la configuration binaire de l'adresse (les bits les moins significatifs tout à zéro; les bits du milieu s'incrémentant régulièrement, etc.) à chaque troisième seau de hachage. L'algorithme amélioré avait une distribution presque parfaite.

4
Brett Johnson

Dans le cadre de ma thèse, j'ai écrit un cadre générique Java pour l'algorithme d'optimisation multi-objectifs mPOEMS (optimisation de prototypes multiobjectifs avec étapes d'amélioration améliorées), qui est un GA utilisant des concepts évolutifs. Il est générique en ce sens que toutes les parties indépendantes du problème ont été séparées des parties dépendantes du problème, et une interface est fournie pour utiliser le cadre en ajoutant uniquement les parties dépendantes du problème. Ainsi, celui qui veut utiliser l’algorithme n’a pas besoin de commencer à zéro et cela facilite beaucoup le travail.

Vous pouvez trouver le code ici .

Les solutions que vous pouvez trouver avec cet algorithme ont été comparées dans un travail scientifique avec les algorithmes les plus avancés, SPEA-2 et NSGA, et il a été prouvé que cet algorithme avait des performances comparables, voire supérieures, en fonction des métriques que vous prendre pour mesurer la performance, et en particulier en fonction du problème d'optimisation que vous recherchez.

Vous pouvez le trouver ici .

Dans le cadre de ma thèse et de ma preuve de travail, j'ai également appliqué ce cadre au problème de sélection de projet rencontré dans la gestion de portefeuille. Il s'agit de sélectionner les projets qui ajoutent le plus de valeur à l'entreprise, qui soutiennent le plus la stratégie de l'entreprise ou qui soutiennent tout autre objectif arbitraire. Par exemple. sélection d'un certain nombre de projets dans une catégorie spécifique, ou maximisation des synergies de projets, ...

Ma thèse qui applique ce cadre au problème de sélection de projet: http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

Après cela, j'ai travaillé dans un département de gestion de portefeuille dans l'un des Fortune 500, où ils ont utilisé un logiciel commercial qui appliquait également un GA à l'optimisation du problème de sélection de projet/portefeuille.

Autres ressources:

La documentation du framework: http://thomaskremmel.com/mpoems/mpoems_in_Java_documentation.pdf

document de présentation de mPOEMS: http://portal.acm.org/citation.cfm?id=1792634.179265

En fait, avec un peu d'enthousiasme, tout le monde pourrait facilement adapter le code du framework générique à un problème d'optimisation arbitraire multi-objectifs.

3
Thomas Kremmel

J'ai construit un simple GA pour extraire des motifs utiles du spectre de fréquences de la musique en cours de lecture. La sortie était utilisée pour générer des effets graphiques dans un plugin Winamp.

  • Entrée: quelques images FFT (imaginez un tableau 2D de flottants)
  • Sortie: valeur flottante unique (somme pondérée des entrées), seuil à 0,0 ou 1,0
  • Gènes: poids d'entrée
  • Fonction Fitness: combinaison du facteur de marche, de la largeur d'impulsion et du BPM dans une plage sensible.

Quelques GA ont été réglés sur différentes parties du spectre ainsi que sur différentes limites de BPM, de sorte qu’ils n’ont pas tendance à converger vers le même schéma. Les sorties des 4 premiers de chaque population ont été envoyées au moteur de rendu.

Un effet secondaire intéressant a été que l’aptitude moyenne de la population était un bon indicateur des changements dans la musique, bien qu’il ait généralement fallu 4 à 5 secondes pour le comprendre.

3
geofftnz

Je ne sais pas si les devoirs comptent ...

Pendant mes études, nous avons lancé notre propre programme pour résoudre le problème du voyageur de commerce.

L'idée était de faire une comparaison sur plusieurs critères (difficulté à cartographier le problème, la performance, etc.) et nous avons également utilisé d'autres techniques telles que recuit simulé .

Cela a plutôt bien fonctionné, mais il nous a fallu un certain temps pour comprendre comment faire correctement la phase de "reproduction": modéliser le problème actuel en un outil adapté à la programmation génétique m'a vraiment paru le plus difficile ...

C'était un cours intéressant, car nous avons également abordé des réseaux de neurones, etc.

J'aimerais savoir si quelqu'un a utilisé ce type de programmation dans le code de "production".

3
Matthieu M.

Au travail, je rencontrais le problème suivant: étant donné les tâches M et les N DSP, quel était le meilleur moyen d’attribuer des tâches aux DSP? "Meilleur" a été défini comme "minimisant la charge du DSP le plus chargé". Il y avait différents types de tâches, et différents types de tâches avaient des ramifications de performances en fonction de l'endroit où elles avaient été attribuées. J'ai donc codé l'ensemble d'assignations de tâches à DSP sous forme de "chaîne d'ADN", puis utilisé un algorithme génétique pour "reproduire" la meilleure chaîne d'affectation que j'ai pu.

Cela fonctionnait assez bien (beaucoup mieux que ma méthode précédente, qui consistait à évaluer toutes les combinaisons possibles ... sur des problèmes de taille non triviale, il aurait fallu des années pour le terminer!), Le seul problème était qu'il n'y avait aucun moyen de le savoir. si la solution optimale avait été atteinte ou non. Vous pouvez seulement décider si le "meilleur effort" actuel est suffisant, ou le laisser courir plus longtemps pour voir s'il peut faire mieux.

2
Jeremy Friesner

Il y avait un concours sur codechef.com (grand site en passant, concours de programmation mensuels) où il était supposé résoudre un sudoku insoluble (il fallait venir le plus près possible avec le moins de faux colonnes/lignes/etc que possible).

Ce que je voudrais faire, c’était d’abord de générer un sudoku parfait, puis de passer outre les champs donnés. À partir de cette très bonne base, j'ai utilisé la programmation génétique pour améliorer ma solution.

Je ne pouvais pas penser à une approche déterministe dans ce cas, car le sudoku faisait 300x300 et la recherche aurait pris trop de temps.

2
Dave O.

J'ai utilisé un algorithme génétique simple pour optimiser le rapport signal sur bruit d'une onde représentée par une chaîne binaire. En retournant les bits de plusieurs manières sur plusieurs millions de générations, j'ai pu produire une transformation qui entraînait un rapport signal sur bruit plus élevé pour cette onde. L’algorithme aurait également pu être "Recuit simulé" mais n’a pas été utilisé dans ce cas. À la base, les algorithmes génétiques sont simples et il s’agissait d’un cas d’utilisation aussi simple que celui que j’ai vu. Je n’ai donc pas utilisé de cadre pour la création et la sélection de générations, mais uniquement une graine aléatoire et le rapport signal-bruit. fonction à portée de main.

2
Alex Sexton

J'ai développé une simulation multithread basée sur le swing de la navigation robotique à travers un ensemble de grilles aléatoires de sources alimentaires et de mines et développé une stratégie basée sur un algorithme génétique pour explorer l'optimisation du comportement robotique et la survie des gènes les plus aptes pour un chromosome robotique. Cela a été fait en utilisant la cartographie et la cartographie de chaque cycle d'itération.

Depuis, j'ai développé encore plus de comportements de jeu. Un exemple d’application que j’ai récemment construite pour moi-même est un algorithme génétique permettant de résoudre le problème de vendeur itinérant lors de la recherche d’itinéraire au Royaume-Uni, en tenant compte des états de départ et d’objectif, ainsi que des points de connexion, retards, annulations, travaux de construction, heure de pointe, grèves publiques, considération entre les itinéraires les plus rapides vs les moins chers. Ensuite, fournir une recommandation équilibrée pour l'itinéraire à suivre un jour donné.

Généralement, ma stratégie consiste à utiliser la représentation des gènes basée sur POJO, puis à appliquer des implémentations d'interface spécifiques pour la sélection, la mutation, les stratégies de croisement et le critère. Ma fonction de mise en forme devient alors fondamentalement assez complexe en fonction de la stratégie et des critères que je dois appliquer comme mesure heuristique.

J'ai également étudié la possibilité d'appliquer un algorithme génétique à des tests automatisés dans le code en utilisant des cycles de mutation systématiques dans lesquels l'algorithme comprend la logique et tente de déterminer un rapport de bogue avec des recommandations pour corriger le code. Fondamentalement, un moyen d’optimiser mon code et de fournir des recommandations d’amélioration, ainsi qu’un moyen d’automatiser la découverte de nouveau code programmatique. J'ai également essayé d'appliquer des algorithmes génétiques à la production musicale, entre autres applications.

En général, je trouve les stratégies évolutives comme la plupart des stratégies d'optimisation métaheuristiques/globales. Elles sont lentes à apprendre au début, mais commencent à se manifester à mesure que les solutions s'approchent de plus en plus de l'état d'objectif et tant que votre fonction de mise en forme et vos heuristiques sont bien alignées pour produire cette convergence dans votre espace de recherche.

2
meme

Dans un séminaire à l'école, nous développons une application pour générer de la musique basée sur le mode musical. Le programme était construit en Java et le résultat était un fichier midi avec la chanson. Nous utilisons différentes approches de GA pour générer la musique. Je pense que ce programme peut être utile pour explorer de nouvelles compositions.

2
user181945

au premier cycle, nous avons utilisé NERO (une combinaison de réseau de neurones et d'algorithme génétique) pour apprendre aux robots du jeu à prendre des décisions intelligentes. C'était plutôt cool.

2
user197801

En 2007-2009, j'ai développé un logiciel pour lire les modèles de datamatrix. Ces motifs étaient souvent difficiles à lire, étant indentés sur des surfaces rayées dotées de toutes sortes de propriétés de réflectance, de marques floues gravées chimiquement, etc. J'ai utilisé un GA pour affiner divers paramètres des algorithmes de vision afin d'obtenir les meilleurs résultats sur une base de données de 300 images ayant des propriétés connues. Les paramètres étaient des éléments tels que la résolution de sous-échantillonnage, les paramètres RANSAC, l’importance de l’érosion et de la dilatation, le rayon de filtrage passe-bas et quelques autres. L'exécution de l'optimisation sur plusieurs jours a donné des résultats environ 20% meilleurs que les valeurs naïves sur un ensemble test d'images non vues pendant la phase d'optimisation.

Ce système a été entièrement écrit à partir de rien et je n’ai utilisé aucune autre bibliothèque. Je ne m'oppose pas à l'utilisation de tels outils, à condition qu'ils donnent un résultat fiable, mais vous devez faire attention à la compatibilité des licences et aux problèmes de portabilité du code.

1
Bob Mottram

J'ai déjà essayé de créer un ordinateur pour le jeu de Go, exclusivement basé sur la programmation génétique. Chaque programme serait traité comme une fonction d'évaluation pour une séquence de déménagements. Les programmes produits ne sont toutefois pas très bons, même sur un tableau 3x4 plutôt réduit.

J'ai utilisé Perl et tout codé moi-même. Je ferais les choses différemment aujourd'hui.

1
Svante

Après avoir lu The Blind Watchmaker , je m'intéressais au programme de Pascal que Dawkins avait développé pour créer des modèles d'organismes pouvant évoluer dans le temps. J'étais assez intéressé pour écrire le mien en utilisant Swarm . Je n'ai pas réalisé tous les graphiques fantaisistes qu'il a faits, mais mes traits de "chromosomes" contrôlaient la capacité de survie des organismes. Ils vivaient dans un monde simple et pouvaient se battre l'un contre l'autre et contre leur environnement.

Les organismes ont vécu ou sont morts en partie par hasard, mais aussi en fonction de leur capacité d'adaptation à l'environnement local, de leur consommation de nutriments et de leur capacité à se reproduire. C'était amusant, mais aussi une preuve supplémentaire pour ma femme que je suis un geek.

1
DaveParillo

J'ai expérimenté GA dans ma jeunesse. J'ai écrit un simulateur dans Python qui fonctionnait comme suit.

Les gènes codaient les poids d'un réseau de neurones.

Les entrées du réseau de neurones étaient des "antennes" détectant les contacts. Des valeurs plus élevées signifiaient très proches et 0 signifiait ne pas toucher.

Les sorties étaient à deux "roues". Si les deux roues avançaient, le gars avançait. Si les roues étaient dans des directions opposées, le gars a tourné. La force de la sortie détermine la vitesse de rotation de la roue.

Un simple labyrinthe a été généré. C'était vraiment simple - stupide même. Il y avait le début en bas de l'écran et un but en haut, avec quatre murs entre les deux. Chaque mur avait un espace retiré au hasard, donc il y avait toujours un chemin.

J'ai commencé les gars au hasard (je pensais à eux comme des insectes) au début. Dès que l'un des gars a atteint l'objectif ou qu'une limite de temps a été atteinte, la condition physique a été calculée. C'était inversement proportionnel à la distance qui le séparait du but à ce moment-là.

Je les ai ensuite jumelés et "élevés" pour créer la prochaine génération. La probabilité d'être choisi pour être élevé était proportionnelle à sa forme physique. Parfois, cela signifiait que l'on était élevé avec lui-même à plusieurs reprises s'il avait une condition physique très élevée.

Je pensais qu'ils développeraient un comportement "embrassant le mur gauche", mais ils semblaient toujours suivre quelque chose de moins optimal. Dans chaque expérience, les insectes ont convergé vers un motif en spirale. Ils allaient en spirale jusqu'à toucher un mur à droite. Ils suivraient cela, puis quand ils seraient arrivés à l’écart, ils seraient descendus en spirale (loin de l’écart) et autour. Ils feraient un virage à gauche de 270 degrés, puis entraient généralement dans l’espace vide. Cela les ferait passer à travers la majorité des murs, et souvent jusqu'au but.

Une fonctionnalité que j'ai ajoutée consistait à insérer un vecteur de couleur dans les gènes afin de suivre les relations entre les individus. Après quelques générations, ils seraient tous de la même couleur, ce qui me dit que je devrais avoir une meilleure stratégie de sélection.

J'ai essayé de les amener à développer une meilleure stratégie. J'ai compliqué le réseau de neurones - en ajoutant une mémoire et tout. Cela n'a pas aidé. J'ai toujours vu la même stratégie.

J'ai essayé différentes choses, comme avoir des pools de gènes distincts qui ne se sont recombinés qu'après 100 générations. Mais rien ne les pousserait à une meilleure stratégie. C'était peut-être impossible.

Une autre chose intéressante est la représentation graphique de la forme physique au fil du temps. Il y avait des habitudes bien définies, comme la forme physique maximale qui chutait avant d’augmenter. Je n'ai jamais vu un livre sur l'évolution parler de cette possibilité.

1
Eric Normand

C’était il ya quelque temps, mais j’ai lancé un GA pour faire évoluer les noyaux de traitement d’images afin d’éliminer les traces de rayons cosmiques des images du télescope spatial Hubble (HST). L'approche standard consiste à prendre plusieurs expositions avec le Hubble et à ne conserver que les éléments identiques dans toutes les images. Puisque l'heure de la TVH est si précieuse, je suis un passionné d'astronomie et, ayant récemment participé au Congrès sur le calcul évolutif, j'ai envisagé d'utiliser un GA pour nettoyer les expositions simples.

Les individus se présentaient sous la forme d’arbres prenant en entrée une zone de 3x3 pixels, effectuant des calculs et décidant si et comment modifier le pixel central. La condition physique a été jugée en comparant la sortie avec une image nettoyée de manière traditionnelle (c'est-à-dire en superposant les expositions).

Cela a en quelque sorte fonctionné, mais pas assez bien pour justifier de renoncer à l'approche initiale. Si ma thèse n'avait pas pris trop de temps, j'aurais peut-être élargi la corbeille de pièces génétiques disponible pour l'algorithme. Je suis sûr que j'aurais pu l'améliorer de manière significative.

Bibliothèques utilisées: Si je me souviens bien, IRAF et cfitsio pour le traitement des données d’images astronomiques et les E/S.

1
Adam Hollidge

Pour ma thèse de premier cycle, j'ai utilisé la programmation génétique pour développer des stratégies de recherche en coopération à utiliser pour la recherche et le sauvetage aériens. J'ai utilisé une plate-forme de modélisation d'agent open source appelée NetLogo (basée sur StarLogo) comme modèle mondial. NetLogo est écrit en Java et fournit donc _ Java API - le cadre généraliste devait donc être basé sur Java - celui que j'ai utilisé s'appelle également JGAP. un autre framework GP open source dans Java que je connais s'appelle ECJ.

Les simulations étaient assez lentes à exécuter (je pense que cela est dû au modèle NetLogo), donc mes ensembles de fonctions/terminaux étaient assez restreints, limitant ainsi l’espace de recherche.t Malgré cela, j’ai trouvé de bonnes solutions. Si vous en ressentez le besoin, consultez le chapitre 3 de ma thèse http://www.cse.unsw.edu.au/~ekjo014/z3157867_Thesis.pdf

0
ekj

J'ai construit ce petit doodad amusant il y a quelques semaines. Il génère des images Internet amusantes en utilisant un GA. Un peu bête mais bon pour rire.

http://www.twitterandom.info/GAFunny/

Un aperçu de cela. Ce sont quelques tables mysql. Un pour la liste des images et leur score (qui correspond à la forme physique) et un autre pour les sous-images et leur emplacement sur la page.

Les sous-images peuvent avoir plusieurs détails qui ne sont pas tous implémentés: + taille, inclinaison, rotation, + emplacement, + image_url.

Alors que les gens votent pour le drôle d'image, il est plus ou moins susceptible de survivre jusqu'à la génération suivante. S'il survit, il produit 5-10 progénitures avec de légères mutations. Il n'y a pas encore de croisement.

0
DampeS8N

Graduate Computation Graduate Class: Développement d'une solution pour TopCoder Marathon Match 49: MegaParty. Mon petit groupe testait différentes représentations de domaine et son incidence sur la capacité du GA à trouver la bonne réponse. Nous avons lancé notre propre code pour résoudre ce problème.

Neuro-évolution et systèmes génératifs et développementaux, classe de cycles supérieurs: développement d'un évaluateur de plateau de jeu Othello utilisé dans l'arbre min-max d'un joueur sur ordinateur. Le joueur était prêt à faire son entrée dans le jeu et s’entraîner à jouer contre un joueur avide d’informatique qui considérait les coins importants. Le joueur de formation a vu soit 3 ou 4 profonds (je devrai regarder mes fichiers de configuration pour répondre, et ils sont sur un autre ordinateur). Le but de l'expérience était de comparer la recherche de nouveauté à la recherche traditionnelle basée sur la condition physique dans le domaine d'évaluation du jeu. Les résultats ont été relativement peu concluants, malheureusement. Bien que les méthodes de recherche basée sur la nouveauté et la recherche basée sur la condition physique trouvent une solution (montrant que la recherche de nouveauté peut être utilisée dans le domaine Othello), il était possible de trouver une solution à ce domaine sans nœuds cachés. Apparemment, je n’ai pas créé de formateur suffisamment compétent s’il existait une solution linéaire (et il était possible de disposer d’une solution dès le départ). Je pense que mon implémentation de la recherche basée sur la condition physique a produit des solutions plus rapidement que celle de la nouveauté, cette fois-ci. (ce n'est pas toujours le cas). Quoi qu'il en soit, j'ai utilisé ANJI, "Un autre NEAT Java Implémentation" pour le code de réseau neuronal, avec diverses modifications. Le jeu Othello que j'ai écrit moi-même.

0
Travis