最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

リアルタイム アプリケーションの最適化コード生成

生成コードの時間制限

組み込みアプリケーションには、コードが実行されて解を返すまでの時間を制限する要件がある場合があります。fmincon では最適化にかかる時間が保証されないため、このような要件は問題になる可能性があります。このトピックでは、組み込みコードが実行されて結果を返すまでの時間を推定する手法を紹介し、所要時間を短縮するために行うことのできるコード変更について説明します。

コード生成のための効率的なコード記述に関する一般的なアドバイスについては、コード生成用の MATLAB コード設計における注意事項 (MATLAB Coder)を参照してください。

ターゲット環境に合わせる

コードを生成する前に生成コードの実行時間を推定するには、MATLAB® 環境を可能な限りターゲット環境に合わせて設定します。

コーダーの構成を設定する

コード生成の構成を設定するには、coder.config を呼び出します。

cfg = coder.config('mex');

生成コードにおける時間を短縮するには、整合性チェックと整数飽和チェックをオフにします。これらのチェックが目的関数と非線形制約関数で必要なければ、fmincon はこれらのチェックに依存することなく正常に動作します。詳細は、実行時チェックの制御 (MATLAB Coder)を参照してください。

cfg.IntegrityChecks = false;
cfg.SaturateOnIntegerOverflow = false;

通常、生成コードは静的メモリ割り当てを使用した方が高速に実行されます。ただし、この割り当てにより、生成コードの量が増えることがあります。また、ハードウェアによっては、動的メモリ割り当てをサポートしていません。静的メモリ割り当てを使用するには、次の設定を指定します。

cfg.DynamicMemoryAllocation = 'Off';

異なる BLAS (基礎となる線形代数サブプログラム) を選択することで、コードのパフォーマンスを高められます。生成コードの BLAS を設定する方法については、生成されたスタンドアロン コードでの BLAS 呼び出しを使用した行列演算の高速化 (MATLAB Coder)を参照してください。組み込みアプリケーションを並列実行する場合は、ご利用のシステムでの並列計算をサポートする BLAS ライブラリまたは LAPACK ライブラリを指定しなければなりません。同様に、並列ハードウェアをお持ちの場合は、カスタム LAPACK 呼び出しを設定することで、コードのパフォーマンスを高められます。詳細は、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。

fmincon のベンチマークを行う

アプリケーションの一連の典型的な入力パラメーターを使用し、評価を 1000 回行うループで MEX 生成コードを実行します。評価時間の合計時間と最大値の両方を求めます。fmincon に時間がかかりすぎそうなパラメーターやその他のパラメーターを試してテストします。MEX アプリケーションで満足できる結果が満足できる時間内に返されたら、配布されたアプリケーションでも同様になることが期待できます。

fmincon の初期点を設定する

実行時間と解の質の両方に影響を与える重要な要素の 1 つが、最適化の初期点 x0 です。fmincon 呼び出しの間にパラメーターが徐々に変化する場合、通常は前回の呼び出しでの解が次の呼び出しの適切な開始点になります。パラメーターの変化に応じた方程式の解の追跡を参照してください。解で引き込み領域が切り替わることで、求解の所要時間が急に変化する仕組みについても説明しています。

徐々に変化するパラメーターがなく、制御変数がわずかしかない最適化問題であれば、以前の解から応答を推定してみる価値がある場合があります。パラメーターの関数として、解のモデルを作成します。これは、パラメーターの二次関数または低次元の内挿として作成します。また、予測される解の点を fmincon の開始点として使用します。

オプションを適切に設定する

パラメーターの微調整により、解を求める速度を改善できる場合があります。MaxIterations オプションを設定して反復回数をわずか数回に抑えれば、fmincon はすぐに停止します。

opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50);
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

ただし、結果が最適値とかけ離れる可能性があります。精度の低い結果がシステム全体に影響を与えないようにします。時間の制約の範囲内で、MaxIterations を可能な限り大きく設定します。この値を推定するには、反復にかかる時間か関数評価にかかる時間を測定し、MaxFunctionEvaluations オプションか MaxIterations オプションを設定します。例については、最適化のためのコード生成の基本を参照してください。

fmincon を高速化する設定に関する詳しいヒントについては、ソルバーの時間がかかりすぎるを参照してください。ただし、fmincon コード生成における制限のため、このトピックのヒントの中には適用できないものがあることに注意してください。詳細は、fmincon におけるコード生成を参照してください。

大域的最小値

解として、単なる局所的最小値ではなく、大域的最小値が必要な場合があります。ヒントについては、より小さい最小値の検索を参照してください。大域的最小値の検索には相当の時間がかかる可能性があり、うまくいく保証もありません。

参考

| |

関連するトピック