La definizione del punto di arresto di un algoritmo genetico vanifica lo scopo dell'algoritmo?


11

Wikipedia definisce il punto di terminazione di una GA a questo:

Comunemente, l'algoritmo termina quando è stato prodotto un numero massimo di generazioni o quando è stato raggiunto un livello di fitness soddisfacente per la popolazione. Se l'algoritmo è terminato a causa di un numero massimo di generazioni, è possibile che sia stata raggiunta o meno una soluzione soddisfacente.

Ora, se termina quando è stato raggiunto un livello di forma fisica soddisfacente e tu sei quello che definisce quel livello di forma fisica, perché non dovresti essere in grado di creare tu stesso il genoma "perfetto" dall'inizio, poiché conosci già le caratteristiche di questo genoma perfetto?

Immagino di essere solo un po 'confuso qui. Ho pensato che lo scopo di un GA fosse quello di evolvere costantemente e mostrarci forse una soluzione ancora migliore di quello che pensavamo, e la nostra funzione di fitness era solo qualcosa che ci ha aiutato lungo il percorso, non qualcosa che abbiamo messo sul piedistallo come terminazione " stato "perfetto". Questo non distrugge il punto?


1
Probabilmente una soluzione migliore per cstheory.
Karl Bielefeldt,

Anche se non c'era quello :)
slandau il

1
@Karl: la domanda è un po 'delicata per cstheory. Probabilmente sarà chiuso lì.
Robert Harvey,

2
Grazie, @Robert. Ora ricordo perché non visito lì. Immagino che questa sia una di quelle domande "tra le crepe".
Karl Bielefeldt,

1
Conosci già anche le caratteristiche del tuo "compagno perfetto": ti renderanno perfettamente felice! Ma non basta trovarli (figuriamoci costruirli da zero ...). Anche la sperimentazione è necessaria.
Kilian Foth,

Risposte:


17

La funzione fitness valuta l' output del tuo algoritmo. È del tutto possibile riconoscere un output ideale quando lo vedi, ma non conoscere i passaggi per produrre quell'output da un determinato input. Ecco dove gli algoritmi genetici sono più utili.

Ad esempio, un'applicazione divertente comune di GA è la produzione di un'animazione in grado di spostare una creatura virtuale in modo efficiente. È facile dire se la creatura si sta muovendo a una certa velocità su una linea relativamente dritta. Questa è la tua funzione di fitness. È molto più difficile dire l'esatta sequenza di movimenti "muscolari" per farlo.


3
Va anche notato che spesso ti fermi dopo x generazioni perché GA potrebbe finire a girare indefinitamente perché rimane bloccato su un minimo / massimo locale che non soddisfa il tuo punteggio di fitness ottimale. Ciò può accadere se le funzioni di selezione / crossover / mutazione non sono regolate abbastanza bene per il set di problemi.
Steven Evers,

@Karl Ricordo soluzione algoritmo genetico di Andrew Cooke a produrre il primo Malbolge "Ciao Mondo" e poi ha perso una soluzione migliore inviata a lui stackoverflow.com/questions/5338627/...
pageman

8

Spesso è possibile determinare l'idoneità di una soluzione ma non è possibile determinare direttamente la soluzione stessa. Supponiamo che tu stia cercando di evolvere conigli veloci e ci siano una manciata di geni che influiscono sulla velocità del coniglio. Puoi testare la velocità del coniglio, ma enumerare tutte le combinazioni di geni relativi alla velocità sarebbe impraticabile. In tal caso, potresti avere un GA che corre conigli e alleva quelli più veloci. Potresti farlo per sempre, ma probabilmente preferiresti fermarti quando:

  • hai trovato un coniglio più veloce di X o
  • il miglioramento incrementale nell'arco di n generazioni è sceso al di sotto di qualche soglia, o
  • hai allevato conigli attraverso m generazioni

5

L'intero punto della GA è di darti la soluzione al problema che ha quel livello di fitness. Questa soluzione sarebbe molto difficile da trovare utilizzando altri algoritmi di ricerca più convenzionali, il che di solito è il motivo per cui stai usando un GA in primo luogo.

O invece di un limite di valore di fitness, potresti decidere quante generazioni vuoi correre (più generazioni corri, più possibilità hai di trovare valori di fitness sempre più alti). Ad esempio, nel problema del venditore ambulante, ottenere un percorso con il costo più basso tra le città che devi percorrere.

Se la tua condizione di arresto è un certo livello di fitness che è accettabile o un certo vincolo di tempo (eseguendo GA per un periodo di tempo massimo o un numero limitato di generazioni per applicazioni critiche come il pathfinding o le applicazioni AI) è solitamente determinato dal tuo problema dominio.


3

Intuitivamente, lo scopo di un algoritmo genetico è quello di formulare una soluzione algoritmica a un problema che non si presta ad una semplice analisi logica. Una volta raggiunto tale obiettivo, il GA non deve proseguire oltre.

Naturalmente, se si desidera una migliore "forma fisica", l'algoritmo genetico può essere lasciato in esecuzione per vedere se riesce a trovare una soluzione più ottimizzata, oppure l'algoritmo genetico può essere modificato per vedere se convergerà su una soluzione migliore.


2

Un algoritmo genetico richiede un modo per premiare i buoni geni con una maggiore propagazione. Se non avessi modo di distinguere geni buoni da geni cattivi, non potresti usare affatto un algoritmo genetico.

Affinché un algoritmo genetico funzioni, è necessario consentire la riproduzione delle soluzioni più idonee rispetto alle soluzioni meno adeguate. Altrimenti, proveresti solo soluzioni casuali.

Ecco un tipico esempio della mia esperienza personale: sviluppando uno dei primi sistemi di composizione vocale, abbiamo avuto difficoltà a trovare un algoritmo per abbinare un nome parlato a una copia memorizzata con lo stesso nome. Ci è stato detto che era sufficiente una precisione del 95% selezionando un nome su 25. Avevamo un corpus di persone memorizzate che pronunciavano 25 nomi 10 volte ciascuno.

In primo luogo, abbiamo sviluppato un sistema di input che misurava la lunghezza della parola parlata e l'energia di frequenza in diversi pezzi normalizzati di essa. Quindi abbiamo sviluppato un algoritmo che ha assegnato pesi alle partite su quei parametri e confrontato due serie di parametri attraverso quei pesi.

Ora, abbiamo fatto un ultimo passo: quale dovrebbe essere il valore di quei pesi?

Abbiamo creato 1.000 set casuali di pesi e li abbiamo testati contro il corpus. Abbiamo buttato via la 500 che ha fatto il peggio. Per i restanti 500, abbiamo duplicato ciascuno e in uno di essi, sollevato o abbassato casualmente uno dei pesi.

Abbiamo ripetuto questo processo su un computer per circa due settimane fino a quando non ha finalmente ottenuto una serie di pesi che soddisfacevano il criterio di precisione del 95%. Quindi l'abbiamo testato su dati non presenti nel corpus. Era preciso al 92% circa. Quindi abbiamo impiegato più tempo per ottenere un'accuratezza del 98% sul corpus e quell'insieme di pesi ha prodotto un'accuratezza del 95% sui dati non presenti nel corpus.

Quindi, il punto è che devi avere una funzione di fitness per eseguire un algoritmo genetico. Se non hai modo di distinguere geni buoni da geni cattivi, come puoi assicurarti che i geni buoni si riproducano e quelli cattivi no?


0

Scorrere fino a quando una soluzione non differisce molto da quella precedente. Per molto, ti preghiamo di comprendere una tolleranza fissa.

Solution in iteration n-6: 600
Solution in iteration n-5: 800
Solution in iteration n-4: 768
Solution in iteration n-3: 780 
Solution in iteration n-2: 778
Solution in iteration n-1: 778.23
Solution in iteration n: 780.18
Solution in iteration n+1: 780.1815

In questo esempio, se la tolleranza fissa era 0,01, allora (n + 1) ti dice di smettere perché abs (soluzione (n + 1) -soluzione (n)) <0.01.

Riprendendo, ecco quando il tuo algoritmo può dire: questo non migliorerà!


0

Per una risposta rapida alla tua domanda principale: esiste una grande differenza tra sapere cosa vuoi raggiungere e sapere come arrivarci.

Più in dettaglio, ad esempio, con uno dei problemi più popolari risolti utilizzando algoritmi genetici / evolutivi, di solito un caso di studio in classe, che trova il percorso ottimale in un grafico. Questo è spesso usato in rete per trovare il percorso più economico da un'estremità all'altra. Quando si definiscono i costi (numero di salti, costo per ogni hop, ecc ...) si definisce anche il costo target (livello di fitness) a cui si è soddisfatti del risultato. Il tuo algoritmo potrebbe non trovare il meglio, ma troverà un ottimale algoritmicamente accettabile. Con questo intendo dire che il rapporto costi / benefici di trovare una risposta migliore è proibitivo.

Con GA / EA scoprirai che è normale che trovi molto rapidamente una risposta ottimale del 95% +, ma restringere quell'ultimo 5% è esponenzialmente più costoso. Quindi la teoria è che tu definisca un ottimale accettabile per ottenere il miglior risultato nel minor tempo possibile. Poiché il costo di ricerca, ad esempio l'1% superiore, potrebbe superare i suoi benefici rispetto al 5% superiore, si definisce il livello ottimale accettabile.

Per riassumere, ora non si risponde a nessun problema particolare, si definisce semplicemente, per problema, il proprio ottimale accettabile, il punto in cui trovare una risposta migliore non è pratico.


0

Esistono alcune ricerche sulla correzione di bug in C con algoritmi genetici fornendo casi di test negativi e positivi come funzioni di fitness, insieme a codice non funzionante come input. Questo è un esempio di un problema che potrebbe essere risolto da un essere umano, ma è più facile da eseguire per un algoritmo genetico. È importante notare:

Sebbene i metodi descritti in questo documento non evolvano da zero i nuovi programmi, mostrano come evolvere software legacy per riparare i guasti esistenti.

Tuttavia, i nuovi programmi si sono evoluti da zero, ma non in C. I pochi programmi non banali scritti nel linguaggio di programmazione esoterico di Malbolge sono stati tutti (per quanto ne so) evoluti, non scritti. Il linguaggio è troppo complesso per essere utilizzato da un programmatore e troppo contorto per dedurre in modo efficiente i programmi dalla sola logica, quindi la maggior parte dei programmi in esso scritti è stata prodotta da algoritmi genetici. La funzione fitness è generalmente la distanza di modifica dell'output previsto.

Questo è piacevolmente circolare, in un certo senso. Osservando che il codice genetico complesso è scritto da processi evolutivi, possiamo simulare i processi evolutivi per produrre codice in un linguaggio complesso diverso, senza nemmeno sapere come funziona il codice!

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.