Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l'ultima versione in inglese.

Codifica e minimizzazione di una funzione di fitness utilizzando l'algoritmo genetico

Questo esempio mostra come creare e minimizzare una funzione di fitness per il risolutore dell'algoritmo genetico ga utilizzando tre tecniche:

  • Di base

  • Inclusi parametri aggiuntivi

  • Vettorizzato per la velocità

Funzione di fitness di base

La funzione di fitness di base è la funzione di Rosenbrock, una comune funzione di test per gli ottimizzatori. La funzione è una somma di quadrati:

f(x)=100(x12-x2)2+(1-x1)2.

La funzione ha un valore minimo pari a zero nel punto [1,1] . Poiché la funzione di Rosenbrock è piuttosto ripida, tracciare il logaritmo di uno più la funzione.

fsurf(@(x,y)log(1 + 100*(x.^2 - y).^2 + (1 - x).^2),[0,2])
title('log(1 + 100*(x(1)^2 - x(2))^2 + (1 - x(1))^2)')
view(-13,78)
hold on
h1 = plot3(1,1,0.1,'r*','MarkerSize',12);
legend(h1,'Minimum','Location','best');
hold off

Codice funzione fitness

Il file funzione simple_fitness implementa la funzione di Rosenbrock.

type simple_fitness
function y = simple_fitness(x)
%SIMPLE_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc. 

  y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;

Una funzione di fitness deve accettare un input x dove x è un vettore riga con tanti elementi quante sono le variabili nel problema. La funzione di fitness calcola il valore della funzione e restituisce quel valore scalare nel suo argomento di ritorno y .

Riduci a icona usando ga

Per minimizzare la funzione di fitness utilizzando ga, passare una funzione handle alla funzione di fitness e il numero di variabili nel problema. Per far sì che ga esamini la regione rilevante, includere i limiti -3 <= x(i) <= 3. Passare i limiti come quinto e sesto argomento dopo numberOfVariables . Per i dettagli sulla sintassi ga, vedere ga .

ga è un algoritmo casuale. Per garantire la riproducibilità, impostare il flusso di numeri casuali.

rng default % For reproducibility
FitnessFunction = @simple_fitness;
numberOfVariables = 2;
lb = [-3,-3];
ub = [3,3];
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.5083    2.2781

fval = 0.2594

Il x restituito dal risolutore è il punto migliore nella popolazione finale calcolata da ga. fval è il valore della funzione simple_fitness valutata nel punto x. ga non ha trovato una soluzione particolarmente buona. Per modi per migliorare la soluzione, vedere Effetti delle opzioni dell'algoritmo genetico .

Funzione Fitness con parametri aggiuntivi

A volte la funzione di fitness ha parametri aggiuntivi che agiscono come costanti durante l'ottimizzazione. Ad esempio, una funzione di Rosenbrock generalizzata può avere parametri aggiuntivi che rappresentano le costanti 100 e 1:

f(x,a,b)=a(x12-x2)2+(b-x1)2.

a e b sono parametri della funzione di fitness che agiscono come costanti durante l'ottimizzazione (non vengono modificati come parte della minimizzazione). Il file parameterized_fitness.m implementa questa funzione di fitness parametrica.

type parameterized_fitness
function y = parameterized_fitness(x,p1,p2)
%PARAMETERIZED_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc.        
 
y = p1 * (x(1)^2 - x(2)) ^2 + (p2 - x(1))^2;

Riduci al minimo utilizzando parametri aggiuntivi

Utilizzare una funzione anonima per catturare i valori degli argomenti aggiuntivi, vale a dire le costanti a e b. Crea una funzione handle FitnessFunction per una funzione anonima che accetta un input x e chiama parameterized_fitness con x, a e b. La funzione anonima contiene i valori a e b esistenti al momento della creazione della funzione handle.

a = 100;
b = 1; % define constant values
FitnessFunction = @(x) parameterized_fitness(x,a,b);
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.3198    1.7434

fval = 0.1025

Vedi Passing Extra Parameters .

Funzione di fitness vettorizzata

Per aumentare la velocità, vettorializza la tua funzione fitness. Una funzione di idoneità vettorializzata calcola l'idoneità di un insieme di punti in una sola volta, il che generalmente consente di risparmiare tempo rispetto alla valutazione di questi punti individualmente. Per scrivere una funzione di fitness vettorializzata, fai in modo che la funzione accetti una matrice, in cui ogni riga della matrice rappresenta un punto, e fai in modo che la funzione di fitness restituisca un vettore colonna di valori della funzione di fitness.

Per modificare il file funzione parameterized_fitness in una forma vettorializzata:

  • Cambia ogni variabile x(i) in x(:,i), ovvero il vettore colonna delle variabili corrispondente a x(i).

  • Modificare ogni moltiplicazione vettoriale * in .* e ogni elevazione a potenza ^ in .^, indicando che le operazioni sono elemento per elemento. In questo codice non ci sono moltiplicazioni vettoriali, quindi basta cambiare gli esponenti.

type vectorized_fitness
function y = vectorized_fitness(x,p1,p2)
%VECTORIZED_FITNESS fitness function for GA

%   Copyright 2004-2010 The MathWorks, Inc.  

y = p1 * (x(:,1).^2 - x(:,2)).^2 + (p2 - x(:,1)).^2;

Questa versione vettorializzata della funzione di fitness prende una matrice x con un numero arbitrario di punti, ovvero un numero arbitrario di righe, e restituisce un vettore colonna y con lo stesso numero di righe di x.

Informare il risolutore che la funzione di fitness è vettorializzata nell'opzione 'UseVectorized'.

options = optimoptions(@ga,'UseVectorized',true);

Includere le opzioni come ultimo argomento di ga .

VFitnessFunction = @(x) vectorized_fitness(x,100,1);
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.6219    2.6334

fval = 0.3876

Qual è la differenza di velocità? Ottimizzazione del tempo sia con che senza la vettorizzazione.

tic
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options);
Optimization terminated: maximum number of generations exceeded.
v = toc;
tic
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub);
Optimization terminated: maximum number of generations exceeded.
nv = toc;
fprintf('Using vectorization took %f seconds. No vectorization took %f seconds.\n',v,nv)
Using vectorization took 0.153337 seconds. No vectorization took 0.212880 seconds.

In questo caso, il miglioramento ottenuto tramite la vettorizzazione non è stato notevole, perché il calcolo della funzione di fitness richiede pochissimo tempo. Tuttavia, per funzioni di fitness che richiedono più tempo, può essere utile la vettorializzazione. Vedi Vectorize the Fitness Function .

Vedi anche

Argomenti