ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

出力関数

出力関数とは

反復ごとに、最適化アルゴリズムの出力を得たい場合を考えてみましょう。たとえば、アルゴリズムが計算する一連の点を探し、プロットしたい場合があります。これを行うには、最適化関数が各反復で呼び出す出力関数を作成します。詳細と構文については 出力関数の構文 を参照してください。

この節では、出力関数に対するソルバーベースのアプローチを示します。問題ベースのアプローチについては、問題ベースの最適化の出力関数を参照してください。

一般に出力関数を使用できるソルバーは、入力に非線形関数を指定できるソルバーです。関数リファレンス ページのオプションの節を参照すると、どのソルバーが出力関数をもつことができるのかがわかります。あるいはソルバーに対し、最適化アプリで [出力関数] オプションが利用できるかどうかを確認することによってもわかります。

例: 出力関数の使用

例の内容

この例は 非線形不等式制約 の例を用い、コマンド ラインで関数 fmincon を呼び出して非線形制約付き最適化問題を解きます。この節の例では、関数ファイルを使用して fmincon を呼び出します。このファイルは例に必要な以下のすべての関数を含みます。

  • 目的関数

  • 制約関数

  • fmincon のアルゴリズムが計算した点の履歴を記録する出力関数。出力関数は fmincon のアルゴリズムの各反復で以下を行います。

    • アルゴリズムが計算する現在の点をプロットします。

    • 点とそれに対応する目的関数値を history と呼ばれる変数に保存し、現在の探索方向を searchdir と呼ばれる変数に保存します。探索方向は現在の点から次の点までの方向ベクトルです。

このファイルのコードを以下に示します。 サンプル関数ファイルの記述.

出力関数の記述

options で出力関数を次のように指定します。

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

ここで outfun は出力関数の名前です。入力に options を使用して最適化を呼び出すと、最適化関数はアルゴリズムの各反復で outfun を呼び出します。

一般に outfun には任意の MATLAB® 関数を使用できますが、この例ではサンプル関数ファイルの記述で説明する関数ファイルの入れ子関数を使用します。次のコードは出力関数を定義します。

function stop = outfun(x,optimValues,state)
stop = false;
 
   switch state
       case 'init'
           hold on
       case 'iter'
           % Concatenate current point and objective function
           % value with history. x must be a row vector.
           history.fval = [history.fval; optimValues.fval];
           history.x = [history.x; x];
           % Concatenate current search direction with 
           % searchdir.
           searchdir = [searchdir;...
                        optimValues.searchdirection'];
           plot(x(1),x(2),'o');
           % Label points with iteration number.
           % Add .15 to x(1) to separate label from plotted 'o'
           text(x(1)+.15,x(2),num2str(optimValues.iteration));
       case 'done'
           hold off
       otherwise
   end
end

入れ子関数の詳細は、ハンドルを使用した関数パラメーターの格納 (MATLAB)を参照してください。

最適化関数は次の引数を outfun に渡します。

  • x — 現在の反復でアルゴリズムにより計算される点

  • optimValues — 現在の反復からのデータを含む構造体

    この例は optimValues の次のフィールドを使用します。

    • optimValues.iteration — 現在の反復数

    • optimValues.fval — 現在の目的関数値

    • optimValues.searchdirection — 現在の探求方向

  • state — アルゴリズムの現在の状態 ('init''interrupt''iter''done')

これらの引数の詳細は 出力関数の構文 を参照してください。

サンプル関数ファイルの記述

以下のようにして、この例の関数ファイルを作成します。

  1. 新しい関数ファイルを MATLAB のエディターで開きます。

  2. このファイルに次のコードをコピーし、貼り付けます。

    function [history,searchdir] = runfmincon
     
    % Set up shared variables with OUTFUN
    history.x = [];
    history.fval = [];
    searchdir = [];
     
    % call optimization
    x0 = [-1 1];
    options = optimoptions(@fmincon,'OutputFcn',@outfun,... 
        'Display','iter','Algorithm','active-set');
    xsol = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
     
     function stop = outfun(x,optimValues,state)
         stop = false;
     
         switch state
             case 'init'
                 hold on
             case 'iter'
             % Concatenate current point and objective function
             % value with history. x must be a row vector.
               history.fval = [history.fval; optimValues.fval];
               history.x = [history.x; x];
             % Concatenate current search direction with 
             % searchdir.
               searchdir = [searchdir;... 
                            optimValues.searchdirection'];
               plot(x(1),x(2),'o');
             % Label points with iteration number and add title.
             % Add .15 to x(1) to separate label from plotted 'o'
               text(x(1)+.15,x(2),... 
                    num2str(optimValues.iteration));
               title('Sequence of Points Computed by fmincon');
             case 'done'
                 hold off
             otherwise
         end
     end
     
     function f = objfun(x)
         f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) +... 
                        2*x(2) + 1);
     end
     
     function [c, ceq] = confun(x)
         % Nonlinear inequality constraints
         c = [1.5 + x(1)*x(2) - x(1) - x(2);
             -x(1)*x(2) - 10];
         % Nonlinear equality constraints
         ceq = [];
     end
    end
  3. MATLAB パス上のフォルダーにファイル名を runfmincon.m としてファイルを保存します。

例の実行

例を実行するには以下を入力します。

[history searchdir] = runfmincon;

以下にコマンド ウィンドウの反復出力を表示します。

                                Max     Line search  Directional  First-order 
 Iter F-count        f(x)   constraint   steplength   derivative   optimality Procedure 
    0      3       1.8394          0.5                                         Infeasible start point
    1      6      1.85127     -0.09197            1        0.109        0.778   
    2      9     0.300167         9.33            1       -0.117        0.313  Hessian modified twice  
    3     12     0.529835       0.9209            1         0.12        0.232   
    4     16     0.186965       -1.517          0.5       -0.224         0.13   
    5     19    0.0729085       0.3313            1       -0.121        0.054   
    6     22    0.0353323     -0.03303            1      -0.0542       0.0271   
    7     25    0.0235566     0.003184            1      -0.0271      0.00587   
    8     28    0.0235504    9.031e-08            1      -0.0146     8.51e-07   
Active inequalities (to within options.ConstraintTolerance = 1e-06):
  lower      upper     ineqlin   ineqnonlin
                                     1
                                     2

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the  value of the constraint tolerance.

出力 history には 2 つのフィールドがあります。

history = 

  struct with fields:

       x: [9×2 double]
    fval: [9×1 double]

fval フィールドは、fmincon が計算する一連の点に対応する目的関数値を含みます。

history.fval

ans =

    1.8394
    1.8513
    0.3002
    0.5298
    0.1870
    0.0729
    0.0353
    0.0236
    0.0236

これらは、ヘッダーにある f(x) 列の反復出力に表示される値と同じ値です。

historyx フィールドはアルゴリズムが計算する一連の点を含みます。

history.x

ans =

   -1.0000    1.0000
   -1.3679    1.2500
   -5.5708    3.4699
   -4.8000    2.2752
   -6.7054    1.2618
   -8.0679    1.0186
   -9.0230    1.0532
   -9.5471    1.0471
   -9.5474    1.0474

この例ではこれら一連の点をプロットし、各点を反復数のラベルを付けて表示します。

最適な点は 8 回目の反復で求まります。点列の最後の 2 点は非常に近く重なっていることに注意してください。

2 番目の出力引数 searchdir は各反復での fmincon の探索方向を含みます。探索方向は、現在の反復で計算された点から次の反復で計算される点までの変位を示すベクトルです。

searchdir =

   -0.3679    0.2500
   -4.2029    2.2199
    0.7708   -1.1947
   -3.8108   -2.0268
   -1.3625   -0.2432
   -0.9552    0.0346
   -0.5241   -0.0061
   -0.0003    0.0003

関連するトピック