Contenuto principale

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

Esecuzione di un'ottimizzazione multiobiettivo utilizzando l'algoritmo genetico

Questo esempio mostra come eseguire un'ottimizzazione multiobiettivo utilizzando la funzione dell'algoritmo genetico multiobiettivo gamultiobj in Global Optimization Toolbox.

Semplice problema di ottimizzazione multiobiettivo

gamultiobj può essere utilizzato per risolvere problemi di ottimizzazione multiobiettivo in più variabili. Qui vogliamo minimizzare due obiettivi, ciascuno con una variabile decisionale.

   min F(x) = [objective1(x); objective2(x)]
    x
   where, objective1(x) = (x+2)^2 - 10, and
          objective2(x) = (x-2)^2 + 20
% Plot two objective functions on the same axis
x = -10:0.5:10;
f1 = (x+2).^2 - 10;
f2 = (x-2).^2 + 20;
plot(x,f1);
hold on;
plot(x,f2,'r');
grid on;
title('Plot of objectives ''(x+2)^2 - 10'' and ''(x-2)^2 + 20''');

I due obiettivi hanno i loro minimi rispettivamente a x = -2 e x = +2. Tuttavia, in un problema multiobiettivo, x = -2, x = 2 e qualsiasi soluzione nell'intervallo -2 <= x <= 2 sono ugualmente ottimali. Non esiste una soluzione univoca a questo problema multiobiettivo. L'obiettivo dell'algoritmo genetico multiobiettivo è trovare un insieme di soluzioni in tale intervallo (idealmente con una buona distribuzione). L'insieme delle soluzioni è anche noto come fronte di Pareto. Tutte le soluzioni sul fronte di Pareto sono ottimali.

Codifica della funzione di fitness

Creiamo un file MATLAB ® denominato simple_multiobjective.m:

   function y = simple_multiobjective(x)
   y(1) = (x+2)^2 - 10;
   y(2) = (x-2)^2 + 20;

Il risolutore dell'algoritmo genetico presuppone che la funzione di fitness accetti un input x, dove x è un vettore riga con tanti elementi quante sono le variabili nel problema. La funzione di fitness calcola il valore di ciascuna funzione obiettivo e restituisce questi valori in un singolo output vettoriale y .

Ridurre al minimo utilizzando gamultiobj

Per utilizzare la funzione gamultiobj, dobbiamo 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 gamultiobj sono X, i punti sul fronte di Pareto, e FVAL, i valori della funzione obiettivo ai valori X. Un terzo argomento di output, exitFlag, indica il motivo per cui gamultiobj si è interrotto. Un quarto argomento, OUTPUT, contiene informazioni sulle prestazioni del risolutore. gamultiobj può anche restituire un quinto argomento, POPULATION, che contiene la popolazione al momento della terminazione di gamultiobj e un sesto argomento, SCORE, che contiene i valori delle funzioni di tutti gli obiettivi per POPULATION al momento della terminazione di gamultiobj.

FitnessFunction = @simple_multiobjective;
numberOfVariables = 1;
[x,fval] = gamultiobj(FitnessFunction,numberOfVariables);
gamultiobj stopped because it exceeded options.MaxGenerations.

La matrice X restituita dal risolutore è una matrice in cui ogni riga è il punto sul fronte di Pareto per le funzioni obiettivo. FVAL è una matrice in cui ogni riga contiene il valore delle funzioni obiettivo valutate nel punto corrispondente in X.

size(x)
size(fval)
ans =

    18     1


ans =

    18     2

Problema di ottimizzazione multiobiettivo vincolato

gamultiobj può gestire problemi di ottimizzazione con disuguaglianza lineare, uguaglianza e vincoli di limite semplici. Qui vogliamo aggiungere vincoli vincolati a un semplice problema multiobiettivo risolto in precedenza.

   min F(x) = [objective1(x); objective2(x)]
    x
   subject to  -1.5 <= x <= 0 (bound constraints)
   where, objective1(x) = (x+2)^2 - 10, and
          objective2(x) = (x-2)^2 + 20

gamultiobj accetta vincoli di disuguaglianza lineare nella forma A*x <= b e vincoli di uguaglianza lineare nella forma Aeq*x = beq e vincoli vincolati nella forma lb <= x <= ub. Passiamo A e Aeq come matrici e b, beq, lb e ub come vettori. Poiché in questo esempio non abbiamo vincoli lineari, passiamo [] per quegli input.

A = []; b = [];
Aeq = []; beq = [];
lb = -1.5;
ub = 0;
x = gamultiobj(FitnessFunction,numberOfVariables,A,b,Aeq,beq,lb,ub);
gamultiobj stopped because it exceeded options.MaxGenerations.

Tutte le soluzioni in X (ogni riga) soddisferanno tutti i vincoli lineari e vincolati entro la tolleranza specificata in options.ConstraintTolerance. Tuttavia, se si utilizza una propria funzione di crossover o di mutation, assicurarsi che i nuovi individui siano fattibili rispetto ai vincoli lineari e semplici.

Aggiunta di visualizzazione

gamultiobj può accettare una o più funzioni di tracciamento tramite l'argomento options. Questa funzionalità è utile per visualizzare le prestazioni del risolutore in fase di esecuzione. Le funzioni del grafico possono essere selezionate utilizzando optimoptions .

Qui utilizziamo optimoptions per selezionare due funzioni di grafico. La prima funzione del grafico è gaplotpareto, che traccia il fronte di Pareto (limitato a tre obiettivi qualsiasi) a ogni generazione. La seconda funzione del grafico è gaplotscorediversity, che traccia la diversità dei punteggi per ciascun obiettivo. Le opzioni vengono passate come ultimo argomento al risolutore.

options = optimoptions(@gamultiobj,'PlotFcn',{@gaplotpareto,@gaplotscorediversity});
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because it exceeded options.MaxGenerations.

Vettorizzazione della funzione fitness

Consideriamo nuovamente le precedenti funzioni di fitness:

   objective1(x) = (x+2)^2 - 10, and
   objective2(x) = (x-2)^2 + 20

Per impostazione predefinita, il risolutore gamultiobj passa alla funzione di fitness solo un punto alla volta. Tuttavia, se la funzione di fitness viene vettorializzata per accettare un insieme di punti e restituisce un insieme di valori di funzione, è possibile accelerare la soluzione.

Ad esempio, se il risolutore deve valutare cinque punti in una chiamata a questa funzione di fitness, chiamerà la funzione con una matrice di dimensione 5 per 1, ovvero 5 righe e 1 colonna (ricorda che 1 è il numero di variabili).

Crea un file MATLAB denominato vectorized_multiobjective.m:

   function scores = vectorized_multiobjective(pop)
     popSize = size(pop,1); % Population size
     numObj = 2;  % Number of objectives
     % initialize scores
     scores = zeros(popSize, numObj);
     % Compute first objective
     scores(:,1) = (pop + 2).^2 - 10;
     % Compute second objective
     scores(:,2) = (pop - 2).^2 + 20;

Questa versione vettorializzata della funzione di fitness prende una matrice pop con un numero arbitrario di punti, le righe di pop e restituisce una matrice di dimensione populationSize per numberOfObjectives.

Dobbiamo specificare che la funzione di fitness viene vettorializzata utilizzando le opzioni create tramite optimoptions . Le opzioni vengono passate come nono argomento.

FitnessFunction = @(x) vectorized_multiobjective(x);
options = optimoptions(@gamultiobj,'UseVectorized',true);
gamultiobj(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub,options);
gamultiobj stopped because the average change in the spread of Pareto solutions is less than options.FunctionTolerance.

Vedi anche

Argomenti