Effetti delle opzioni dell'algoritmo genetico
Questo esempio mostra gli effetti di alcune opzioni per la funzione dell'algoritmo genetico ga. Le opzioni possono essere create e modificate utilizzando la funzione optimoptions.
Imposta un problema per ga
ga cerca il minimo di una funzione utilizzando l'algoritmo genetico. Per questo esempio, utilizzare ga per minimizzare la funzione di fitness shufcn, una funzione reale di due variabili.
Tracciare shufcn sull'intervallo = [-2 2;-2 2] chiamando plotobjective, che viene incluso quando si esegue questo esempio.
plotobjective(@shufcn,[-2 2; -2 2]);

Per utilizzare il risolutore ga, fornire almeno due argomenti di input: una funzione di fitness e il numero di variabili nel problema. I primi due argomenti di output restituiti da ga sono x, il punto migliore trovato, e Fval, il valore della funzione nel punto migliore. Un terzo argomento di output, exitFlag, indica il motivo per cui ga si è arrestato. ga può anche restituire un quarto argomento, Output, che contiene informazioni sulle prestazioni del risolutore.
FitnessFunction = @shufcn; numberOfVariables = 2;
Eseguire il risolutore ga.
rng default % For reproducibility [x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The number of generations is: %d\n', Output.generations);The number of generations is: 124
fprintf('The number of function evaluations is: %d\n', Output.funccount);The number of function evaluations is: 5881
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.199
Se si esegue questo esempio senza il comando rng default, i risultati potrebbero essere diversi, perché ga è un algoritmo stocastico.
Come funziona l'algoritmo genetico
L'algoritmo genetico agisce su una popolazione utilizzando un insieme di operatori che vengono applicati alla popolazione stessa. Una popolazione è un insieme di punti nello spazio di progettazione. Per impostazione predefinita, la popolazione iniziale viene generata in modo casuale. L'algoritmo calcola la generazione successiva della popolazione utilizzando l'idoneità degli individui della generazione attuale. Per i dettagli, vedere Come funziona l'algoritmo genetico .
Aggiungi visualizzazione
Per visualizzare le prestazioni del risolutore mentre è in esecuzione, impostare un'opzione 'PlotFcn' utilizzando optimoptions . In questo caso, selezionare due funzioni di grafico in una matrice di celle. Imposta gaplotbestf, che traccia il punteggio migliore e medio della popolazione a ogni generazione. Impostare anche gaplotstopping, che traccia la percentuale di criteri di arresto soddisfatti.
opts = optimoptions(@ga,'PlotFcn',{@gaplotbestf,@gaplotstopping});Eseguire il risolutore ga, incluso l'argomento opts.
[x,Fval,exitFlag,Output] = ...
ga(FitnessFunction,numberOfVariables,[],[],[],[],[],[],[],opts);ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

Specificare le opzioni della popolazione
Le opzioni di popolazione possono avere un impatto notevole sulle prestazioni del risolutore. La velocità di ogni iterazione dipende dalla dimensione della popolazione: una popolazione più numerosa comporta iterazioni più lente. Al contrario, una popolazione più numerosa porta ga a esplorare in modo più approfondito, e quindi può portare a una soluzione migliore. Allo stesso modo, un intervallo iniziale più ampio può portare a un'esplorazione più approfondita, ma può richiedere una popolazione più numerosa per esplorare l'intervallo più ampio con la stessa accuratezza.
Specifica la dimensione della popolazione
ga crea una popolazione iniziale predefinita utilizzando un generatore di numeri casuali uniformi. La dimensione predefinita della popolazione utilizzata da ga è 50 quando il numero di variabili decisionali è inferiore a 5 e 200 in caso contrario. La dimensione predefinita potrebbe non essere adatta per alcuni problemi; ad esempio, una popolazione più piccola può essere sufficiente per problemi più piccoli. Poiché il problema attuale ha solo due variabili, specificare una dimensione della popolazione pari a 10. Impostare il valore dell'opzione PopulationSize su 10 nelle opzioni esistenti, opts .
opts.PopulationSize = 10;
Specifica l'intervallo di popolazione iniziale
Il metodo predefinito per generare una popolazione iniziale utilizza un generatore di numeri casuali uniformi. Per problemi senza vincoli interi, ga crea una popolazione iniziale in cui tutti i punti sono compresi tra –10 e 10. Ad esempio, è possibile generare una popolazione di dimensione tre nell'intervallo predefinito utilizzando questo comando:
Population = [-10,-10] + 20*rand(3,2);
È possibile impostare l'intervallo iniziale modificando l'opzione InitialPopulationRange. L'intervallo deve essere una matrice con due righe. Se l'intervallo ha una sola colonna, ovvero è 2 per 1, allora l'intervallo di ogni variabile è l'intervallo dato. Ad esempio, se si imposta l'intervallo su [-1; 1], l'intervallo iniziale per entrambe le variabili è compreso tra -1 e 1. Per specificare un intervallo iniziale diverso per ciascuna variabile, è necessario specificare l'intervallo come una matrice con due righe e numberOfVariables colonne. Ad esempio, se si imposta l'intervallo su [-1 0; 1 2], la prima variabile avrà un intervallo compreso tra -1 e 1, mentre la seconda variabile avrà un intervallo compreso tra 0 e 2 (ogni colonna corrisponde a una variabile).
Modificare il valore dell'opzione InitialPopulationRange nelle opzioni esistenti, opts .
opts.InitialPopulationRange = [-1 0; 1 2];
Eseguire il risolutore ga.
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
[],[],[],[],opts);ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

fprintf('The number of generations is: %d\n', Output.generations);The number of generations is: 67
fprintf('The number of function evaluations is: %d\n', Output.funccount);The number of function evaluations is: 614
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -179.987
Riproduci i risultati
Per impostazione predefinita, ga inizia con una popolazione iniziale casuale creata utilizzando i generatori di numeri casuali MATLAB ®. Il risolutore produce la generazione successiva utilizzando gli operatori ga che utilizzano anch'essi gli stessi generatori di numeri casuali. Ogni volta che viene generato un numero casuale, lo stato dei generatori di numeri casuali cambia. Quindi, anche se non modifichi alcuna opzione, potresti ottenere risultati diversi eseguendo nuovamente il risolutore.
Esegui due volte il risolutore per mostrare questo fenomeno.
Eseguire il risolutore ga.
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.484
Esegui nuovamente ga.
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -185.867
ga fornisce risultati diversi nelle due esecuzioni perché lo stato del generatore di numeri casuali cambia da un'esecuzione all'altra.
Se si desidera riprodurre i risultati prima di eseguire ga, è possibile salvare lo stato del flusso di numeri casuali.
thestate = rng;
Esegui ga .
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.467
Reimposta lo stream e riesegui ga. I risultati sono identici a quelli della prova precedente.
rng(thestate); [x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.467
Se si esegue ga prima di specificare di riprodurre i risultati, è possibile reimpostare il generatore di numeri casuali a condizione di disporre della struttura output.
strm = RandStream.getGlobalStream; strm.State = Output.rngstate.State;
Ripeti ga . Ancora una volta, i risultati sono identici.
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables);
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.467
Modificare i criteri di arresto
ga utilizza quattro criteri diversi per determinare quando arrestare il risolutore. ga si arresta quando raggiunge il numero massimo di generazioni; per impostazione predefinita, questo numero è 100 volte il numero di variabili. ga rileva anche se il valore di fitness migliore non cambia per un certo tempo espresso in secondi (limite di tempo di stallo) o per un certo numero di generazioni (generazioni di stallo massime). Un altro criterio è il limite massimo di tempo in secondi. Modificare i criteri di arresto per aumentare il numero massimo di generazioni a 300 e il numero massimo di generazioni di stallo a 100.
opts = optimoptions(opts,'MaxGenerations',300,'MaxStallGenerations', 100);
Eseguire nuovamente il risolutore ga.
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
[],[],[],[],opts);ga stopped because the average change in the fitness value is less than options.FunctionTolerance.

fprintf('The number of generations is: %d\n', Output.generations);The number of generations is: 299
fprintf('The number of function evaluations is: %d\n', Output.funccount);The number of function evaluations is: 2702
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.729
Specificare gli operatori ga
ga inizia con un insieme casuale di punti nella popolazione e utilizza operatori per produrre la generazione successiva della popolazione. I diversi operatori sono scaling, selection, crossover mutation. La casella degli strumenti fornisce diverse funzioni da specificare per ciascun operatore. Specificare fitscalingprop per FitnessScalingFcn e selectiontournament per SelectionFcn.
opts = optimoptions(@ga,'SelectionFcn',@selectiontournament, ... 'FitnessScalingFcn',@fitscalingprop);
Ripeti ga .
[x,Fval,exitFlag,Output] = ga(FitnessFunction,numberOfVariables,[],[],[], ...
[],[],[],[],opts);ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
fprintf('The number of generations is: %d\n', Output.generations);The number of generations is: 52
fprintf('The number of function evaluations is: %d\n', Output.funccount);The number of function evaluations is: 2497
fprintf('The best function value found is: %g\n', Fval);The best function value found is: -186.417
Il valore della funzione migliore può migliorare o peggiorare in base agli operatori specificati. Sperimentare diversi operatori è spesso il modo migliore per determinare quale insieme di operatori funziona meglio per risolvere il tuo problema.