Come produciamo la prossima generazione?

5

Grazie ad alcune ottime risposte in un domanda precedente , penso di avere ora una migliore comprensione delle GA, ma sono ancora confuso su un paio di punti. Inizierò con uno qui.

Ho letto su come funziona un algoritmo GA e ho visto ciò che sembra essere opinioni contrastanti su ciò che fai in ogni generazione:

Alcuni articoli sembrano dire che scegli i due migliori cromosomi e li accoppi, usando i tassi di crossover e di mutazione per produrre una prole. Quindi sostituisci il cromosoma con l'idoneità più bassa con la prole. Questo cambia solo un cromosoma per generazione, che avrei pensato avrebbe prodotto un cambio molto lento nel complesso, e quindi un approccio lento a una soluzione. Perché non farlo per (dire) il miglior 50% dei cromosomi e sostituire il peggior 50% ad ogni generazione? Non ho visto questo suggerito.

L'altro approccio che ho visto è quello di scegliere due cromosomi usando un processo stocastico, come una ruota della roulette, accoppiarli per produrre una prole, quindi ripetere finché non hai generato una popolazione completamente nuova. Quindi getti via completamente l'ultima generazione e la sostituisci con la nuova popolazione. Mentre questo produrrà evidenti cambiamenti per generazione rispetto al metodo precedente, ha lo svantaggio (apparente) di eliminare i migliori cromosomi della generazione precedente. Certo, speriamo che la progenie possa essere migliore, ma potrebbe non esserlo, e anche se sono nel complesso, tu butti via ancora ciò che potrebbe essere cromosomi ancora migliori.

Scusa se questa è una domanda stupida, ma non ho visto una spiegazione chiara di questa parte dell'algoritmo, e non sono sicuro di come dovrebbe essere fatto. Ho scritto il mio primissimo codice GA ieri sera, che non ha funzionato male, ma non ha funzionato come speravo, e mi chiedo se sto facendo questa parte in modo errato.

Grazie per l'aiuto che puoi dare.

Modifica: a seguito di alcuni commenti e risposte, ecco ulteriori informazioni sul problema che sto cercando di risolvere. Essendo davvero nuovo in questo, ho iniziato con il problema più semplice che ho potuto trovare, quello di trovare una stringa di tutti gli 1. Correggo la lunghezza della stringa, diciamo 20, e l'idoneità di ogni cromosoma sarà il numero di 1 diviso per 20.

La mia prima definizione di prestazioni è stata la vicinanza con la soluzione giusta. Data la natura semplice di questo problema, so che la soluzione giusta è solo una stringa di venti 1.

Ho avuto un'ulteriore riproduzione, e ho scoperto che aumentando il numero di cromosomi aiutati per stringhe di lunghezza fino a circa 30, ma una volta superata, non ha mai superato una fitness di circa 0,8, cioè sedici 1s in la stringa.

Non so se questo aiuti. Dai commenti, sembra che debba continuare a giocare (vergogna!).

Edit2: Seguendo tutti i commenti eccellenti, ma in particolare la spiegazione di Delioth, ho cercato di mantenere il 50% della popolazione attuale con il più alto livello di fitness e di sostituire il 50% più povero con nuovi cromosomi allevati dalla roulette selezione delle ruote dalla popolazione attuale. I risultati sono stati piuttosto drammatici, con l'AG che ha trovato la soluzione corretta in circa 200 generazioni, anche quando ho aumentato significativamente la lunghezza della corda. Questo a confronto con esso non trovandolo dopo 10.000 generazioni prima!

Ho provato a giocare con il rapporto dei cromosomi correnti mantenuto, ma ho scoperto che fintanto che tenevo lontano dagli estremi in entrambi i casi, non faceva molta differenza.

Grazie a tutti per l'aiuto. Questa è stata una grande esperienza di apprendimento. Ho altre domande, quindi tornerò!

    
posta Avrohom Yisroel 21.12.2016 - 15:21
fonte

2 risposte

2

Gli algoritmi genetici sono uno di quei pezzi in CS dove è meno "scienza" e più "arte", e molto dipendenti dai requisiti. Puoi provare alcune cose, regolarle un po 'e vedere come questo si rivela e alla fine arrivare al tuo consenso.

Come regola, ci sono 4 cose che puoi fare in varie combinazioni per creare una nuova generazione:

  • Accoppiamento, che di solito produce due bambini (xxxxx + yyyyy = > xxyyy + yyxxx o varie altre possibili suddivisioni)

  • Mutazione, modifica di una cosa da un cromosoma e spingendola in avanti (xxxxx = > xxxyx)

  • Nuovo sangue, dove generiamo un cromosoma completamente nuovo nella nuova generazione

  • Non ricordo il nome, ma anche l'inoltro di un cromosoma immodificato alla generazione successiva è un'opzione.

In un tipico algoritmo genetico, generalmente usi tutti questi - ma di solito è anche del tutto casuale. Ci piace usare una sorta di selezione parziale per migliorare le nostre generazioni, ma se prendiamo le migliori e decidiamo di mantenere solo quelli che l'algoritmo tenderà a ristagnare - come esempio, supponiamo di avere 10 copie di xxxyzz in un pool genico di 20. Se manteniamo il 50% superiore come-è e si accoppiano e si mutano per creare altri 8, abbiamo un intero pool di xxxyzz con due nuovi bloods e non stiamo facendo alcun progresso, dal momento che il 90% dei nostri cromosomi sono gli stessi (o un po 'fuori dallo stesso).

Come tale, un tipico algoritmo genetico presuppone che ogni generazione sia completamente nuova, anche se alcuni membri sono uguali alla generazione precedente. Cerchiamo di mantenere il numero di membri "mantenuti" al minimo, dal momento che poche copie di una soluzione "decente" possono facilmente travolgere una popolazione se ne sono conservate troppe, il che porta alla stagnazione (e una volta raggiunta una stagnazione sufficiente , ogni generazione non ti aiuta molto dal momento che stai facendo affidamento su un nuovo sangue fortunato o su un buon miglioramento incrementale).

In un caso in cui ci sono diverse soluzioni "corrette" molto diverse / distinte (cromosomi finali), potrebbe essere necessario avere un alto tasso di cromosomi completamente nuovi. Nel caso in cui conosci la struttura generale del risultato, potresti non volere alcun nuovo sangue - potresti semplicemente volere cambiamenti incrementali sui cromosomi che hai (dal momento che il nuovo sangue potrebbe a quel punto darti una risposta del tutto non funzionante) - ma puoi mantenere nuovo sangue nell'algoritmo e potrebbe fare di meglio.

    
risposta data 21.12.2016 - 17:20
fonte
3

Non c'è una risposta corretta a questo - ogni variazione ha i suoi meriti e anche svantaggi ... Per esempio in alcuni problemi che sono strongmente limitati non vorrai cambiare l'intera popolazione, poiché nessuno di quelli nuovi potrebbe essere del tutto in forma, mentre sarebbero state piccole variazioni sugli originali. Al contrario, alcuni problemi con uno spazio di ricerca molto ampio potrebbero trarre vantaggio dall'avere molti cambiamenti.

In breve, dovresti pensare al problema che hai e sperimentare per trovare la strategia ottimale per ogni problema specifico. Un buon modo per pensarci è esaminare l'evoluzione reale - se solo i migliori fossero favoriti ogni volta che la diversità genetica si abbassa e un problema specifico potrebbe far fallire tutta la popolazione. Tenendo presente questo, è "solitamente" meglio avere una buona dose di diversità per ogni generazione che aiuta a evitare di rimanere bloccati nei massimi / minimi locali e avere una migliore possibilità di trovare soluzioni ottimali

    
risposta data 21.12.2016 - 15:32
fonte

Leggi altre domande sui tag