Contenuto principale

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

Ottimizzazione tramite Particle Swarm

Questo esempio mostra come ottimizzare utilizzando il risolutore particleswarm.

La funzione obiettivo in questo esempio è la quinta funzione di De Jong, disponibile quando si esegue questo esempio.

dejong5fcn

Questa funzione ha 25 minimi locali.

Provare a trovare il minimo della funzione utilizzando le impostazioni predefinite particleswarm.

fun = @dejong5fcn;
nvars = 2;
rng default % For reproducibility
[x,fval,exitflag] = particleswarm(fun,nvars)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -31.9521  -16.0176

fval = 5.9288
exitflag = 1

La soluzione x è l'ottima globale? Al momento non è chiaro. Osservando il grafico della funzione si nota che la funzione presenta minimi locali per le componenti nell'intervallo [-50,50]. Quindi, limitando l'intervallo delle variabili a [-50,50], si aiuta il risolutore a individuare un minimo globale.

lb = [-50;-50];
ub = -lb;
[x,fval,exitflag] = particleswarm(fun,nvars,lb,ub)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -16.0079  -31.9697

fval = 1.9920
exitflag = 1

Sembra promettente: la nuova soluzione ha un fval inferiore rispetto alla precedente. Ma x è davvero una soluzione globale? Prova a ridurre nuovamente a icona con più particelle, per cercare meglio nella regione.

options = optimoptions('particleswarm','SwarmSize',100);
[x,fval,exitflag] = particleswarm(fun,nvars,lb,ub,options)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -31.9781  -31.9784

fval = 0.9980
exitflag = 1

Questa sembra ancora più promettente. Ma questa risposta è una soluzione globale e quanto è precisa? Rieseguire il risolutore con una funzione ibrida. particleswarm richiama la funzione ibrida dopo che particleswarm ha terminato le sue iterazioni.

options.HybridFcn = @fmincon;
[x,fval,exitflag] = particleswarm(fun,nvars,lb,ub,options)
Optimization ended: relative change in the objective value 
over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
x = 1×2

  -31.9783  -31.9784

fval = 0.9980
exitflag = 1

particleswarm ha trovato sostanzialmente la stessa soluzione di prima. Questo ti dà una certa sicurezza che particleswarm riporti un minimo locale e che il valore finale x sia la soluzione globale.

Vedi anche

Argomenti