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

問題ベースの最適化ワークフロー

メモ

Optimization Toolbox™ には、単一目的最適化問題を解くためのアプローチが 2 通りあります。このトピックでは、問題ベースのアプローチについて説明します。ソルバーベースの最適化問題の設定では、ソルバーベースのアプローチについて説明しています。

最適化の問題を解くには、以下の手順を実行します。

  • optimproblem を使用して、最適化問題オブジェクトを作成します。問題オブジェクトは、目的の式と制約を定義するコンテナーです。最適化問題オブジェクトは、問題と、問題変数に存在する範囲を定義します。

    たとえば、最大化問題を作成します。

    prob = optimproblem('ObjectiveSense','maximize');
  • optimvar を使用して、名前付き変数を作成します。最適化変数は、問題の目的と制約を記述するために使用するシンボリック変数です。変数定義に範囲を含めます。

    たとえば、'x' という名前の 2 値変数の 15 行 3 列の配列を作成します。

    x = optimvar('x',15,3,'Type','integer','LowerBound',0,'UpperBound',1);
  • 問題オブジェクトの目的関数を名前付き変数の式として定義します。

    メモ

    多項式または有理式ではない非線形関数がある場合、fcn2optimexpr を使用して最適化式に変換します。詳細は、非線形関数から最適化式への変換を参照してください。

    たとえば、変数 x の行列と同じサイズの実数行列 f があり、目的が f 内のエントリと対応する変数 x の積の合計であるとします。

    prob.Objective = sum(sum(f.*x));
  • 名前付き変数の比較または式の比較として、最適化問題の制約を定義します。

    メモ

    多項式または有理式ではない非線形関数がある場合、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 を参照してください。非線形の例は、制約付き非線形問題の解法、問題ベースを参照してください。より広範囲な例は、問題ベースの非線形最適化線形計画法と混合整数線形計画法、または二次計画法を参照してください。

参考

| | | | | |

関連するトピック