メインコンテンツ

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

パーティクルスウォームオプション

particleswarmのオプションの指定

次のように optimoptions 関数を使用して options を作成します。

options = optimoptions('particleswarm',...
    'Param1',value1,'Param2',value2,...);

例については、パーティクルスウォームを使った最適化を参照してください。

このセクションの各オプションは、options 内のフィールド名でリストされます。たとえば、Displayoptions の対応するフィールドを参照します。

スウォーム作成

デフォルトでは、particleswarm'pswcreationuniform' の群れ作成関数を呼び出します。この機能は次のように動作します。

  1. InitialSwarmMatrix オプションが存在する場合、'pswcreationuniform'InitialSwarmMatrix 行列の最初の SwarmSize 行を群れとして取ります。InitialSwarmMatrix 行列の行数が SwarmSize より小さい場合、'pswcreationuniform' は次のステップに進みます。

  2. 'pswcreationuniform' は、合計で SwarmSize 個になるよう十分なパーティクルを作成します。'pswcreationuniform' は、ランダムかつ均一に分散されたパーティクルを作成します。あらゆる群れのコンポーネントの範囲は-InitialSwarmSpan/2,InitialSwarmSpan/2 であり、境界と一致するように必要に応じてシフトおよびスケーリングされます。

作成後、particleswarm はすべてのパーティクルが境界を満たしているかどうかを確認し、必要に応じてコンポーネントを切り捨てます。Display オプションが 'iter' であり、パーティクルの切り捨てが必要な場合は、particleswarm が通知します。

カスタム作成機能

optimoptions を使用してカスタム作成関数を設定し、CreationFcn オプションを @customcreation に設定します。ここで、customcreation は作成関数ファイルの名前です。カスタム作成関数の構文は次のようになります。

swarm = customcreation(problem)

作成関数は、サイズが SwarmSizenvars 列の行列を返す必要があります。ここで、各行は 1 つのパーティクルの位置を表します。問題の構造の詳細については、problem を参照してください。特に、problem.options.SwarmSize からは SwarmSize を、problem.nvars からは nvars を取得できます。

作成関数の例については、pswcreationuniform のコードをご覧ください。

edit pswcreationuniform

表示設定

Display オプションは、アルゴリズムの実行中にコマンド ラインに表示される情報の量を指定します。

  • 'off' または 'none' — 出力は表示されません。

  • 'iter' — 反復ごとに情報が表示されます。

  • 'final' (デフォルト) — 停止の理由が表示されます。

iter は、以下を表示します。

  • Iteration — 反復回数

  • f-count — 目的関数評価の累積回数

  • Best f(x) — 最適な目的関数値

  • Mean f(x) — 全粒子の平均目的関数値

  • Stall IterationsBest f(x) の最後の変更以降の反復回数

DisplayInterval オプションは、反復表示が更新される前に実行される反復回数を設定します。正の整数を指定してください。

アルゴリズムの設定

particleswarm アルゴリズムの詳細は 粒子群最適化アルゴリズム に記載されています。このセクションでは、チューニングパラメーターについて説明します。

粒子群アルゴリズムの主なステップは、群集の新しい速度を世代ことです。

長さnvarsu1u2の一様(0,1)分布乱数ベクトルに対して、速度を更新する。

v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x).

変数 W = inertiay1 = SelfAdjustmentWeight、および y2 = SocialAdjustmentWeight

この更新では、次の加重合計を使用します。

  • 前回の速度v

  • x-p、現在の位置xと粒子が見た最良の位置pとの差

  • x-g、現在の位置 x と現在の近隣における最適な位置 g との差

この式に基づくと、オプションは次の効果をもたらします。

  • 慣性の絶対値 W が大きいほど、新しい速度は古い速度とより一致するようになり、絶対値も大きくなります。W の絶対値が大きいと、群れが不安定になる可能性があります。W の値は、2 要素ベクトル InertiaRange の範囲内に留まります。

  • y1 = SelfAdjustmentWeight の値が大きいほど、粒子はこれまで訪れた中で最も良い場所へと向かいます。

  • y2 = SocialAdjustmentWeight の値が大きいほど、粒子は現在の近傍の最適な場所に向かって進みます。

慣性、SelfAdjustmentWeight、または SocialAdjustmentWeight の値が大きいと、群れが不安定になる可能性があります。

MinNeighborsFraction オプションは、各パーティクルの初期近傍サイズと最小近傍サイズの両方を設定します。粒子群最適化アルゴリズム を参照してください。MinNeighborsFraction1 に設定すると、群れのすべてのメンバーが大域的最小点を社会調整目標として使用します。

これらのチューニング オプションのいくつかを設定する例については、パーティクルスウォームを使った最適化 を参照してください。

ハイブリッド関数

ハイブリッド関数は、粒子群アルゴリズムが終了した後に実行される別の最小化関数です。HybridFcn オプションでハイブリッド関数を指定できます。選択肢は

  • [] —ハイブリッド関数はありません。

  • 'fminsearch' — 制約のない最小化を実行するには、MATLAB® 関数 fminsearch を使用します。

  • 'patternsearch' —パターン探索を使用して、制約付きまたは制約なしの最小化を実行します。

  • 'fminunc' — 制約のない最小化を実行するには、Optimization Toolbox™ 関数 fminunc を使用します。

  • 'fmincon' — 制約付き最小化を実行するには、Optimization Toolbox 関数 fmincon を使用します。

メモ

ハイブリッド関数が問題の制約を受け入れることを確認します。そうでない場合、particleswarm はエラーをスローします。

ハイブリッド関数には個別のオプションを設定できます。fminsearch の場合は optimset を使用し、fminconpatternsearchfminunc の場合は optimoptions を使用します。以下に例を示します。

hybridopts = optimoptions('fminunc',...
    'Display','iter','Algorithm','quasi-newton');
次のようにハイブリッド オプションを particleswarm options に含めます。
options = optimoptions(options,'HybridFcn',{@fminunc,hybridopts}); 
options を設定する前に hybridopts が存在している必要があります。

ハイブリッド関数を使用する例については、パーティクルスウォームを使った最適化 を参照してください。ハイブリッド関数を使用する場合を参照してください。

出力関数とプロット関数

出力関数は、particleswarm が各反復で呼び出す関数です。出力関数は particleswarm を停止したり、他のタスクを実行したりできます。出力関数を指定するには、

options = optimoptions(@particleswarm,'OutputFcn',@outfun)

ここで、outfun出力関数またはプロット関数の構造 で指定された構文を持つ関数です。出力関数が複数ある場合は、関数ハンドルのセル配列として渡します。

options = optimoptions(@particleswarm,...
    'OutputFcn',{@outfun1,@outfun2,@outfun3})

同様に、プロット関数は particleswarm が各反復で呼び出す関数です。出力関数とプロット関数の違いは、プロット関数には、プロット ウィンドウに表示される particleswarm を一時停止または停止するボタンなど、プロット拡張機能が組み込まれていることです。唯一の組み込みプロット関数 'pswplotbestf' は、反復に対して最適な目的関数の値をプロットします。指定するには、

options = optimoptions(@particleswarm,'PlotFcn','pswplotbestf')

カスタム プロット関数を作成するには、出力関数またはプロット関数の構造 で指定された構文を使用して関数を記述します。カスタム プロット関数を指定するには、関数ハンドルを使用します。複数のプロット関数がある場合は、関数ハンドルのセル配列として渡します。

options = optimoptions(@particleswarm,...
    'PlotFcn',{@plotfun1,@plotfun2,@plotfun3})

カスタム出力関数の例については、粒子群出力関数 を参照してください。

出力関数またはプロット関数の構造

出力関数の呼び出し構文は次のとおりです。

stop = myfun(optimValues,state)

関数が stoptrue に設定すると、反復は終了します。particleswarm の計算を続行するには、stopfalse に設定します。

この関数には次の入力引数があります。

  • optimValues — 現在の反復における群れに関する情報を含む構造体。詳細はoptimValues構造に記載されています。

  • state — 現在の反復の状態を示す文字列。

    • 'init' — ソルバーは反復処理を開始していません。出力関数またはプロット関数は、この状態を使用してファイルを開いたり、後続の反復のためのデータ構造やプロットを設定したりできます。

    • 'iter' — ソルバーは反復処理を続行しています。通常、ここで出力関数またはプロット関数が機能します。

    • 'done' — ソルバーが停止基準に達しました。出力関数またはプロット関数は、この状態を使用して、開いたファイルを閉じるなどのクリーンアップを行うことができます。

追加パラメーターの受け渡し は、出力関数またはプロット関数に追加のパラメーターを提供する方法について説明します。

メモ

プロット関数のフレームワークで座標軸が管理されるため、プロット関数は subplot ステートメントをサポートしていません。複数のサブプロットを指定するには、個別のプロット関数を記述し、cell 配列としてソルバーに渡します。

options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});

出力関数は subplot をサポートするため、プロット関数ではなく出力関数を使用すると、1 つの関数に複数のプロットを含めることができます。

optimValues構造

particleswarmoptimValues 構造を出力関数またはプロット関数に渡します。optimValues 構造には次のフィールドがあります。

フィールドコンテンツ
funccount目的関数評価の合計数。
bestx最適な目的関数値 bestfval に対応する最適な解ポイントが見つかりました。
bestfval見つかった最良(最低)の目的関数値。
iteration反復回数。
meanfval現在の反復におけるすべての粒子間の平均目的関数。
stalliterationsbestfval の最後の変更以降の反復回数。
swarm粒子の位置を含む行列。各行には 1 つの粒子の位置が含まれており、行数は群れのサイズに等しくなります。
swarmfvals群れの中の粒子の目的関数の値を含むベクトル。粒子 iswarmfvals(i) = fun(swarm(i,:)) の場合、fun は目的関数です。

並列またはベクトル化された関数評価

速度を上げるには、particleswarm が群れの目的関数を 並列 または ベクトル化 方式で評価するようにオプションを設定できます。これらのオプションのうち 1 つだけを使用できます。UseParalleltrue に、UseVectorizedtrue に設定すると、計算は並列ではなくベクトル化されて実行されます。

平行粒子群

Parallel Computing Toolbox™ ライセンスをお持ちの場合は、目的関数の評価をプロセッサまたはコア間で群集に分散できます。UseParallel オプションを true に設定します。

目的関数の計算コストが高い場合、または粒子とプロセッサの数が多い場合は、並列計算の方がシリアル計算よりも高速になる可能性があります。そうしないと、通信オーバーヘッドにより並列計算が直列計算より遅くなる可能性があります。

詳細は、並列計算を参照してください。

ベクトル化された粒子群

目的関数が一度にすべての粒子を評価できる場合は、通常、UseVectorized オプションを true に設定することで時間を節約できます。目的関数は、各行が 1 つの粒子を表す MN 列の行列を受け入れ、目的関数値の M1 列のベクトルを返す必要があります。このオプションは、patternsearch オプションおよび ga UseVectorized オプションと同じように機能します。patternsearch の詳細については、目的関数と制約関数をベクトル化する を参照してください。

停止条件

particleswarm は、次のいずれかが発生すると反復を停止します。

停止オプション停止テスト終了フラグ
MaxStallIterations および FunctionTolerance過去 MaxStallIterations 回の反復における最良の目的関数値 g の相対的な変化は FunctionTolerance より小さいです。1
MaxIterations反復回数が MaxIterations に達しました。0
OutputFcn または PlotFcnOutputFcn または PlotFcn は反復を停止できます。-1
ObjectiveLimit実行可能なポイントの最適な目的関数値 gObjectiveLimit より小さいです。-3
MaxStallTime最良目的関数値 g は、過去 MaxStallTime 秒間変化しませんでした。-4
MaxTime関数の実行時間が MaxTime 秒を超えています。-5

また、FunValCheck オプションを 'on' に設定し、群れの中に NaNInf、または複雑な目的関数値を持つ粒子がある場合、particleswarm は停止し、エラーを発行します。