Main Content

optimineq

空の最適化不等式配列の作成

R2019b 以降

説明

optimineq を使用して、不等式のセットを初期化します。

ヒント

完全なワークフローについては、問題ベースの最適化ワークフローを参照してください。

constr = optimineq(N) は、N 行 1 列の空の最適化不等式の配列を作成します。constr を使用して不等式を作成するループを初期化します。

constr = optimineq(cstr) は、文字ベクトルの cell 配列または string ベクトル cstr によってインデックス付けされる空の最適化制約の配列を作成します。

cstr が 1 行 ncstr 列の場合 (ここで、ncstrcstr の要素数)、constr も 1 行 ncstr 列です。それ以外の場合、constr は ncstr 行 1 列です。

constr = optimineq(cstr1,N2,...,cstrk) または constr = optimineq({cstr1,cstr2,...,cstrk}) または constr = optimineq([N1,N2,...,Nk]) は、cstrN の引数のすべての組み合わせについて、空の最適化不等式の ncstr1 x N2 x ... x ncstrk の配列を作成します。ここで、ncstrcstr の要素数です。

すべて折りたたむ

2 要素変数 x が多数の円板の交差部分になければならないという制約を作成します。円板の中心と半径は、配列 centers および radii に格納されています。

x = optimvar('x',1,2);
centers = [1 -2;3 -4;-2 3];
radii = [6 7 8];
constr = optimineq(length(radii));
for i = 1:length(constr)
    constr(i) = sum((x - centers(i,:)).^2) <= radii(i)^2;
end

不等式を表示します。

show(constr)
  arg_LHS <= arg_RHS

  where:

        arg1 = zeros(3, 1);
        arg1(1) = sum((x - extraParams{1}).^2);
        arg1(2) = sum((x - extraParams{2}).^2);
        arg1(3) = sum((x - extraParams{3}).^2);
        arg_LHS = arg1(:);
        arg1 = zeros(3, 1);
        arg1(1) = 36;
        arg1(2) = 49;
        arg1(3) = 64;
        arg_RHS = arg1(:);

    extraParams{1}:

     1    -2


  extraParams{2}:

     3    -4


  extraParams{3}:

    -2     3

ループを使用する代わりに、変数に対する行列演算を使用して、同じ制約を作成できます。

constr2 = sum(([x;x;x] - centers).^2,2) <= radii'.^2;

ループでの不等式の作成は、行列演算による不等式の作成より多くの時間を要することがあります。

ダイエットで消費されるカロリーを表すためのインデックス付き不等式と変数を作成します。食事ごとに異なるカロリー制限があります。食事や食物、各食物のカロリーを表す配列を作成します。

meals = ["breakfast","lunch","dinner"];
foods = ["cereal","oatmeal","yogurt","peanut butter sandwich","pizza","hamburger",...
    "salad","steak","casserole","ice cream"];
calories = [200,175,150,450,350,800,150,650,350,300]';

各食事の食物を表す最適化変数を作成し、食物名と食事名によってインデックス付けします。

diet = optimvar('diet',foods,meals,'LowerBound',0);

食事ごとに食事のカロリーの上限を設ける不等式制約を設定します。

constr = optimineq(meals);
for i = 1:3
    constr(i) = diet(:,i)'*calories <= 250*i;
end

dinner の不等式を表示します。

show(constr("dinner"))
  200*diet('cereal', 'dinner') + 175*diet('oatmeal', 'dinner') + 150*diet('yogurt', 'dinner') + 450*diet('peanut butter sandwich', 'dinner') + 350*diet('pizza', 'dinner') + 800*diet('hamburger', 'dinner') + 150*diet('salad', 'dinner') + 650*diet('steak', 'dinner') + 350*diet('casserole', 'dinner') + 300*diet('ice cream', 'dinner') <= 750

ループを使用する代わりに、変数に対する行列演算を使用して、同じ不等式を作成できます。

constr2 = diet'*calories <= 250*(1:3)';

IndexNames プロパティを設定することで、不等式の適切なインデックス名を含めます。

constr2.IndexNames = {meals, {}};

dinner の新しい不等式を表示します。これは先ほどの不等式と同じです。

show(constr2("dinner"))
  200*diet('cereal', 'dinner') + 175*diet('oatmeal', 'dinner') + 150*diet('yogurt', 'dinner') + 450*diet('peanut butter sandwich', 'dinner') + 350*diet('pizza', 'dinner') + 800*diet('hamburger', 'dinner') + 150*diet('salad', 'dinner') + 650*diet('steak', 'dinner') + 350*diet('casserole', 'dinner') + 300*diet('ice cream', 'dinner') <= 750

ループでの不等式の作成は、行列演算による不等式の作成より多くの時間を要することがあります。

入力引数

すべて折りたたむ

制約の次元のサイズ。正の整数として指定します。

  • constr = optimineq(N) のサイズは N 行 1 列です。

  • constr = optimineq(N1,N2) のサイズは N1N2 列です。

  • constr = optimineq(N1,N2,...,Nk) のサイズは N1 x N2 x ... x Nk です。

例: 5

データ型: double

インデックス用の名前。文字ベクトルの cell 配列または string ベクトルとして指定します。

メモ

cstr"Tp" などの string スカラーにすることはできず、["Tp" "ul"] などのベクトルにする必要があります。単一の名前を指定するには、{'Tp'} またはそれと等価の cellstr("Tp") を使用します。

例: {'red','orange','green','blue'}

例: ["red";"orange";"green";"blue"]

データ型: string | cell

出力引数

すべて折りたたむ

制約。空の OptimizationInequality 配列として返されます。constr を使用して制約式を作成するループを初期化します。

たとえば、

x = optimvar('x',8);
constr = optimineq(4);
for k = 1:4
    constr(k) = 5*k*(x(2*k) - x(2*k-1)) <= 10 - 2*k;
end

ヒント

  • 一般に、ループではなく、ベクトル化された式で制約を作成する方がより効率的です。詳細については、効率的な最適化問題の作成を参照してください。

  • optimineq の代わりに optimconstr を使用して、最適化問題の不等式制約を作成できます。

バージョン履歴

R2019b で導入