Main Content

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

GlobalSearch および MultiStart の出力関数

出力関数とは何ですか?

出力関数を使用すると、最適化の中間結果を調べることができます。さらに、ソルバーをプログラムで停止することもできます。

2 種類の 出力構造 と同様に、出力関数にも 2 種類あります。

  • グローバル出力関数は、各ローカル ソルバーの実行後に実行されます。これらは、グローバル ソルバーの開始時と終了時にも実行されます。

  • ローカル出力関数は、ローカル ソルバーの各反復後に実行されます。Optimization Toolbox の出力関数を参照してください。

グローバル出力関数を使用するには:

  • 出力関数 で説明されている構文を使用して出力関数を記述します。

  • GlobalSearch または MultiStart ソルバーの OutputFcn プロパティを出力関数の関数ハンドルに設定します。OutputFcn プロパティを関数ハンドルのセル配列に設定することで、複数の出力関数を使用できます。

組み込みの @savelocalsolutions 出力関数は、すべてのローカル ソリューションをベース ワークスペースの localSolTable 変数に保存します。この出力関数は、実行可能なローカル ソリューションだけでなく実行不可能なローカル ソリューションも保存します。runsolutions 出力は、終了フラグが正のローカル ソリューションのみを返します。

すべてのローカルソリューションを収集

この例では、savelocalsolutions 出力関数を MultiStart と共に使用して、実行中に見つかったすべてのローカル ソリューションを収集する方法を示します。まず、 MultiStart の出力関数として savelocalsolutions を指定します。

ms = MultiStart(OutputFcn=@savelocalsolutions);

この例の最後にある 補助関数 にリストされている bigtoleft 目的関数と twocone 非線形制約関数を使用して、MultiStart の 3 つの変数の問題を作成します。各成分の下限を – 1e5 に設定し、上限を 1e5 に設定します。この目的関数と非線形制約関数の詳細については、解析的ヘッシアンを使用した fmincon の内点法アルゴリズム を参照してください。

fun = @bigtoleft;
lb = -1e5*ones(1,3);
ub = -lb;

目的関数と制約関数には導関数情報が含まれます。導関数を使用するためのオプションを設定します。

opts = optimoptions(@fmincon,SpecifyObjectiveGradient=true,...
    SpecifyConstraintGradient=true);

初期点を[–10,–10,–10]に設定し、最適化問題を作成します。

x0 = -10*ones(1,3);
prob = createOptimProblem("fmincon",x0=x0,...
    lb = lb,ub = ub,...
    objective=fun,nonlcon=@twocone,options=opts);

再現性のために、ランダムシードを設定します。35 個の開始ポイントで MultiStart を実行します。

rng default
[x,fval,eflag,output,solns] = run(ms,prob,35)
MultiStart completed some of the runs from the start points. 

11 out of 35 local solver runs converged with a positive local solver exitflag.

x =

   -6.5000   -0.0000   -3.5000


fval =

  -2.8941e+03


eflag =

     2


output = 

  struct with fields:

                funcCount: 73904
         localSolverTotal: 35
       localSolverSuccess: 11
    localSolverIncomplete: 23
    localSolverNoSolution: 1
                  message: 'MultiStart completed some of the runs from the start points. ↵↵11 out of 35 local solver runs converged with a positive local solver exitflag.'


solns = 

  1×2 GlobalOptimSolution array with properties:

    X
    Fval
    Exitflag
    Output
    X0

ワークスペースには、35 個のローカル ソリューションすべてを含む localSolTable 変数が含まれています。対照的に、出力構造は、11 回のローカル ソルバー実行のみが成功したことを示しています。

size(localSolTable)
ans =

    35     4

出力関数によって返される情報の種類を確認するには、localSolTable の最初の行を表示します。

disp(localSolTable(1,:))
                   X                     fval      exitflag    constrviolation
    ________________________________    _______    ________    _______________

    -6.5    2.3432e-07          -3.5    -2894.1       1               0       

出力関数は、ローカル ソリューション X、それに関連付けられた目的関数値 fval、そのローカル ソルバーの実行に対応する終了フラグ、および制約違反 (制約違反がない場合は 0) を返します。

補助関数

次のコードは、補助関数 bigtoleft を作成します。

function [f,gradf] = bigtoleft(x)
% This is a simple function that grows rapidly negative
% as x(1) becomes negative
%
f = 10*x(:,1).^3+x(:,1).*x(:,2).^2+x(:,3).*(x(:,1).^2+x(:,2).^2);

if nargout > 1

   gradf=[30*x(1)^2+x(2)^2+2*x(3)*x(1);
       2*x(1)*x(2)+2*x(3)*x(2);
       (x(1)^2+x(2)^2)];

end
end

次のコードは、補助関数 twocone を作成します。

function [c,ceq,gradc,gradceq] = twocone(x)
% This constraint is two cones, z > -10 + r
% and z < 3 - r

ceq = [];
r = sqrt(x(1)^2 + x(2)^2);
c = [-10+r-x(3);
    x(3)-3+r];

if nargout > 2

    gradceq = [];
    gradc = [x(1)/r,x(1)/r;
       x(2)/r,x(2)/r;
       -1,1];

end
end

カスタム GlobalSearch 出力関数

この出力関数は、正の終了フラグを持つ 5 つの異なる局所最小値を見つけた後、または 0.5 未満の局所最小値を見つけた後に、 GlobalSearch を停止します。出力関数は、永続的なローカル変数 foundLocal を使用してローカルの結果を保存します。foundLocal により、出力関数は、ローカル ソリューションが他のソリューションと異なるかどうかを 1e-4 の許容範囲内で判断できます。

永続変数の代わりにネストされた関数を使用してローカル結果を保存するには、入れ子構造の出力関数の例 を参照してください。

  1. 出力関数 で説明されている構文を使用して出力関数を記述します。

    function stop = StopAfterFive(optimValues, state)
    persistent foundLocal
    stop = false;
    switch state
        case 'init'
            foundLocal = []; % initialized as empty
        case 'iter'
            newf = optimValues.localsolution.Fval;
            exitflag = optimValues.localsolution.Exitflag;
            % Now check if the exit flag is positive and
            % the new value differs from all others by at least 1e-4
            % If so, add the new value to the newf list
            if exitflag > 0 && all(abs(newf - foundLocal) > 1e-4)
                foundLocal = [foundLocal;newf];
                % Now check if the latest value added to foundLocal
                % is less than 1/2
                % Also check if there are 5 local minima in foundLocal
                % If so, then stop
                if foundLocal(end) < 0.5 || length(foundLocal) >= 5
                    stop = true;
                end
            end
    end
  2. StopAfterFive.m を MATLAB® パスのフォルダーにファイルとして保存します。

  3. 目的関数を記述し、全体的または複数の局所的最小値を見つける のような最適化問題構造を作成します。

    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
  4. sawtoothxy.m を MATLAB パスのフォルダーにファイルとして保存します。

  5. コマンドラインで、問題の構造を作成します。

    problem = createOptimProblem('fmincon',...
        'objective',@(x)sawtoothxy(x(1),x(2)),...
        'x0',[100,-50],'options',...
        optimoptions(@fmincon,'Algorithm','sqp'));
  6. 出力関数として @StopAfterFive を使用して GlobalSearch オブジェクトを作成し、反復表示プロパティを 'iter' に設定します。

    gs = GlobalSearch('OutputFcn',@StopAfterFive,'Display','iter');
  7. (オプション) この例と同じ回答を得るには、デフォルトの乱数ストリームを設定します。

    rng default
  8. 問題を実行します。

    [x,fval] = run(gs,problem)
     Num Pts                 Best       Current    Threshold        Local        Local                 
    Analyzed  F-count        f(x)       Penalty      Penalty         f(x)     exitflag        Procedure
           0      200       555.5                                   555.5            0    Initial Point
         200     1463   1.547e-15                               1.547e-15            1    Stage 1 Local
    
    GlobalSearch stopped by the output or plot function.
    
    1 out of 2 local solver runs converged with a positive local solver exit flag.
    
    x =
    
       1.0e-07 *
    
        0.0414    0.1298
    
    
    fval =
    
       1.5467e-15

GlobalSearch が関数値が 0.5 より小さい点を見つけたため、実行は早期に停止しました。

並列出力機能なし

MultiStart は並列実行できますが、グローバル出力関数とプロット関数の並列実行はサポートされていません。さらに、MultiStart が並列実行される場合、ローカル出力関数とプロット関数はワーカー上で実行されますが、その効果は直列実行の場合とは異なります。ローカル出力およびプロット関数は、ワーカー上で実行されている場合、表示を作成しません。ワーカーが結果をクライアント (MultiStart 並列ジョブの発信元) に渡すまで、出力関数とプロット関数の他の効果は表示されません。

MultiStart を並列で実行する方法の詳細については、 並列計算 を参照してください。

関連するトピック