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.