Main Content

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

GlobalSearch と MultiStart のプロット関数

プロット関数とは何ですか?

optionsPlotFcn フィールドは、最適化関数が各反復で呼び出す 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 を並列で実行する方法の詳細については、 並列計算 を参照してください。

関連するトピック