ウォーム スタートのベスト プラクティス
MATLAB でのウォーム スタートの使用
lsqlin
ソルバーと quadprog
ソルバーは、強化された初期点としてウォーム スタート オブジェクトの使用をサポートしています。ウォーム スタート オブジェクトは、前回の求解によるアルゴリズム固有のデータを保存して、求解ごとに行われる高コストな初期化の回避に役立ちます。ウォーム スタートを使用すると、複数のソルバー呼び出しにおけるパフォーマンスが大幅に向上する可能性があります。ソルバーでウォーム スタートを使用するには、まず optimwarmstart
を使用してウォーム スタート オブジェクトを作成します。初期点 x0
と、optimoptions
で作成したオプション (Algorithm
オプションを 'active-set'
に設定するなど) を指定します。基本的な例については、quadprog
ウォーム スタート オブジェクトを返すおよび lsqlin
ウォーム スタート オブジェクトを返すを参照してください。より広範囲な例は、quadprog のウォーム スタートを参照してください。
ウォーム スタート オブジェクトは、似た問題のシーケンスを解く場合に使用します。最良のパフォーマンスを得るには、次のガイドラインに従います。
変数の数を同じにする。変数の数を次の問題と同じにしなければなりません。変数の数が変わると、ソルバーでエラーが発生します。
等式制約を変更しない。等式制約の行列
Aeq
またはbeq
を変更すると、ソルバーでウォーム スタートを使用できなくなります。行列
A
の一部の行を変更する。ウォーム スタートが最も効率的に機能するのは、問題で制約A*x <= b
を表す行列A
の一部の行と、対応するベクトルb
のみを変更した場合です。この変更には、1 つ以上の制約の追加や削除を含みます。ベクトル
b
の一部の要素を変更する。ウォーム スタートが最も効率的に機能するのは、問題でベクトルb
の一部の要素のみを変更した場合です。一部の範囲制約を変更する。ウォーム スタートが最も効率的に機能するのは、問題で一部の範囲制約のみを変更 (上限または下限のエントリを追加、削除、または変更) した場合です。この変更には、
Inf
または –Inf
の範囲設定を含みます。目的関数を変更する。ウォーム スタートが効果を発揮できるのは、目的関数を表す行列またはベクトル (
quadprog
のH
配列とf
配列またはlsqlin
のC
配列とd
配列) を変更した場合です。しかし、これらの配列を大きく変更すると、前回の求解と新しい求解がかけ離れて、効率性が損なわれる可能性があります。
ウォーム スタートによるパフォーマンス改善は、結局のところ問題の幾何形状に依存します。多くの問題では、問題間でごくわずかな変更があった場合にパフォーマンス改善が大きくなります。
静的メモリ管理を行うコード生成でのウォーム スタートの使用
静的メモリ管理を行うコード生成では、MATLAB® のウォーム スタートに関するガイドラインに加えて、次のガイドラインにも従います。
optimwarmstart
で、名前と値の引数'MaxLinearEqualities'
および'MaxLinearInequalities'
を設定する。行列のソルバー入力 (
lb
、Aeq
など) すべてにcoder.varsize
(MATLAB Coder) マクロを使用する。
参考
lsqlin
| quadprog
| optimwarmstart
| coder.varsize
(MATLAB Coder)