Main Content

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

複数のソリューション

複数のソリューションについて

runを次の構文で呼び出すと、オブジェクト内の複数の解が得られます。

[x,fval,exitflag,output,manymins] = run(...);

manymins はソリューション オブジェクトのベクトルです。GlobalOptimSolution を参照してください。manymins ベクトルは、目的関数の値の最低 (最良) から最高 (最悪) の順になっています。各ソリューション オブジェクトには、次のプロパティ (フィールド) が含まれます。

  • X — 局所最小値

  • FvalX における目的関数の値

  • Exitflag — ローカルソルバーの終了フラグ(ローカルソルバー関数のリファレンスページで説明されています:fmincon exitflagfminunc exitflaglsqcurvefit exitflag 、またはlsqnonlin exitflag

  • Output — ローカルソルバーの出力構造体(ローカルソルバー関数リファレンスページで説明:fmincon outputfminunc outputlsqcurvefit output 、またはlsqnonlin output

  • X0 — 解決点 X につながる開始点のセル配列

メモ

manymins には、正のローカル ソルバー終了フラグに対応するソリューションのみが含まれます。正の終了フラグに対応するものだけでなく、すべてのローカル ソリューションを収集する場合は、@savelocalsolutions 出力関数を使用します。GlobalSearch および MultiStart の出力関数を参照してください。

ソリューション オブジェクトのベクトルを調べる方法はいくつかあります。

  • MATLAB® ワークスペース ブラウザ内。ソリューション オブジェクトをダブルクリックし、変数エディターで結果の表示をダブルクリックします。

  • ドット表記を使用します。GlobalOptimSolution プロパティは大文字になります。プロパティにアクセスするには、適切な大文字と小文字を使用してください。

    たとえば、関数値のベクトルを見つけるには、次のように入力します。

    fcnvals = [manymins.Fval]
    fcnvals =
       -1.0316   -0.2155         0

    最も低い関数値 (manymins の最初の要素) につながるすべての開始点のセル配列を取得するには、次のように入力します。

    smallX0 = manymins(1).X0
  • いくつかのフィールド値をプロットします。たとえば、結果の Fval の範囲を確認するには、次のように入力します。

    histogram([manymins.Fval],10)

    これにより、計算された関数値のヒストグラムが生成されます。(この図は、前のいくつかの図とは異なる例のヒストグラムを示しています。)

明確な解決策の定義を変える

複数のローカル ソリューションを取得した後で、許容値が適切ではなかったことが判明する場合があります。必要以上に多くのローカル ソリューションが、互いに近すぎる間隔で存在する可能性があります。または、GlobalSearch または MultiStart によって、必要以上に多くのソリューションがまとめられ、必要なソリューションよりも少ないソリューションしか得られない場合もあります。

この状況に対処するには、異なる許容値でソルバーを再度実行します。XTolerance および FunctionTolerance 許容値は、ソルバーが出力を GlobalOptimSolution ベクトルにグループ化する方法を決定します。これらの許容値は、GlobalSearch または MultiStart オブジェクトのプロパティです。

たとえば、 fminconactive-set アルゴリズムを使用して MultiStart での実行例 の問題を解決したいとします。さらに、XToleranceFunctionTolerance の両方に対して 0.01 の許容値を設定するとします。run メソッドは、目的関数の値が互いに FunctionTolerance 以内であり、かつ互いの差が XTolerance 未満であるローカル ソリューションをグループ化します。解決策を得るには:

% Set the random stream to get exactly the same output
% rng(14,'twister')
ms = MultiStart('FunctionTolerance',0.01,'XTolerance',0.01);
opts = optimoptions(@fmincon,'Algorithm','active-set');
sixmin = @(x)(4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ...
    + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4);
problem = createOptimProblem('fmincon','x0',[-1,2],...
    'objective',sixmin,'lb',[-3,-3],'ub',[3,3],...
    'options',opts);
[xminm,fminm,flagm,outptm,someminsm] = run(ms,problem,50);
MultiStart completed the runs from all start points.

All 50 local solver runs converged with a
positive local solver exit flag.
someminsm
someminsm = 

  1x5 GlobalOptimSolution

  Properties:
    X
    Fval
    Exitflag
    Output
    X0

この場合、MultiStart は 5 つの異なるソリューションを生成しました。ここで「異なる」とは、ソリューションが目的関数の値または位置のいずれかで 0.01 以上離れていることを意味します。

関連するトピック