Main Content

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

カスタムプロット関数

カスタムプロット関数について

ソフトウェアに含まれているもの以外の patternsearch プロット関数を使用するには、パターン検索の各反復で呼び出されてプロットを作成する独自のカスタム プロット関数を記述できます。この例では、前回の反復から現在の反復までの最適な目的関数値の対数変化を表示するプロット関数を作成する方法を示します。プロット関数の詳細については、プロット オプション を参照してください。

カスタムプロット関数の作成

この例のプロット関数を作成するには、次のコードをコピーして、MATLAB® エディターの新しい関数ファイルに貼り付けます。

function stop = psplotchange(optimvalues, flag)
% PSPLOTCHANGE Plots the change in the best objective function 
% value from the previous iteration.
  
% Best objective function value in the previous iteration
persistent last_best
 
stop = false;
if(strcmp(flag,'init')) 
        set(gca,'Yscale','log'); %Set up the plot
        hold on;
        xlabel('Iteration'); 
        ylabel('Log Change in Values');
        title(['Change in Best Function Value']);
end
 
% Best objective function value in the current iteration
best = min(optimvalues.fval);  
 
 % Set last_best to best
if optimvalues.iteration == 0
last_best = best;
        
else
        %Change in objective function value
			 change = last_best - best; 
        plot(optimvalues.iteration, change, '.r');
end

MATLAB パス上のフォルダーにファイル名を psplotchange.m としてファイルを保存します。コードはプロット機能の仕組みで説明されています。

問題の設定

問題はpatternsearch と Optimize を使用した制約付き最小化ライブ エディター タスクと同じです。問題を設定するには:

  1. MATLAB コマンド ラインで次のコマンドを入力します。

    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. これは線形制約の問題なので、PollMethod オプションを 'GSSPositiveBasis2N' に設定します。オプションに、組み込みプロット関数 @psplotbestf とカスタム プロット関数 @psplotchange の両方を含めます。

    options = optimoptions('patternsearch',...
        'PlotFcn',{@psplotbestf,@psplotchange},...
        'PollMethod','GSSPositiveBasis2N');

カスタムプロット関数を使用して最適化を実行する

x0 から始めて patternsearch を呼び出して例を実行します。

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

下のカスタム プロットの y 軸のスケールは対数であるため、プロットには 0 より大きい変化のみが表示されます。

プロット機能の仕組み

プロット関数は、次の構造体に含まれる情報を使用します。

  • optimvalues — ソルバーの現在の状態、構造体

  • flag — アルゴリズムの現在の状態、文字ベクトル

カスタム プロット関数 psplotchange.m の最も重要なステートメントを次の表にまとめます。

カスタムプロット関数ステートメント

ステートメント説明
persistent last_best

前の世代における最良の目的関数値である永続変数 last_best を作成します。永続変数は、プロット関数の複数回の呼び出しにわたって保持されます。

set(gca,'Yscale','log')

アルゴリズムが開始する前にプロットを設定します。

best = min(optimvalues.fval)

best を最小目的関数値に設定します。フィールド optimvalues.fval には、現在の反復における目的関数の値が含まれます。変数 best は目的関数の最小値です。構造体 optimvalues のフィールドの詳細な説明については、 プロット関数の構造 を参照してください。

change = last_best - best

変数 change を、前回の反復での最適な目的関数値から現在の反復での最適な目的関数値を引いた値に設定します。

plot(optimvalues.iteration, change, '.r')

optimvalues.iteration に含まれる現在の反復に対して、現在の目的関数値で変数 change をプロットします。

関連するトピック