このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
問題ベースのアプローチとソルバーベースのアプローチのどちらを選択するか
Global Optimization Toolbox ソルバーを使用して、滑らかでない関数を最適化したり、グローバル ソリューションを検索したり、多目的問題を解決したりします。問題ベースのアプローチを使用すると、より簡単に問題を設定して解決できます。
問題ベースの特性
利点 | 制限 |
---|---|
セットアップとデバッグが簡単 | 方程式の問題はありません |
同じ問題に対して異なるソルバーを実行するのが簡単になります | カスタム データ型はありません |
適切なソルバーを自動的に取得する | surrogateopt のチェックポイント ファイルがありません |
目的制約と非線形制約が同じ時間のかかる関数で計算される問題の解決を自動的に高速化します (通常はシミュレーション) | ベクトル化なし |
ソルバーベースのアプローチに関連するオプションの変数を変換する必要があります |
利点:
セットアップとデバッグが簡単になります。問題ベースのアプローチでは、シンボリック スタイルの変数を使用して最適化式と制約を作成します。問題ベースのグローバル最適化のセットアップを参照してください。ソルバーベースのアプローチでは、すべての変数を単一のベクトルに配置する必要がありますが、これは、特に変数が大きい場合や次元が異なる場合には扱いにくい場合があります。
同じ問題に対して異なるソルバーを実行するのが簡単になります。一部のソルバーでは呼び出し構文が異なります。たとえば、
surrogateopt
の非線形制約の構文は、他のすべてのソルバーの構文とは異なります。ソルバーベースのアプローチでsurrogateopt
と別のソルバーの両方を使用して問題を実行するには、目的関数の異なるバージョンを作成する必要があります。対照的に、問題ベースのアプローチでは構文の翻訳が行われるため、ソルバー名と場合によってはいくつかのオプションのみを変更する必要があります。適切なソルバーを自動的に取得します。
solve
関数は、目的と制約を処理できるソルバーを自動的に選択します。ソルバーベースのアプローチでは、適切なソルバーを選択する必要があります。目的制約と非線形制約が同じ時間のかかる関数 (通常はシミュレーション) で計算される問題の解決を自動的に高速化します。多くの場合、シミュレーションまたは ODE ソルバーは、同じ関数で目的制約と非線形制約を計算します。
fcn2optimexpr
を使用して時間のかかる関数を最適化式に変換する場合、'ReuseEvaluation'
引数をtrue
に設定することで、解決時間を節約できます。この設定により、ソルバーは目的制約と非線形制約を評価するときに、時間のかかる関数の再計算を回避します。ソルバーベースのアプローチでこの時間節約を実現するには、例 同じ関数における目的と非線形制約 に示すように、追加のプログラミングが必要になる場合があります。
制限事項:
方程式の問題はありません。Global Optimization Toolbox ソルバーを使用して
EquationProblem
タイプの方程式問題を解くことはできません。ただし、ゼロの目的関数とソルバーが受け入れる制約を指定することによって、実現可能性の問題を解決することができます。例については、surrogateoptを使用して実現可能性の問題を解決する、問題ベースを参照してください。カスタム データ型はありません。
ga
またはsimulannealbnd
でカスタム データ型を使用するには、ソルバー ベースのアプローチを使用する必要があります。例については、遺伝的アルゴリズムを使用したカスタム データ型の最適化とカスタム データ型を使用したシミュレーテッド アニーリングを使用したマルチプロセッサ スケジューリングを参照してください。surrogateopt
のチェックポイント ファイルがありません。surrogateopt
のチェックポイント ファイルにはソルバーベースのアプローチを使用します。詳細については、チェックポイント ファイルの操作 を参照してください。ベクトル化なし (ベクトル化の使用 を参照)。目的関数と非線形制約関数がベクトル化されて記述されている場合、ベクトル化の利点を得るにはソルバーベースのワークフローを使用する必要があります。問題ベースのアプローチで
UseVectorized
オプションを設定すると、パフォーマンスは向上せず、警告が表示されます。ソルバーベースのアプローチに関連するオプションの変数を変換する必要があります。たとえば、カスタム出力関数ではソルバーベースの構文が使用されます。
varindex
を使用して、問題ベースの変数をソルバーベースのインデックスに変換します。例については、varindex を使用した問題ベースアプローチでのオプションの設定を参照してください。