このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
複数のソリューション
複数のソリューションについて
runを次の構文で呼び出すことで、オブジェクト内の複数の解が得られます。
[x,fval,exitflag,output,manymins] = run(...);
manymins はソリューション オブジェクトのベクトルです。GlobalOptimSolution を参照してください。manymins ベクトルは、目的関数の値の最低 (最良) から最高 (最悪) の順に並んでいます。各ソリューション オブジェクトには、次のプロパティ (フィールド) が含まれます。
X— 局所的最小値Fval—Xにおける目的関数の値Exitflag— ローカルソルバーの終了フラグ(ローカルソルバー関数のリファレンスページに記載:fminconexitflag、fminuncexitflag、lsqcurvefitexitflag、またはlsqnonlinexitflag)Output— ローカルソルバーの出力構造体(ローカルソルバー関数のリファレンスページに記載:fminconoutput、fminuncoutput、lsqcurvefitoutput、またはlsqnonlinoutput)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 以上離れていることを意味します。