Quali sono buoni esempi di algoritmi genetici / soluzioni di programmazione genetica? [chiuso]


227

Gli algoritmi genetici (GA) e la programmazione genetica (GP) sono aree di ricerca interessanti.

Mi piacerebbe sapere di problemi specifici che hai risolto usando GA / GP e quali librerie / framework hai usato se non hai creato il tuo.

Domande:

  • Quali problemi hai utilizzato GA / GP per risolvere?
  • Quali librerie / framework hai usato?

Sto cercando esperienze di prima mano, quindi per favore non rispondere a meno che tu non lo abbia.


28
@Jason: grazie per aver suggerito quella cosa su Google. Mentre sembra essere in qualche modo utile, non riesco a vedere come potrebbe rispondere a questa domanda poiché si rivolge in modo specifico agli utenti SO con esperienza GA / GP.
Knorv,


13
"Ci aspettiamo che le risposte siano supportate da ... competenze specifiche ...." Verifica! "[T] la sua domanda probabilmente solleciterà dibattiti, argomenti, sondaggi o discussioni estese". Falso. Ci sono molte risposte, ma non è un sondaggio e non ci sono molti commenti o dibattiti nei commenti. Perché è stato chiuso?
Adrian McCarthy,

Il programma Eureqa è ottimo per la programmazione genetica: nutonian.com/products/eureqa
Simon

Risposte:


146

Non i compiti.

Il mio primo lavoro come programmatore professionista (1995) è stato quello di scrivere un sistema di trading automatico basato su algoritmi genetici per i futures S & P500. L'applicazione è stata scritta in Visual Basic 3 [!] E non ho idea di come ho fatto qualcosa allora, dal momento che VB3 non aveva nemmeno classi.

L'applicazione è iniziata con una popolazione di stringhe a lunghezza fissa generate casualmente (la parte "gene"), ognuna delle quali corrispondeva a una forma specifica nei dati di prezzo minuto per minuto dei futures S & P500, nonché un ordine specifico (comprare o vendere) e importi stop-loss e stop-profit. Ogni stringa (o "gene") ha avuto la sua performance di profitto valutata da una serie di 3 anni di dati storici; ogni volta che la "forma" specificata corrispondeva ai dati storici, ho assunto l'ordine di acquisto o vendita corrispondente e valutato il risultato del commercio. Ho aggiunto l'avvertenza che ogni gene ha iniziato con una quantità fissa di denaro e potrebbe quindi potenzialmente rompersi e essere rimosso completamente dal pool genetico.

Dopo ogni valutazione di una popolazione, i sopravvissuti sono stati incrociati casualmente (semplicemente mescolando frammenti di due genitori), con la probabilità che un gene selezionato come genitore fosse proporzionale al profitto prodotto. Ho anche aggiunto la possibilità di mutazioni puntuali per ravvivare un po 'le cose. Dopo alcune centinaia di generazioni, sono finito con una popolazione di geni che potevano trasformare $ 5000 in una media di circa $ 10000 senza possibilità di morte / rottura (sui dati storici, ovviamente).

Sfortunatamente, non ho mai avuto la possibilità di utilizzare questo sistema dal vivo, poiché il mio capo ha perso quasi $ 100.000 in meno di 3 mesi scambiando in modo tradizionale, e ha perso la sua volontà di continuare con il progetto. In retrospettiva, penso che il sistema avrebbe realizzato enormi profitti, non perché stavo necessariamente facendo qualcosa di giusto, ma perché la popolazione di geni che ho prodotto era distorta rispetto agli ordini di acquisto (anziché a quelli di vendita) di circa 5: 1 rapporto. E come sappiamo con il senno di poi 20/20, il mercato è cresciuto un po 'dopo il 1995.


9
"Penso che il sistema avrebbe realizzato enormi profitti" - sì, scommetto che ha funzionato perfettamente nell'ambiente di backtesting ;-)
Joel,

30
@Joel: certo che l'ha fatto, ma non è per questo che penso che sarebbe stato redditizio. Avrebbe fatto soldi a causa della forte propensione all'acquisto anziché alla vendita. Un sistema che ha appena acquistato futures S & P500 in tempi casuali tra il 1995 e il 1999 (senza alcun tipo di assurdità GA in corso) avrebbe fatto tonnellate di denaro, ma lo sappiamo solo a posteriori.
MusiGenesis,

10
Joel si riferiva probabilmente al "sovradimensionamento".
Eric Normand,

10
Devi riservare un po 'dei tuoi dati storici per i test. Meglio fare convalida incrociata.
Eric Normand,

Cosa intendi con "forma" in each of which corresponded to a specific shape in the minute-by-minute price data?
CodyBugstein,

89

Ho fatto un po 'di creature che vivevano in questo piccolo mondo. Avevano un cervello di rete neurale che riceveva input dal mondo e l'output era un vettore per il movimento tra le altre azioni. I loro cervelli erano i "geni".

Il programma è iniziato con una popolazione casuale di creature con cervelli casuali. I neuroni di input e output erano statici ma non lo era.

L'ambiente conteneva cibo e pericoli. Il cibo aumenta l'energia e quando hai abbastanza energia, puoi accoppiarti. I pericoli ridurrebbero l'energia e se l'energia fosse 0, sarebbero morti.

Alla fine le creature si sono evolute per muoversi in tutto il mondo e trovare cibo ed evitare i pericoli.

Ho quindi deciso di fare un piccolo esperimento. Ho dato al cervello della creatura un neurone in uscita chiamato "bocca" e un neurone in entrata chiamato "orecchio". Ricominciato da capo e fu sorpreso di scoprire che si sono evoluti per massimizzare lo spazio e ogni rispettiva creatura sarebbe rimasta nella sua rispettiva parte (il cibo veniva posizionato casualmente). Hanno imparato a cooperare tra loro e non mettersi in reciproca maniera. C'erano sempre le eccezioni.

Poi ho provato qualcosa di interessante. Le creature morte diventerebbero cibo. Prova a indovinare cosa è successo! Si sono evoluti due tipi di creature, quelle che hanno attaccato come negli sciami e quelle che erano altamente evitabili.

Allora, qual è la lezione qui? Comunicazione significa cooperazione. Non appena si introduce un elemento in cui fare del male a un altro significa guadagnare qualcosa, la cooperazione viene distrutta.

Mi chiedo come ciò si rifletta sul sistema dei mercati liberi e del capitalismo. Voglio dire, se le aziende possono danneggiare la concorrenza e cavarsela , allora è chiaro che faranno tutto ciò che è in loro potere per danneggiare la concorrenza.

Modificare:

L'ho scritto in C ++ senza usare framework. Ha scritto la mia rete neurale e il mio codice GA. Eric, grazie per aver detto che è plausibile. Le persone di solito non credono nei poteri di GA (anche se i limiti sono ovvi) fino a quando non ci giocano. GA è semplice ma non semplicistico.

Per i dubbiosi, le reti neurali hanno dimostrato di essere in grado di simulare qualsiasi funzione se hanno più di uno strato. GA è un modo abbastanza semplice per navigare nello spazio di una soluzione trovando un minimo locale e potenzialmente globale. Combina GA con reti neurali e hai un modo abbastanza buono per trovare funzioni che trovano soluzioni approssimative per problemi generici. Poiché stiamo usando reti neurali, stiamo ottimizzando la funzione per alcuni input, non alcuni input per una funzione come altri stanno usando GA

Ecco il codice demo per l'esempio di sopravvivenza: http://www.mempko.com/darcs/neural/demos/eaters/ Istruzioni per la costruzione:

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

Screenshot di Eaters


10
E dove andrà il tuo premio Turing con questa storia? Devi aver fatto dei progressi pazzeschi nella scienza per fare in modo che un simile esperimento fosse eseguito anche su RoadRunner.
San Jacinto,

1
D'accordo con Eric. Puoi scrivere un semplice NN in meno di un'ora (e in effetti, in un esame l'ho fatto io) e un GA di base non è necessariamente più di un giorno o due di lavoro. Questo è più un algoritmo A-Life che un algoritmo genetico, ma qui stiamo ancora parlando di cose molto semplici e fattibili.
Kylotan,

2
Questo non è affatto falso ... Estate dopo il mio anno di matricola, ho realizzato un progetto per i divertimenti molto simile a questo usando XNA in C #, meno le reti neurali, gli GA di utilizzo e una popolazione di creature con una miriade di tratti diversi . Ad esempio, un gene controllava la propria visione: più in alto significava ulteriore vista, più in basso significava un raggio di visione più ampio. Gli ostacoli e il cibo verrebbero posizionati casualmente e le creature riempirebbero la loro energia mangiando il cibo. I tratti sarebbero mutati aggiungendo numeri gaussiani generati casualmente, dando come risultato geni normalmente distribuiti come nell'evoluzione reale.
Philip Guin,

2
Lavoro in un gruppo di ricerca in cui questo genere di cose (ALife) era ciò che la gente faceva ogni giorno. La tua storia è assolutamente credibile, e ad essere sincero ero un po 'scioccato nel vedere che qualcuno avrebbe pensato che fosse un falso. Inoltre, di solito, il punto di farli è sottolineare che comportamenti complessi possono derivare da sistemi molto semplici - immagino che il punto non sia stato chiarito abbastanza bene.
Lucas,

1
Ho trovato alcune prove nel suo sito web: www.mempko.com/darcs/neural Egli afferma "Ho fornito un chiaro esempio di piccoli uomini in un piccolo mondo, che si stanno evolvendo per sopravvivere". Ecco il codice di esempio: mempko.com/darcs/neural/demos/eaters
guerda

51

Nel gennaio 2004, sono stato contattato da Philips New Display Technologies che stava creando l'elettronica per il primo e-ink commerciale in assoluto, la Sony Librie, che era stata rilasciata solo in Giappone, anni prima che Amazon Kindle e gli altri arrivassero sul mercato negli Stati Uniti un'Europa.

Gli ingegneri Philips hanno avuto un grosso problema. Pochi mesi prima che il prodotto avrebbe dovuto essere lanciato sul mercato, stavano cambiando le immagini sullo schermo. Il problema erano i 200 driver che stavano creando il campo elettrostatico. Ognuno di questi driver aveva una certa tensione che doveva essere impostata tra zero e 1000 mV o qualcosa del genere. Ma se ne cambiassi uno, cambierebbe tutto.

Quindi l'ottimizzazione individuale della tensione di ciascun driver era fuori discussione. Il numero di possibili combinazioni di valori era in miliardi e ci volle circa 1 minuto per una fotocamera speciale per valutare una singola combinazione. Gli ingegneri avevano provato molte tecniche di ottimizzazione standard, ma nulla si sarebbe avvicinato.

L'ingegnere capo mi ha contattato perché avevo precedentemente rilasciato una libreria di programmazione genetica alla comunità open source. Mi ha chiesto se i GP / GA avrebbero aiutato e se potevo essere coinvolto. L'ho fatto e per circa un mese abbiamo lavorato insieme, io scrivendo e ottimizzando la libreria GA, su dati sintetici, e lui integrandolo nel loro sistema. Quindi, un fine settimana lo hanno lasciato vivere dal vivo con la cosa vera.

Il lunedì seguente ho ricevuto queste e-mail brillanti da lui e dal loro progettista hardware, su come nessuno poteva credere agli incredibili risultati che GA ha trovato. Era questo. Più tardi quell'anno il prodotto ha colpito il mercato.

Non sono stato pagato un centesimo per questo, ma ho ottenuto i diritti di 'vantarsi'. Hanno detto fin dall'inizio che avevano già superato il budget, quindi sapevo quale fosse l'accordo prima di iniziare a lavorarci. Ed è una grande storia per le applicazioni di GA. :)


23
La cosa "oltre budget" è falsa. Ovviamente avevano i soldi per pagarti ma hanno scelto di non farlo. Ciò fa davvero schifo e mostra come le grandi aziende possono trarre vantaggio da simpatici programmatori.
Martin Capodici,

50

Ho usato un GA per ottimizzare l'assegnazione dei posti al mio ricevimento di nozze. 80 ospiti su 10 tavoli. La funzione di valutazione si basava sul mantenere le persone con le loro date, mettere le persone con qualcosa in comune e mantenere le persone con visioni opposte estreme su tavoli separati.

L'ho eseguito più volte. Ogni volta, ho ottenuto nove buoni tavoli e uno con tutte le palle dispari. Alla fine, mia moglie ha fatto i posti a sedere.

Il mio ottimizzatore venditore ambulante ha utilizzato una nuova mappatura del cromosoma per l'itinerario, il che ha reso banale la riproduzione e la mutazione dei cromosomi senza alcun rischio di generare tour non validi.

Aggiornamento : perché un paio di persone hanno chiesto come ...

Inizia con una serie di ospiti (o città) in un ordinamento arbitrario ma coerente, ad esempio in ordine alfabetico. Chiama questa la soluzione di riferimento. Pensa all'indice di un ospite come al suo numero di posto.

Invece di provare a codificare questo ordinamento direttamente nel cromosoma, codifichiamo le istruzioni per trasformare la soluzione di riferimento in una nuova soluzione. In particolare, trattiamo i cromosomi come liste di indici dell'array da scambiare. Per decodificare un cromosoma, iniziamo con la soluzione di riferimento e applichiamo tutti gli swap indicati dal cromosoma. Lo scambio di due voci nell'array comporta sempre una soluzione valida: ogni ospite (o città) appare ancora esattamente una volta.

Quindi i cromosomi possono essere generati, mutati e incrociati in modo casuale con altri e produrranno sempre una soluzione valida.


e qual era quella nuova mappatura?
Manuel Aráoz,

4
@Manuel: Invece di codificare il tour direttamente nel "cromosoma", ho codificato una trasformazione che trasforma un tour di riferimento in una soluzione. Le trasformazioni sono solo scambi tra città nell'indice. Quindi possono essere ricombinati in qualsiasi modo e comunque generare sempre un tour che visita ogni città esattamente una volta.
Adrian McCarthy,

Grazie! Sono solo un po 'confuso con l'aspetto di scambio. Ogni cromosoma codifica un elenco di indici da scambiare - ciò non significa che un indice possa apparire più di una volta nel cromosoma?
user3019612

1
Il chomosoma ha indici c1, c2, c3, ..., cn. "Soluzione" è l'array a. Inizializza a con l'elenco di riferimento. Quindi, per ogni coppia di indici nel cromosoma, scambia due elementi nella soluzione ( temp = a[c1]; a[c1] = a[c2]; a[c2] = temp). Non importa se due indici sono identici, perché conterrà comunque ogni ospite (o città) esattamente una volta.
Adrian McCarthy,

33

Ho usato algoritmi genetici (così come alcune tecniche correlate) per determinare le migliori impostazioni per un sistema di gestione del rischio che ha cercato di impedire agli agricoltori dell'oro di utilizzare carte di credito rubate per pagare gli MMO. Il sistema prenderebbe diverse migliaia di transazioni con valori "noti" (frode o no) e capirebbe quale fosse la migliore combinazione di impostazioni per identificare correttamente le transazioni fraudolente senza troppi falsi positivi.

Avevamo dati su diverse dozzine (booleane) di caratteristiche di una transazione, ognuna delle quali è stata data un valore e sommata. Se il totale era superiore a una soglia, la transazione era una frode. L'AG creerebbe un gran numero di insiemi di valori casuali, li valuterà rispetto a un corpus di dati noti, selezionerebbe quelli che hanno ottenuto il punteggio migliore (sia per il rilevamento delle frodi sia per limitare il numero di falsi positivi), quindi incrocia i migliori ogni generazione per produrre una nuova generazione di candidati. Dopo un certo numero di generazioni il miglior set di valori è stato considerato il vincitore.

La creazione del corpus di dati noti da testare era il tallone d'Achille del sistema. Se hai aspettato gli storni di addebito, ti mancavano diversi mesi quando cercavi di rispondere ai truffatori, quindi qualcuno avrebbe dovuto rivedere manualmente un gran numero di transazioni per costruire quel corpus di dati senza dover aspettare troppo a lungo.

Ciò ha finito per identificare la stragrande maggioranza della frode che è arrivata, ma non è riuscita a portarla al di sotto dell'1% sugli articoli più soggetti a frode (dato che il 90% delle transazioni in entrata potrebbe essere una frode, che stava andando abbastanza bene).

Ho fatto tutto questo usando perl. Un'esecuzione del software su un box Linux abbastanza vecchio richiederebbe 1-2 ore (20 minuti per caricare i dati su un collegamento WAN, il resto del tempo impiegato a scricchiolare). La dimensione di ogni data generazione era limitata dalla RAM disponibile. Lo ripasserei più volte con lievi modifiche ai parametri, cercando un set di risultati particolarmente buono.

Tutto sommato ha evitato alcune delle gaffes che derivavano dal tentativo manuale di modificare i valori relativi di dozzine di indicatori di frode e ha costantemente prodotto soluzioni migliori di quelle che avrei potuto creare a mano. AFAIK, è ancora in uso (circa 3 anni dopo averlo scritto).


Penso che avresti potuto usare una rete neurale per modificare i parametri (anche se ci vorrebbe più tempo per essere più efficace che farlo manualmente).
alexpinho98,

21

Mance da calcio. Ho creato un sistema GA per prevedere i risultati settimanali delle partite nell'AFL (Football australiano).

Qualche anno fa mi sono stufato della squadra di calcio di lavoro standard, tutti andavano online e prendevano le scelte da qualche esperto della stampa. Quindi, ho pensato che non potesse essere troppo difficile battere un gruppo di major del giornalismo televisivo, giusto? Il mio primo pensiero è stato quello di prendere i risultati dalle valutazioni di Massey e poi rivelare alla fine della stagione la mia strategia dopo aver vinto fama e gloria. Tuttavia, per motivi che non ho mai scoperto, Massey non tiene traccia di AFL. Il cinico in me crede che sia perché il risultato di ogni gioco AFL è diventato sostanzialmente una possibilità casuale, ma le mie lamentele riguardo alle recenti modifiche alle regole appartengono a un forum diverso.

Il sistema ha sostanzialmente considerato la forza offensiva, la forza difensiva, il vantaggio del campo di casa, il miglioramento da una settimana alla settimana (o la sua mancanza) e la velocità delle modifiche a ciascuno di essi. Ciò ha creato una serie di equazioni polinomiali per ogni squadra durante la stagione. Il vincitore e il punteggio per ogni partita per una determinata data potrebbero essere calcolati. L'obiettivo era quello di trovare l'insieme di coefficienti che corrispondessero maggiormente al risultato di tutti i giochi passati e di usarlo per predire il gioco delle prossime settimane.

In pratica, il sistema troverebbe soluzioni che prevedevano con precisione oltre il 90% dei risultati di gioco passati. Quindi sceglierebbe con successo circa il 60-80% dei giochi per la prossima settimana (ovvero la settimana che non è nel set di allenamento).

Il risultato: appena sopra la metà del pacchetto. Nessun premio in denaro né un sistema che avrei potuto usare per battere Vegas. È stato comunque divertente.

Ho costruito tutto da zero, nessun framework utilizzato.


21

Oltre ad alcuni dei problemi comuni, come il commesso viaggiatore e una variante del programma Mona Lisa di Roger Alsing , ho anche scritto un risolutore di Sudoku evolutivo (che ha richiesto un pensiero un po 'più originale da parte mia, piuttosto che semplicemente implementare idea di qualcun altro). Esistono algoritmi più affidabili per risolvere Sudokus ma l'approccio evolutivo funziona abbastanza bene.

Negli ultimi giorni ho giocato con un programma evolutivo per trovare "mazzi freddi" per il poker dopo aver visto questo articolo su Reddit. Al momento non è abbastanza soddisfacente, ma penso di poterlo migliorare.

Ho il mio framework che utilizzo per algoritmi evolutivi.


17

Ho sviluppato una GA home brew per un sistema di profilo di superficie laser 3D che la mia azienda ha sviluppato per l'industria del trasporto merci nel 1992. Il sistema si basava su una triangolazione tridimensionale e utilizzava uno scanner di linea laser personalizzato, una fotocamera da 512x512 (con acquisizione personalizzata hw). La distanza tra la fotocamera e il laser non sarebbe mai stata precisa e il punto focale delle fotocamere non si trovava nella posizione 256.256 che ti aspettavi che fosse!

È stato un incubo provare a elaborare i parametri di calibrazione usando la geometria standard e la risoluzione simulata dell'equazione dello stile di ricottura.

L'algoritmo genetico è stato montato in una sera e ho creato un cubo di calibrazione per testarlo. Conoscevo le dimensioni del cubo con elevata precisione e quindi l'idea era che il mio GA potesse evolvere un insieme di parametri di triangolazione personalizzati per ogni unità di scansione che avrebbe superato le variazioni di produzione.

Il trucco ha funzionato a meraviglia. Ero sbalordito per non dire altro! Nel giro di circa 10 generazioni il mio cubo "virtuale" (generato dalla scansione grezza e ricreato dai parametri di calibrazione) sembrava in realtà un cubo! Dopo circa 50 generazioni ho avuto la calibrazione di cui avevo bisogno.


11

È spesso difficile ottenere una combinazione esatta di colori quando hai intenzione di dipingere la tua casa. Spesso hai in mente un po 'di colore, ma non è uno dei colori, ti mostra il venditore.

Ieri, il mio Prof. che è un ricercatore GA ha menzionato una storia vera in Germania (scusate, non ho altri riferimenti, sì, posso scoprirlo se qualcuno lo richiede). Questo ragazzo (chiamiamolo il ragazzo dei colori ) andava dalla porta alla porta per aiutare le persone a trovare il codice colore esatto (in RGB ) che sarebbe stato l'armadio di ciò che il cliente aveva in mente. Ecco come lo farebbe:

Il ragazzo dei colori portava con sé un programma software che utilizzava GA. Cominciava con 4 colori diversi, ciascuno codificato come un cromosoma codificato (il cui valore decodificato sarebbe un valore RGB). Il consumatore sceglie 1 dei 4 colori (che è il più vicino a cui ha in mente). Il programma dovrebbe quindi assegnare la massima forma fisica a quella individuale e passare alla prossima generazione utilizzando mutazione / Crossover . I passaggi precedenti sarebbero stati ripetuti fino a quando il consumatore non avesse trovato il colore esatto e poi il ragazzo dei colori gli diceva la combinazione RGB!

Assegnando la massima idoneità al colore si chiude a ciò che il consumatore ha in mente, il programma del ragazzo del colore sta aumentando le possibilità di convergere al colore, il consumatore ha esattamente in mente. L'ho trovato molto divertente!

Ora che ho un -1, se stai pianificando altri -1, per favore. chiarire il motivo per farlo!


6
Non ho intenzione di sottovalutarti, ma immagino che sia perché non l'hai fatto tu. L'OP ha chiesto specificamente cose che avevi fatto tu stesso.
giovedì

Questa è praticamente una versione semplificata dei biomorfi di Richard Dawkins.
Nick Johnson,

1
La cosa divertente del colore è che non puoi considerarlo da solo. I consulenti del colore non si presentano con un solo colore: sono disponibili in palette e schemi. Non ha senso solo scegliere un colore da solo. Non ho votato in basso ma la tua risposta sta allungando la definizione di GA. Come si cambia / crossover un colore? Questa è più onestamente una dimostrazione di restringere iterativamente un set di dati limitato.
Kirk Broadhurst,

2
Questo forse spiega i downvotes: sembra più una scalata, non GA.
Eric Normand,

8

Un paio di settimane fa, ho suggerito una soluzione su SO utilizzando algoritmi genetici per risolvere un problema di layout grafico. È un esempio di un problema di ottimizzazione vincolata.

Sempre nell'ambito dell'apprendimento automatico, ho implementato da zero un framework di regole di classificazione basato su GA in c / c ++.
Ho anche usato GA in un progetto di esempio per allenare reti neurali artificiali (ANN) invece di usare il famoso algoritmo di backpropagation .

Inoltre, e nell'ambito della mia ricerca universitaria, ho usato GA nella formazione dei modelli nascosti di Markov come approccio aggiuntivo all'algoritmo Baum-Welch basato su EM (di nuovo in c / c ++).


Ciao Amro. Hai fatto un confronto completo tra i risultati ottenuti con backprop e GA? In tal caso, potresti condividere i risultati del confronto con noi? Come hai implementato il passaggio crossover per due NN?
Lmsasu,

@lmsasu: niente di speciale: ogni stringa o cromosoma nella popolazione rappresenta i valori di peso e di polarizzazione della rete ed è stato utilizzato un semplice operatore crossover da 1 o 2 punti. Da quello che ricordo, ci è voluto molto tempo perché la rete si allenasse usando GA. La mia implementazione è stata più di una prova di concetto di ogni altra cosa (vedi qui per un esempio giocattolo di controllo di dragamine virtuali) ... Comunque ci dovrebbero essere molti documenti là fuori che discutono sull'uso di GA non solo per imparare i pesi, ma anche evolversi la struttura della rete.
Amro,

8

Come parte del mio corso di laurea CompSci, ci è stato assegnato il problema di trovare flag jvm ottimali per la macchina virtuale di ricerca Jikes. Questo è stato valutato utilizzando la suite di benchmark Dicappo che restituisce un tempo alla console. Ho scritto un algoritmo gentic distribuito che ha cambiato questi flag per migliorare il runtime della suite di benchmark, anche se ci sono voluti giorni per correre per compensare il jitter hardware che influenza i risultati. L'unico problema era che non avevo imparato a fondo la teoria del compilatore (che era l'intento del compito).

Avrei potuto seminare la popolazione iniziale con i flag predefiniti esistenti, ma la cosa interessante era che l'algoritmo trovava una configurazione molto simile al livello di ottimizzazione O3 (ma in realtà era più veloce in molti test).

Modifica: Inoltre ho scritto il mio framework di algoritmi genetici in Python per il compito e ho semplicemente usato i comandi popen per eseguire i vari benchmark, anche se se non fosse un compito valutato avrei esaminato pyEvolve.


7

Prima di tutto, "Programmazione genetica" di Jonathan Koza ( su Amazon ) è praticamente IL libro sulle tecniche di algoritmo / programmazione genetica ed evolutiva, con molti esempi. Consiglio vivamente di provarlo.

Per quanto riguarda il mio uso di un algoritmo genetico, ho usato un algoritmo genetico (cresciuto in casa) per far evolvere un algoritmo sciame per uno scenario di raccolta / distruzione di oggetti (lo scopo pratico avrebbe potuto cancellare un campo minato). Ecco un link al documento . La parte più interessante di ciò che ho fatto è stata la funzione di fitness multi-stage, che era una necessità poiché le semplici funzioni di fitness non fornivano informazioni sufficienti affinché l'algoritmo genetico potesse differenziare sufficientemente tra i membri della popolazione.


La serie di Koza su GP è molto densa e forse non per qualcuno che non conosce GP. Suggerirei Field Guide to Programming genetica di Riccardo Poli (disponibile come copia html gratuita) o An Introduction to Genetic Algorithms di Melanie Mitchell
Nessuno

7

Faccio parte di un team che sta studiando l'uso dell'Evolutionary Computation (EC) per correggere automaticamente i bug nei programmi esistenti. Abbiamo riparato con successo una serie di bug reali nei progetti software del mondo reale (vedi la homepage di questo progetto ).

Abbiamo due applicazioni di questa tecnica di riparazione CE.

  • Il primo (informazioni sul codice e sulla riproduzione disponibili attraverso la pagina del progetto ) evolve gli alberi di sintassi astratti analizzati dai programmi C esistenti e viene implementato in Ocaml usando il nostro motore EC personalizzato.

  • Il secondo (informazioni sul codice e sulla riproduzione disponibili attraverso la pagina del progetto ), il mio contributo personale al progetto, evolve l'assembly x86 o il codice byte Java compilato da programmi scritti in numerosi linguaggi di programmazione. Questa applicazione è implementata in Clojure e utilizza anche un proprio motore EC personalizzato.

Un aspetto gradevole del calcolo evolutivo è la semplicità della tecnica che consente di scrivere le proprie implementazioni personalizzate senza troppe difficoltà. Per un buon testo introduttivo liberamente disponibile sulla programmazione genetica, consultare la Guida sul campo alla programmazione genetica .


6

Un collega e io stiamo lavorando a una soluzione per caricare merci su camion utilizzando i vari criteri richiesti dalla nostra azienda. Ho lavorato su una soluzione di algoritmo genetico mentre usa un Branch And Bound con potatura aggressiva. Stiamo ancora implementando questa soluzione, ma finora abbiamo ottenuto buoni risultati.


5

Diversi anni fa ho usato ga's per ottimizzare le grammatiche asr (riconoscimento vocale automatico) per migliori tassi di riconoscimento. Ho iniziato con elenchi di scelte abbastanza semplici (in cui il ga stava testando combinazioni di termini possibili per ogni slot) e sono arrivato a grammatiche più aperte e complesse. La forma fisica è stata determinata misurando la separazione tra termini / sequenze in una sorta di funzione fonetica della distanza. Ho anche provato a fare variazioni debolmente equivalenti su una grammatica per trovarne una compilata per una rappresentazione più compatta (alla fine sono andato con un algoritmo diretto e ha aumentato drasticamente le dimensioni del "linguaggio" che potremmo usare nelle applicazioni) .

Più recentemente li ho usati come ipotesi predefinita sulla base della quale testare la qualità delle soluzioni generate da vari algoritmi. Ciò ha comportato in gran parte la categorizzazione e diversi tipi di problemi di adattamento (ovvero creare una "regola" che spiega un insieme di scelte fatte dai revisori rispetto a un set di dati).


4

Ho realizzato un framework GA completo chiamato "GALAB", per risolvere molti problemi:

  • individuazione di ANT GSM (BTS) per ridurre la sovrapposizione e le posizioni vuote.
  • Pianificazione del progetto di vincolo di risorse.
  • Creazione di immagini evolutive. ( Evopic )
  • Problema del commesso viaggiatore.
  • Problemi N-Queen e N-Color.
  • Tour del cavaliere e problemi dello zaino.
  • Quadrati magici e puzzle di Sudoku.
  • compressione delle stringhe, basata sul problema Superstring.
  • Problema di packaging 2D.
  • Piccola vita artificiale APP.
  • Puzzle di Rubik.

Sì, la sua fonte è stata pubblicata sotto il mio libro GA .
MShams,

4

Una volta ho usato un GA per ottimizzare una funzione hash per gli indirizzi di memoria. Gli indirizzi avevano dimensioni di pagina 4K o 8K, quindi mostravano una certa prevedibilità nel modello di bit dell'indirizzo (bit meno significativi tutti zero, bit intermedi che si incrementavano regolarmente, ecc.) La funzione di hash originale era "grosso" - tendeva a colpire i cluster su ogni terzo bucket di hash. L'algoritmo migliorato aveva una distribuzione quasi perfetta.


3

Non so se i compiti contano ...

Durante i miei studi abbiamo sviluppato il nostro programma per risolvere il problema del commesso viaggiatore.

L'idea era di fare un confronto su diversi criteri (difficoltà a mappare il problema, prestazioni, ecc.) E abbiamo anche usato altre tecniche come la ricottura simulata .

Ha funzionato abbastanza bene, ma ci è voluto un po 'di tempo per capire come eseguire correttamente la fase di "riproduzione": modellare il problema attuale in qualcosa di adatto alla programmazione genetica mi ha davvero colpito come la parte più difficile ...

È stato un corso interessante poiché ci siamo anche dilettati con reti neurali e simili.

Mi piacerebbe sapere se qualcuno ha usato questo tipo di programmazione nel codice 'produzione'.


3

Ho creato un semplice GA per estrarre schemi utili dallo spettro di frequenza della musica mentre veniva riprodotta. L'output è stato utilizzato per generare effetti grafici in un plugin Winamp.

  • Input: alcuni frame FFT (immagina un array 2D di float)
  • Output: valore float singolo (somma ponderata degli input), soglia a 0,0 o 1,0
  • Geni: pesi di input
  • Funzione fitness: combinazione di duty cycle, ampiezza dell'impulso e BPM nel range sensibile.

Ho avuto alcuni GA sintonizzati su diverse parti dello spettro e su diversi limiti di BPM, quindi non tendevano a convergere verso lo stesso schema. Gli output dei primi 4 di ogni popolazione sono stati inviati al motore di rendering.

Un interessante effetto collaterale era che la forma fisica media in tutta la popolazione era un buon indicatore per i cambiamenti nella musica, anche se in genere ci sono voluti 4-5 secondi per capirlo.


3

Come parte della mia tesi ho scritto un generico framework java per l'algoritmo di ottimizzazione multi-obiettivo mPOEMS (ottimizzazione di prototipi multibiettivi con passaggi di miglioramento evoluti), che è un GA che utilizza concetti evolutivi. È generico in un modo in cui tutte le parti indipendenti dal problema sono state separate dalle parti dipendenti dal problema e un'interfaccia è predisposta per utilizzare il framework aggiungendo solo le parti dipendenti dal problema. Pertanto, chi desidera utilizzare l'algoritmo non deve iniziare da zero e facilita molto il lavoro.

Puoi trovare il codice qui .

Le soluzioni che puoi trovare con questo algoritmo sono state confrontate in un lavoro scientifico con algoritmi all'avanguardia SPEA-2 e NSGA, ed è stato dimostrato che l'algoritmo funziona in modo comparabile o persino migliore, a seconda delle metriche prendere per misurare le prestazioni, e in particolare in base al problema di ottimizzazione che si sta osservando.

Puoi trovarlo qui .

Anche come parte della mia tesi e prova del lavoro ho applicato questo quadro al problema di selezione del progetto riscontrato nella gestione del portafoglio. Si tratta di selezionare i progetti che aggiungono più valore all'azienda, supportare la maggior parte della strategia dell'azienda o sostenere qualsiasi altro obiettivo arbitrario. Ad esempio, la selezione di un certo numero di progetti da una categoria specifica o la massimizzazione delle sinergie di progetto, ...

La mia tesi che applica questo quadro al problema di selezione del progetto: http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

Successivamente ho lavorato in un dipartimento di gestione del portafoglio in uno dei 500 della fortuna, dove hanno utilizzato un software commerciale che ha anche applicato una GA al problema di selezione del progetto / ottimizzazione del portafoglio.

Ulteriori risorse:

La documentazione del framework: http://thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

Documento di presentazione di mPOEMS: http://portal.acm.org/citation.cfm?id=1792634.1792653

In realtà, con un po 'di entusiasmo, tutti potrebbero facilmente adattare il codice del framework generico a un arbitrario problema di ottimizzazione multi-obiettivo.


2

Al lavoro ho avuto il seguente problema: dati i compiti M e N DSP, qual è stato il modo migliore di assegnare compiti ai DSP? "Best" è stato definito come "minimizzare il carico del DSP più caricato". C'erano diversi tipi di attività e vari tipi di attività avevano varie ramificazioni delle prestazioni a seconda di dove erano state assegnate, quindi ho codificato l'insieme di incarichi da lavoro a DSP come una "stringa di DNA" e quindi ho usato un algoritmo genetico per "allevare" la migliore stringa di assegnazione che ho potuto.

Ha funzionato abbastanza bene (molto meglio del mio metodo precedente, che era di valutare ogni possibile combinazione ... su dimensioni di problemi non banali, ci sarebbero voluti anni per completarlo!), L'unico problema era che non c'era modo di dirlo se la soluzione ottimale fosse stata raggiunta o meno. Potevi solo decidere se l'attuale "miglior sforzo" fosse abbastanza buono, o lasciarlo correre più a lungo per vedere se poteva fare di meglio.


2

C'era una competizione su codechef.com (ottimo sito tra l'altro, gare di programmazione mensili) in cui si supponeva che si dovesse risolvere un sudoku irrisolvibile (si dovrebbe avvicinarsi il più possibile con il minor numero possibile di colonne / file / ecc.).

Quello che avrei fatto, è stato prima di generare un sudoku perfetto e poi scavalcare i campi, che sono stati dati. Da questa base piuttosto buona ho usato la programmazione genetica per migliorare la mia soluzione.

In questo caso non riuscivo a pensare a un approccio deterministico, perché il sudoku era 300x300 e la ricerca avrebbe richiesto troppo tempo.


2

Ho usato un semplice algoritmo genetico per ottimizzare il rapporto segnale-rumore di un'onda rappresentata come una stringa binaria. Lanciando i bit in alcuni modi in diversi milioni di generazioni sono stato in grado di produrre una trasformazione che ha prodotto un rapporto segnale-rumore più elevato di quell'onda. L'algoritmo avrebbe potuto essere anche "Ricottura simulata" ma non è stato utilizzato in questo caso. Alla base, gli algoritmi genetici sono semplici, e questo è stato il caso più semplice di un caso d'uso che ho visto, quindi non ho usato un framework per la creazione e la selezione della generazione - solo un seme casuale e il rapporto segnale-rumore funzione a portata di mano.


2

In un seminario a scuola, sviluppiamo un'applicazione per generare musica basata sulla modalità musicale. Il programma è stato creato in Java e l'output era un file midi con la canzone. Usiamo distinti approcci di GA per generare musica. Penso che questo programma possa essere utile per esplorare nuove composizioni.


Ottimo, ho provato qualcosa di simile: link
Todor Balabanov,

2

a undergrad, abbiamo usato NERO (una combinazione di rete neurale e algoritmo genetico) per insegnare ai robot di gioco a prendere decisioni intelligenti. E 'stato molto bello.


2

Ho sviluppato una simulazione basata su altalena multithread della navigazione robotica attraverso una serie di terreni a griglia randomizzati di fonti alimentari e miniere e sviluppato una strategia basata su algoritmi genetici per esplorare l'ottimizzazione del comportamento robotico e la sopravvivenza dei geni più adatti per un cromosoma robotico. Ciò è stato fatto utilizzando la creazione di grafici e la mappatura di ciascun ciclo di iterazione.

Da allora ho sviluppato un comportamento di gioco ancora maggiore. Un'applicazione di esempio che ho creato di recente per me stesso è stata un algoritmo genetico per risolvere il problema dei venditori ambulanti nella ricerca di percorsi nel Regno Unito, tenendo conto degli stati di inizio e obiettivo, nonché di uno / più punti di connessione, ritardi, cancellazioni, lavori di costruzione, ora di punta, scioperi pubblici, considerazione tra rotte più veloci e più economiche. Quindi fornire una raccomandazione equilibrata per l'itinerario da percorrere in un determinato giorno.

In generale, la mia strategia è quella di utilizzare la rappresentazione dei geni basata su POJO, quindi applico implementazioni di interfaccia specifiche per la selezione, la mutazione, le strategie di crossover e il punto dei criteri. La mia funzione di fitness diventa quindi sostanzialmente complessa in base alla strategia e ai criteri che devo applicare come misura euristica.

Ho anche cercato di applicare l'algoritmo genetico nei test automatizzati all'interno del codice usando cicli di mutazione sistematici in cui l'algoritmo comprende la logica e cerca di accertare una segnalazione di bug con raccomandazioni per la correzione del codice. Fondamentalmente, un modo per ottimizzare il mio codice e fornire consigli per il miglioramento, nonché un modo per automatizzare la scoperta di nuovo codice programmatico. Ho anche provato ad applicare algoritmi genetici alla produzione musicale tra le altre applicazioni.

In generale, trovo strategie evolutive come la maggior parte delle strategie di ottimizzazione metaeuristiche / globali, all'inizio sono lente da imparare ma iniziano a raccogliere man mano che le soluzioni si avvicinano sempre di più allo stato obiettivo e finché la funzione di fitness e l'euristica sono ben allineate per produrre quella convergenza nel tuo spazio di ricerca.


1

Una volta ho provato a creare un lettore per il gioco Go, basato esclusivamente sulla programmazione genetica. Ogni programma verrebbe trattato come una funzione di valutazione per una sequenza di mosse. I programmi prodotti non erano molto buoni, anche su una scheda 3x4 piuttosto ridotta.

Ho usato Perl e ho codificato tutto da solo. Farei le cose diversamente oggi.


1

Dopo aver letto The Blind Watchmaker , ero interessato al programma pascal che Dawkins ha affermato di aver sviluppato per creare modelli di organismi che potrebbero evolversi nel tempo. Ero abbastanza interessato a scrivere il mio usando Swarm . Non ho realizzato tutte le fantastiche grafiche che ha fatto, ma i miei "cromosomi" hanno controllato i tratti che hanno influenzato la capacità degli organismi di sopravvivere. Vivevano in un mondo semplice e potevano sfidarsi l'uno contro l'altro e il loro ambiente.

Gli organismi hanno vissuto o sono morti in parte a causa del caso, ma anche in base all'efficacia con cui si sono adattati ai loro ambienti locali, al modo in cui hanno consumato nutrienti e al successo con cui si sono riprodotti. È stato divertente, ma anche più prove per mia moglie che sono un fanatico.


1

È stato un po 'di tempo fa, ma ho sviluppato un GA per far evolvere i kernel di elaborazione delle immagini in effetti per rimuovere le tracce dei raggi cosmici dalle immagini del telescopio spaziale Hubble (HST). L'approccio standard consiste nell'eseguire più esposizioni con Hubble e mantenere solo le cose uguali in tutte le immagini. Dato che il tempo HST è così prezioso, sono un appassionato di astronomia e di recente ho partecipato al Congresso sul calcolo evolutivo, ho pensato di usare un GA per ripulire singole esposizioni.

Gli individui erano sotto forma di alberi che prendevano un'area di pixel 3x3 come input, eseguivano alcuni calcoli e producevano una decisione se e come modificare il pixel centrale. La forma fisica è stata valutata confrontando l'output con un'immagine ripulita in modo tradizionale (ovvero impilando le esposizioni).

In realtà ha funzionato, ma non abbastanza per giustificare la rinuncia all'approccio originale. Se non fossi stato limitato nel tempo dalla mia tesi, avrei potuto ampliare il cestino delle parti genetiche disponibile per l'algoritmo. Sono abbastanza sicuro che avrei potuto migliorarlo in modo significativo.

Librerie utilizzate: se ricordo correttamente, IRAF e cfitsio per l'elaborazione astronomica dei dati di immagine e I / O.


1

Ho sperimentato GA in gioventù. Ho scritto un simulatore in Python che ha funzionato come segue.

I geni codificavano i pesi di una rete neurale.

Gli ingressi della rete neurale erano "antenne" che rilevavano tocchi. Valori più alti significavano molto vicini e 0 significava non toccare.

Le uscite erano a due "ruote". Se entrambe le ruote andavano avanti, il ragazzo andava avanti. Se le ruote erano in direzioni opposte, il ragazzo si girava. La forza dell'uscita ha determinato la velocità di rotazione della ruota.

È stato generato un semplice labirinto. Era davvero semplice, persino stupido. C'è stato l'inizio nella parte inferiore dello schermo e un obiettivo in alto, con quattro pareti in mezzo. Ogni muro aveva uno spazio rimosso in modo casuale, quindi c'era sempre un percorso.

Ho iniziato ragazzi casuali (ho pensato a loro come bug) all'inizio. Non appena un ragazzo ha raggiunto l'obiettivo o è stato raggiunto un limite di tempo, è stata calcolata la forma fisica. Era inversamente proporzionale alla distanza dall'obiettivo in quel momento.

Li ho poi accoppiati e li ho "allevati" per creare la prossima generazione. La probabilità di essere scelto per essere allevato era proporzionale alla sua forma fisica. A volte questo significava che uno veniva allevato ripetutamente con se stesso se aveva una forma fisica relativa molto elevata.

Ho pensato che avrebbero sviluppato un comportamento di "abbraccio alla parete sinistra", ma sembravano sempre seguire qualcosa di meno ottimale. In ogni esperimento, i bug convergevano in uno schema a spirale. Avrebbero spirato verso l'esterno fino a toccare un muro a destra. Lo avrebbero seguito, poi quando sarebbero arrivati ​​al buco, sarebbero precipitati a spirale (lontano dal buco) e intorno. Farebbero una rotazione di 270 gradi a sinistra, quindi di solito entrano nello spazio. Ciò li avrebbe portati attraverso la maggior parte dei muri e spesso verso l'obiettivo.

Una caratteristica che ho aggiunto è stata quella di inserire un vettore di colore nei geni per tracciare la relazione tra gli individui. Dopo alcune generazioni, sarebbero tutti dello stesso colore, il che mi dice che dovrei avere una migliore strategia di allevamento.

Ho cercato di convincerli a sviluppare una strategia migliore. Ho complicato la rete neurale aggiungendo una memoria e tutto il resto. Non ha aiutato Ho sempre visto la stessa strategia.

Ho provato varie cose come avere pool genetici separati che si sono ricombinati solo dopo 100 generazioni. Ma nulla li spingerebbe a una strategia migliore. Forse era impossibile.

Un'altra cosa interessante è rappresentare graficamente la forma fisica nel tempo. C'erano schemi definiti, come la massima forma fisica che scendeva prima che salisse. Non ho mai visto un libro di evoluzione parlare di quella possibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.