Main Content

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

キャッシュを使用する

通常、パターン検索の任意の反復において、一部のメッシュ ポイントは以前の反復でのメッシュ ポイントと一致する可能性があります。デフォルトでは、パターン検索は、すでにこれらのメッシュ ポイントの値が計算され、最適ではないことが判明している場合でも、これらのメッシュ ポイントで目的関数を再計算します。目的関数の計算に時間がかかる場合、パターン検索の実行時間が大幅に長くなる可能性があります。

キャッシュを使用することで、つまり、パターン検索がすでに訪れたポイントの履歴を保存することで、これらの冗長な計算を排除できます。これを行うには、Cache オプションで CacheOn に設定します。各ポーリングで、パターン検索は、現在のメッシュ ポイントがキャッシュ内のポイントの指定された許容値 Tolerance 内にあるかどうかを確認します。そうであれば、検索はそのポイントの目的関数を計算せず、キャッシュされた関数値を使用して次のポイントに進みます。

メモ

CacheOn に設定されている場合、パターン検索では、キャッシュ内のポイントの指定された許容値内にあるため、目的関数を改善する現在のメッシュ内のポイントを識別できない可能性があります。その結果、CacheOn に設定した場合の方が、CacheOff に設定した場合よりもパターン検索の反復回数が多くなる可能性があります。一般に、特に高度に非線形な目的関数の場合は、Tolerance の値を非常に小さく保つことをお勧めします。

メモ

Cache は、ソルバーを並列で実行すると機能しません。

たとえば、patternsearch と Optimize を使用した制約付き最小化ライブ エディター タスク で説明されている問題を次のように設定します。

  1. コマンドラインに次のように入力します。

    x0 = [2 1 0 9 1 0]';
    Aineq = [-8 7 3 -4 9 0];
    bineq = 7;
    Aeq = [7 1 8 3 3 3; 5 0 -5 1 -5 8; -2 -6 7 1 1 9; 1 -1 2 -2 3 -3];
    beq = [84 62 65 1];
    H = [36 17 19 12  8 15; 
         17 33 18 11  7 14; 
         19 18 43 13  8 16;
         12 11 13 18  6 11; 
          8  7  8  6  9  8; 
         15 14 16 11  8 29];
    
    f = [ 20 15 21 18 29 24 ]';
     
    F = @(x)0.5*x'*H*x + f'*x;
  2. 最適な関数値と関数評価をプロットするためのオプションを作成します。この問題には線形制約があるため、'GSSPositiveBasis2N' ポーリング メソッドを使用します。ディスプレイをオフにする。

    opts = optimoptions('patternsearch','PollMethod','GSSPositiveBasis2N',...
        'PlotFcn',{@psplotbestf,@psplotfuncount},'Display','none');
  3. 最適化を実行します。

    [x,fval,exitflag,output] = patternsearch(F,x0,...
        Aineq,bineq,Aeq,beq,[],[],[],opts);

パターン検索が終了すると、次の図に示すようにプロットが表示されます。

関数の総数は 758 であることに注意してください。

ここで、Cache オプションを 'On' に設定して、例を再度実行します。

opts.Cache = 'on';
[x2,fval2,exitflag2,output2] = patternsearch(F,x0,...
    Aineq,bineq,Aeq,beq,[],[],[],opts);

関数の総数は 734 に減少します。

[output.funccount,output2.funccount]
ans =

   758   734

参考

関連するトピック