このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
ソリューションがグローバルであることを証明できますか?
保証なし
目的関数の大域的最小値を見つけたかどうかはどうすればわかりますか?簡単に答えると、それはできません。Global Optimization Toolbox ソルバーの結果がグローバル最適値であるという保証はありません。すべての Global Optimization Toolbox ソルバーは大域解を繰り返し見つけようとしますが、解が大域であることを証明できるアルゴリズムを採用しているソルバーはありません。
ただし、このセクションの戦略を使用して解決策を調査することができます。
patternsearch で解が局所解であるかどうかを確認する
想定される解決策が大域的最小値であるかどうかを判断する前に、まずそれが局所的最小値であるかどうかを確認します。そのためには、問題に対して patternsearch を実行します。
problemをfminconやfminuncの代わりにpatternsearchを使用するように変換するには、次のように入力します。
problem.solver = 'patternsearch';また、開始点を先ほど見つけた解決策に変更し、オプションをクリアします。
problem.x0 = x; problem.options = [];
たとえば、近くのポイントを確認 では次のようになります。
options = optimoptions(@fmincon,'Algorithm','active-set'); ffun = @(x)(x(1)-(x(1)-x(2))^2); problem = createOptimProblem('fmincon', ... 'objective',ffun,'x0',[1/2 1/3], ... 'lb',[0 -1],'ub',[1 1],'options',options); [x,fval,exitflag] = fmincon(problem)
x =
1.0e-007 *
0 0.1614
fval =
-2.6059e-016
exitflag =
1しかし、この解決策を patternsearch で確認すると、より良い解決策があることがわかります。報告された解決策 x から patternsearch を開始します。
% set the candidate solution x as the start point problem.x0 = x; problem.solver = 'patternsearch'; problem.options = []; [xp,fvalp,exitflagp] = patternsearch(problem)
Optimization terminated: mesh size less than options.MeshTolerance.
xp =
1.0000 -1.0000
fvalp =
-3.0000
exitflagp =
1大域解を含む境界領域を特定する
境界で囲まれた領域に滑らかな目的関数があるとします。十分な時間と開始点が与えられれば、MultiStart は最終的に大域解を見つけます。
したがって、大域解が存在できる領域を境界で囲むことができれば、MultiStart が大域解を特定するというある程度の保証が得られます。
例えば、関数
初期加数 x6 + y6 は、|x| または |y| の大きな値に対して関数を大きくし、正になるように強制します。関数の大域的最小値は境界内になければならない
–10 ≤ x,y ≤ 10,
106 は、関数の他の加数に現れる 104 の倍数よりもはるかに大きいからです。
この問題では、より小さい境界を特定できます。たとえば、大域的最小値は -2 と 2 の間です。最適な境界を特定することよりも、妥当な境界を特定することの方が重要です。
複数の開始ポイントでマルチスタートを使用する
問題に対するより良い解決策があるかどうかを確認するには、追加の開始ポイントを指定して MultiStart を実行します。GlobalSearch ではローカル ソルバーがすべての開始点から実行されないため、このタスクでは GlobalSearch ではなく MultiStart を使用します。
(たとえば、例: より良い解決策を探して など)。