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ò!