問題ベースの最適化ワークフロー
メモ
Optimization Toolbox™ には、単一目的最適化問題を解くためのアプローチが 2 通りあります。このトピックでは、問題ベースのアプローチについて説明します。ソルバーベースの最適化問題の設定では、ソルバーベースのアプローチについて説明しています。
最適化の問題を解くには、以下の手順を実行します。
optimproblem
を使用して、最適化問題オブジェクトを作成します。問題オブジェクトは、目的の式と制約を定義するコンテナーです。最適化問題オブジェクトは、問題と、問題変数に存在する範囲を定義します。たとえば、最大化問題を作成します。
prob = optimproblem('ObjectiveSense','maximize');
optimvar
を使用して、名前付き変数を作成します。最適化変数は、問題の目的と制約を記述するために使用するシンボリック変数です。変数定義に範囲を含めます。たとえば、
'x'
という名前の 2 値変数の 15 行 3 列の配列を作成します。x = optimvar('x',15,3,'Type','integer','LowerBound',0,'UpperBound',1);
問題オブジェクトの目的関数を名前付き変数の式として定義します。
メモ
多項式、有理式、および初等関数 (
exp
など) で構成されていない非線形関数がある場合は、その関数をfcn2optimexpr
を使用して最適化式に変換します。詳細については、非線形関数から最適化式への変換と最適化変数および式でサポートされる演算を参照してください。必要に応じて、式にワークスペース変数として追加のパラメーターを含めます。問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。
たとえば、変数
x
の行列と同じサイズの実数行列f
があり、目的がf
内のエントリと対応する変数x
の積の合計であるとします。prob.Objective = sum(sum(f.*x));
名前付き変数の比較または式の比較として、最適化問題の制約を定義します。
メモ
多項式、有理式、および初等関数 (
exp
など) で構成されていない非線形関数がある場合は、その関数をfcn2optimexpr
を使用して最適化式に変換します。詳細については、非線形関数から最適化式への変換と最適化変数および式でサポートされる演算を参照してください。たとえば、
x
の各行の変数の合計が 1 で、各列の変数の合計は 1 以下でなければならないものとします。onesum = sum(x,2) == 1; vertsum = sum(x,1) <= 1; prob.Constraints.onesum = onesum; prob.Constraints.vertsum = vertsum;
非線形問題の場合、フィールドが最適化変数名となっている構造体として、初期点を設定します。以下に例を示します。
x0.x = randn(size(x)); x0.y = eye(4); % Assumes y is a 4-by-4 variable
solve
を使用して問題を解きます。sol = solve(prob); % Or, for nonlinear problems, sol = solve(prob,x0)
これらの基本的な手順に加え、show
または write
を使用して、問題を解く前に問題定義を確認することができます。既定のソルバーまたはオプションの変更で説明されているように、optimoptions
を使用して solve
のオプションを設定します。
警告
問題ベースのアプローチでは、目的関数、非線形等式、および非線形不等式における複素数値はサポートされていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。
メモ
最適化問題に含まれるすべての名前は一意でなければなりません。特に、すべての変数名、目的関数名、および制約関数名は異なっている必要があります。
混合整数線形計画法の基本的な例については、混合整数線形計画法の基礎: 問題ベースまたはビデオ Solve a Mixed-Integer Linear Programming Problem Using Optimization Modeling を参照してください。非線形の例は、制約付き非線形問題の解法、問題ベースを参照してください。より広範囲な例は、問題ベースの非線形最適化、線形計画法と混合整数線形計画法、または二次計画法と錐計画法を参照してください。
参考
fcn2optimexpr
| optimproblem
| optimvar
| solve
| optimoptions
| show
| write