メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

パーティクルスウォームを使った最適化

この例では、particleswarm ソルバーを使用して最適化する方法を示します。

この例の目的関数は De Jong の 5 番目の関数であり、この例を実行するときに使用できます。

dejong5fcn

Figure contains an axes object. The axes object contains 2 objects of type surface, contour.

この関数には 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 が大域解であるという確信が得られます。

参考

トピック