このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
パーティクルスウォームを使用した最適化
この例では、particleswarm
ソルバーを使用して最適化する方法を示します。
この例の目的関数は De Jong の 5 番目の関数であり、この例を実行すると使用できます。
dejong5fcn
この関数には 25 個の局所最小値があります。
デフォルトの 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
解x
は全体最適解でしょうか?現時点では不明です。関数のプロットを見ると、関数は [-50,50]
の範囲内の成分に対して局所的最小値を持つことがわかります。したがって、変数の範囲を [-50,50]
に制限すると、ソルバーがグローバル最小値を見つけるのに役立ちます。
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
これは有望に思えます。新しいソリューションは、以前のソリューションよりも fval
が低くなっています。しかし、x
は本当にグローバルなソリューションなのでしょうか?領域をより適切に検索するには、より多くの粒子を使用して再度最小化を試みてください。
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
これはさらに有望に思えます。しかし、この答えは世界的な解決策なのでしょうか、そしてそれはどの程度正確なのでしょうか?ハイブリッド関数を使用してソルバーを再実行します。particleswarm
は、particleswarm
が反復を終了した後にハイブリッド関数を呼び出します。
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
は基本的に以前と同じ解決策を見つけました。これにより、particleswarm
が局所最小値を報告し、最終的な x
がグローバル ソリューションであるという確信が得られます。