このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
複数のソリューション
複数のソリューションについて
run
を次の構文で呼び出すと、オブジェクト内の複数の解が得られます。
[x,fval,exitflag,output,manymins] = run(...);
manymins
はソリューション オブジェクトのベクトルです。GlobalOptimSolution
を参照してください。manymins
ベクトルは、目的関数の値の最低 (最良) から最高 (最悪) の順になっています。各ソリューション オブジェクトには、次のプロパティ (フィールド) が含まれます。
X
— 局所最小値Fval
—X
における目的関数の値Exitflag
— ローカルソルバーの終了フラグ(ローカルソルバー関数のリファレンスページで説明されています:fmincon
exitflag
、fminunc
exitflag
、lsqcurvefit
exitflag
、またはlsqnonlin
exitflag
Output
— ローカルソルバーの出力構造体(ローカルソルバー関数リファレンスページで説明:fmincon
output
、fminunc
output
、lsqcurvefit
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
オブジェクトのプロパティです。
たとえば、 fmincon
の active-set
アルゴリズムを使用して MultiStart での実行例 の問題を解決したいとします。さらに、XTolerance
と FunctionTolerance
の両方に対して 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 以上離れていることを意味します。