メインコンテンツ

ソルバーの時間がかかりすぎる

ソルバーの時間がかかりすぎる理由はいろいろあります。理由を診断したり、より高速な解法を有効にするには、以下の 1 つ以上の手法を試します。

反復表示の有効化

Display オプションを "iter" に設定します。この設定により、ソルバー反復の結果が表示されます。

MATLAB® コマンド ラインで反復表示を有効にするには、次を入力します。

options = optimoptions("solvername",Display="iter");

options 構造体を使用して、ソルバーを呼び出します。

反復表示の例については、結果の解釈を参照してください。詳細については、反復表示内で何を探すかを参照してください。

適切な許容誤差を使用

許容誤差、特に OptimalityToleranceStepTolerance が小さすぎると、ソルバーは収束に失敗することがあります。

コマンド ラインで許容誤差を変更するには、最適化オプションの設定と変更で説明するように、関数 optimoptions を使用します。

プロット関数を使用

プロット関数を使用して、ソルバー反復に関するより視覚的またはより詳しい情報を得ることができます。選択したソルバーの関数リファレンス ページにある「オプション」セクションにプロット関数が一覧表示されています。

MATLAB コマンド ラインでプロット関数を使用するには、次を入力します。

options = optimoptions("solvername",PlotFcn={@plotfcn1,@plotfcn2,...});

options 構造体を使用して、ソルバーを呼び出します。

プロット関数の使用例については、定義済みプロット関数の使用 を参照してください。

"lbfgs" HessianApproximation オプションの使用

fmincon ソルバーおよび fminunc ソルバーでは、多数 (数百個以上) の変数が問題に含まれている場合、HessianApproximation オプションを "lbfgs" に設定することにより、しばしば時間とメモリを節約できます。これにより、fmincon"interior-point" アルゴリズムおよび fminunc"quasi-newton" アルゴリズムで低メモリのヘッセ近似が使用されます。多くの変数を使用した非線形問題の求解を参照してください。

checkGradients を使用した導関数の検証

導関数 (勾配またはヤコビアン) をソルバーに与えると、その導関数が不正確な場合は、ソルバーが収束に失敗する可能性があります。関数 checkGradients の使い方については、勾配またはヤコビアンの有効性を確認を参照してください。

任意の大きな境界値の代わりに Inf を使用

任意の大きな境界値 (上限または下限) を使用すると、ソルバーで過度に時間がかかり、場合によっては収束しないことがあります。しかし、境界値として Inf または -Inf を設定すれば、ソルバーでかかる時間が短縮され、うまく収束する場合があります。

この理由について説明しましょう。内点法アルゴリズムは初期点を有限範囲の中間点に設定できます。つまり、内点法アルゴリズムでは有限範囲の中ほどに「中央パス」の検出を試みることができます。このため、任意の大きな境界値ではこれらの成分の大きさが不適切に変更されることがあります。一方で、この目的では無限境界値は無視されます。

重要性は低いですが、一部のソルバーでは各制約に対し、主に制約ヘッシアンによってメモリを使用します。境界値を Inf または -Inf に設定することは制約がないことを意味するため、制約ヘッシアンの次元は低く、使用されるメモリが少なくなります。

出力関数の使用

出力関数を使用して、ソルバー反復に関する詳しい情報を得ることができます。ソルバーは反復ごとに出力関数を呼び出します。出力関数とプロット関数の構文で説明するように、構文を使用して出力関数を記述します。

出力関数の使用例については、Optimization Toolbox の出力関数 を参照してください。

さまざまなアルゴリズム オプションの試行

多くのソルバーには、求解時間を変化させる可能性のあるオプションがありますが、どう変化するかは容易に予測できません。一般的に Algorithm オプションは求解時間に顕著な影響を及ぼします。

求解時間に影響を及ぼす他のオプションには次のようなものがあります。

  • fmincon"interior-point" アルゴリズム — BarrierParamUpdate オプションを "predictor-corrector" に設定して試します。

  • "trust-region" または "trust-region-reflective" アルゴリズムの SubproblemAlgorithm オプション — SubproblemAlgorithm を既定の "cg" の代わりに "factorization" に設定して試します。

  • coneprog — 大規模なスパース問題では、LinearSolver オプションを "prodchol""schur"、または "normal" に設定して試します。密な問題では、LinearSolver オプションを "augmented" に設定して試します。

  • quadprog"interior-point-convex" アルゴリズムまたは lsqlin"interior-point" アルゴリズム — LinearSolver オプションを "sparse" または "dense" に設定して試します。

スパース ソルバーまたは乗算関数の使用

大きい問題は、MATLAB のメモリ不足か時間不足の原因になる可能性があります。以下に、メモリを減らす方法を挙げます。

並列計算の使用

Parallel Computing Toolbox™ ライセンスを保有する場合、並列計算を使用するとソルバーをより高速に実行できるかもしれません。詳細については、並列計算を参照してください。

参考

トピック