Main Content

最適化のトラブルシューティングとヒント

次の表では、最適化に関する一般的な問題について説明し、推奨される処理方法を提示します。

問題

推奨される処理方法

fminbnd または fminsearch によって求められる解が、"大域的" 最小値ではない。大域的最小値が、探索空間のすべての点の中で最小の目的関数値をもっている。

問題が連続で最小値が 1 つしか存在しない場合を除き、解が大域的最小値である保証はありません。大域的最小値を探索するには、複数の開始点 (fminbnd の場合は区間) から最適化を開始します。

いくつかの点 x で目的関数 f(x) を評価できない。このような点が "実行不可能" と見なされている。

実行不可能な点 xf(x) が大きい正の値を返すように関数を変更します。

最小化ルーチンが無限ループになるように見える、あるいは最小でない解 (関数 fzero の場合はゼロでない解) を返す。

おそらく、目的関数は NaN または複素数値を返しています。ソルバーで想定されているのは実数の目的関数値のみです。その他の値では予期しない結果になる場合があります。NaN または複素数値があるかどうかを判断するには、

options = optimset('FunValCheck','on')

を設定し、入力引数に options を使用して最適化関数を呼び出します。目的関数が NaN または複素数値を返す場合、この設定によってソルバーはエラーをスローします。

ソルバーに時間がかかる。

ほとんどの最適化問題は、開始点をうまく選ぶと解決しやすくなります。問題の特性に基づいて、解に近い可能性のある領域でランダムな開始点を試してください。

進化的な手段を使用して複雑な問題を解くことができる場合があります。まず、独立変数の数が少ない問題を解きます。適切なマッピングを使用することにより、このように比較的単純な問題の解を、複雑な問題の開始点として使用します。また、最適化問題の初期段階で、より単純な目的関数と、あまり厳密でない停止条件を使用することにより、短時間で解を得られる場合もあります。

ソルバーが何をしているかが明確でない。

ソルバーが反復で何を行っているかを確認する方法は次のとおりです。

fminsearch が解に到達しない。

fminsearch が解に到達しない理由はさまざまです。

  • スケーリングが不適切。問題のセンタリングおよびスケーリングが十分でない場合、ソルバーは正しく収束できないことがあります。目的関数に対し各座標がほぼ同じ効果を与えるようにして、考えられる解に近い各座標のスケールが大きすぎもせず小さすぎもしないことを確認します。これを行うには、目的関数を編集して、各座標に適切な定数を加算または乗算します。

  • 停止条件が不適切。TolFun または TolX に指定される値が小さすぎる場合、fminsearch が解に到達しても認識されない可能性があります。値が大きすぎる場合は、fminsearch は解から離れたところで停止する可能性があります。

  • 初期点が不適切。さまざまな初期点から fminsearch を開始してみます。

  • 反復が不十分。ソルバーの反復が終了した場合やソルバーが停止した場合は、より良い解に到達するために、fminsearch を最終点から再開してみます。MaxFunEvals オプションおよび MaxIter オプションの値を既定値の 200*length(x0) から増加させると、fminsearch がより良い解に到達する場合があります。

メモ

最適化ソルバーは実数値の関数に適用されます。ノルムなどの複素数値の実数値関数を除いて、複素数値を最適化することはできません。

関連するトピック