このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
GlobalSearch と MultiStart のプロット関数
プロット関数とは何ですか?
options
の PlotFcn
フィールドは、最適化関数が各反復で呼び出す 1 つ以上の関数を指定します。プロット関数は、アルゴリズムの実行中にさまざまな進行状況の測定値をプロットします。関数ハンドル、または関数ハンドルの cell 配列を渡します。プロット関数の構造は、出力関数の構造と同じです。この構造については、出力関数を参照してください。
プロット関数は特殊な出力関数です (GlobalSearch および MultiStart の出力関数 を参照)。定義済みのプロット関数が 2 つあります。
@gsplotbestf
は最適な目的関数値をプロットします。@gsplotfunccount
は関数評価の回数をプロットします。
プロット機能ウィンドウには、Pause ボタンと Stop ボタンがあります。デフォルトでは、すべてのプロットが 1 つのウィンドウに表示されます。
グローバル プロット関数を使用するには:
出力関数 で説明されている構文を使用してプロット関数を記述します。
GlobalSearch
またはMultiStart
オブジェクトのPlotFcn
プロパティをプロット関数の関数ハンドルに設定します。PlotFcn
プロパティを関数ハンドルのセル配列に設定することで、複数のプロット関数を使用できます。
組み込みプロット関数の詳細
組み込みのプロット関数には、驚くような特性があります。
@gsplotbestf
は厳密に減少しないプロットを持つことができます。これは、負の終了フラグ (実行不可能なソリューションなど) を使用したローカル ソルバーの実行によって初期値が生成される可能性があるためです。関数値が高くても、正の終了フラグを持つ後続のローカル ソリューションの方が優れています。ローカル ソルバーが正の終了フラグを持つ値を返すと、プロットは単調減少になります。@gsplotfunccount
は関数評価の合計数をプロットしない可能性があります。これは、GlobalSearch
が最後にプロット関数を呼び出した後も関数評価を継続できるためです。詳細については、グローバルサーチアルゴリズムを参照してください。
MultiStart
プロット関数
この例では、MultiStart
のより良い局所最小値を得るために必要なローカル ソルバーの実行回数をプロットします。この例では、組み込みのプロット関数を使用して、現在の最適な関数値も表示します。
例題は 全体的または複数の局所的最小値を見つける と同じですが、境界が追加されています。
この例では、永続変数を使用して以前の最適値を保存します。プロット関数は、各ローカル ソルバーの実行後、optimValues
構造体の bestfval
フィールドで使用可能な最適な関数値を調べます。値が前回の最高値より低くない場合、プロット関数は改善が見られなかった連続呼び出しの数に 1 を加算し、棒グラフを描画します。値が以前の最高値よりも低い場合、プロット関数はチャートに値 1 の新しいバーを開始します。プロットする前に、プロット関数は連続呼び出し回数の対数を取ります。一部の値は他の値よりもはるかに大きくなる可能性があるため、対数を使用するとプロットが読みやすくなります。
永続変数の代わりにネストされた関数を使用してローカル結果を保存するには、入れ子構造の出力関数の例 を参照してください。
プロット関数の例
この例では、この例の最後にリストされている sawtoothxy
ヘルパー関数を最小化します。一般的に、目的関数は MATLAB® パス上のファイルに保存します。
この例には、NumberToNextBest
カスタム プロット関数が添付されています。一般的に、プロット関数は MATLAB パス上のファイルに保存します。ここにリストがあります。
type NumberToNextBest
function stop = NumberToNextBest(optimValues, state) persistent bestfv bestcounter stop = false; switch state case 'init' % Initialize variable to record best function value. bestfv = []; % Initialize counter to record number of % local solver runs to find next best minimum. bestcounter = 1; % Create the histogram. bar(log(bestcounter),'tag','NumberToNextBest'); xlabel('Number of New Best Fval Found'); ylabel('Log Number of Local Solver Runs'); title('Number of Local Solver Runs to Find Lower Minimum') case 'iter' % Find the axes containing the histogram. NumToNext = ... findobj(get(gca,'Children'),'Tag','NumberToNextBest'); % Update the counter that records number of local % solver runs to find next best minimum. if ~isequal(optimValues.bestfval, bestfv) bestfv = optimValues.bestfval; bestcounter = [bestcounter 1]; else bestcounter(end) = bestcounter(end) + 1; end % Update the histogram. set(NumToNext,'Ydata',log(bestcounter)) end
問題構造とグローバル ソルバー オブジェクトを作成します。[-3e3,-4e3]
の下限、[4e3,3e3]
の上限を設定し、NumberToNextBest
カスタム プロット関数と gsplotbestf
組み込みプロット関数を使用するようにグローバル ソルバーを設定します。
problem = createOptimProblem('fmincon',... 'objective',@(x)sawtoothxy(x(1),x(2)),... 'x0',[100,-50],'lb',[-3e3 -4e3],... 'ub',[4e3,3e3],'options',... optimoptions(@fmincon,'Algorithm','sqp')); ms = MultiStart('PlotFcn',{@NumberToNextBest,@gsplotbestf});
グローバル ソルバーを 100 回実行してローカル ソルバーを実行します。
rng(2); % For reproducibility
[x,fv] = run(ms,problem,100);
MultiStart completed some of the runs from the start points. 32 out of 100 local solver runs converged with a positive local solver exitflag.
補助関数
次のコードは、補助関数 sawtoothxy
を作成します。
function f = sawtoothxy(x,y) [t,r] = cart2pol(x,y); % change to polar coordinates h = cos(2*t - 1/2)/2 + cos(t) + 2; g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ... .*r.^2./(r+1); f = g.*h; end
並列プロット機能なし
MultiStart
は並列実行できますが、グローバル出力関数とプロット関数の並列実行はサポートされていません。さらに、MultiStart
が並列実行される場合、ローカル出力関数とプロット関数はワーカー上で実行されますが、その効果は直列実行の場合とは異なります。ローカル出力およびプロット関数は、ワーカー上で実行されている場合、表示を作成しません。ワーカーが結果をクライアント (MultiStart
並列ジョブの発信元) に渡すまで、出力関数とプロット関数の他の効果は表示されません。
MultiStart
を並列で実行する方法の詳細については、 並列計算 を参照してください。