ドキュメンテーション

optimconstr

構文

``constr = optimconstr(N)``
``constr = optimconstr(cstr)``
``constr = optimconstr(cstr1,N2,...,cstrk)``
``constr = optimconstr({cstr1,cstr2,...,cstrk})``
``constr = optimconstr([N1,N2,...,Nk])``

説明

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

``constr = optimconstr(cstr)` は、文字ベクトルの cell 配列または string ベクトル `cstr` によってインデックス付けされる空の最適化制約の配列を作成します。`cstr` が 1 行 n`cstr` 列の場合 (ここで、n`cstr` は `cstr` の要素数)、`constr` も 1 行 n`cstr` 列です。それ以外の場合、`constr` は n`cstr` 行 1 列です。`
``constr = optimconstr(cstr1,N2,...,cstrk)` または `constr = optimconstr({cstr1,cstr2,...,cstrk})` または `constr = optimconstr([N1,N2,...,Nk])` は、`cstr` と `N` 個の引数のすべての組み合わせについて、空の最適化制約の n`cstr`1 x `N`2 x ... x n`cstr`k の配列を作成します。ここで、n`cstr` は `cstr` の要素数です。`

例

すべて折りたたむ

```N = 12; stock = optimvar('stock',N,1,'Type','integer','LowerBound',0); buy = optimvar('buy',N,1,'Type','integer','LowerBound',0); sell = optimvar('sell',N,1,'Type','integer','LowerBound',0); initialstock = 100; stockbalance = optimconstr(N,1); for t = 1:N if t == 1 enterstock = initialstock; else enterstock = stock(t-1); end stockbalance(t) = stock(t) == enterstock + buy(t) - sell(t); end showconstr(stockbalance) ```
```(1, 1) -buy(1, 1) + sell(1, 1) + stock(1, 1) == 100 (2, 1) -buy(2, 1) + sell(2, 1) - stock(1, 1) + stock(2, 1) == 0 (3, 1) -buy(3, 1) + sell(3, 1) - stock(2, 1) + stock(3, 1) == 0 (4, 1) -buy(4, 1) + sell(4, 1) - stock(3, 1) + stock(4, 1) == 0 (5, 1) -buy(5, 1) + sell(5, 1) - stock(4, 1) + stock(5, 1) == 0 (6, 1) -buy(6, 1) + sell(6, 1) - stock(5, 1) + stock(6, 1) == 0 (7, 1) -buy(7, 1) + sell(7, 1) - stock(6, 1) + stock(7, 1) == 0 (8, 1) -buy(8, 1) + sell(8, 1) - stock(7, 1) + stock(8, 1) == 0 (9, 1) -buy(9, 1) + sell(9, 1) - stock(8, 1) + stock(9, 1) == 0 (10, 1) -buy(10, 1) + sell(10, 1) - stock(9, 1) + stock(10, 1) == 0 (11, 1) -buy(11, 1) + sell(11, 1) - stock(10, 1) + stock(11, 1) == 0 (12, 1) -buy(12, 1) + sell(12, 1) - stock(11, 1) + stock(12, 1) == 0 ```

```prob = optimproblem; prob.Constraints.stockbalance = stockbalance; ```

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

```tt = ones(N-1,1); d = diag(tt,-1); % shift index by -1 stockbalance2 = stock == d*stock + buy - sell; stockbalance2(1) = stock(1) == initialstock + buy(1) - sell(1); ```

```showconstr(stockbalance2) ```
```(1, 1) -buy(1, 1) + sell(1, 1) + stock(1, 1) == 100 (2, 1) -buy(2, 1) + sell(2, 1) - stock(1, 1) + stock(2, 1) == 0 (3, 1) -buy(3, 1) + sell(3, 1) - stock(2, 1) + stock(3, 1) == 0 (4, 1) -buy(4, 1) + sell(4, 1) - stock(3, 1) + stock(4, 1) == 0 (5, 1) -buy(5, 1) + sell(5, 1) - stock(4, 1) + stock(5, 1) == 0 (6, 1) -buy(6, 1) + sell(6, 1) - stock(5, 1) + stock(6, 1) == 0 (7, 1) -buy(7, 1) + sell(7, 1) - stock(6, 1) + stock(7, 1) == 0 (8, 1) -buy(8, 1) + sell(8, 1) - stock(7, 1) + stock(8, 1) == 0 (9, 1) -buy(9, 1) + sell(9, 1) - stock(8, 1) + stock(9, 1) == 0 (10, 1) -buy(10, 1) + sell(10, 1) - stock(9, 1) + stock(10, 1) == 0 (11, 1) -buy(11, 1) + sell(11, 1) - stock(10, 1) + stock(11, 1) == 0 (12, 1) -buy(12, 1) + sell(12, 1) - stock(11, 1) + stock(12, 1) == 0 ```

ループでの制約の作成は、行列演算による制約の作成より多くの時間を要することがあります。ただし、ループを使用した方が、誤った制約を作成する可能性は低くなります。

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

```meals = ["breakfast","lunch","dinner"]; constr = optimconstr(meals); foods = ["cereal","oatmeal","yogurt","peanut butter sandwich","pizza","hamburger",... "salad","steak","casserole","ice cream"]; diet = optimvar('diet',foods,meals,'LowerBound',0); calories = [200,175,150,450,350,800,150,650,350,300]'; for i = 1:3 constr(i) = diet(:,i)'*calories <= 250*i; end```

`dinner` の制約を確認します。

`showconstr(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 ```

入力引数

すべて折りたたむ

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

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

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

データ型: `double`

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

データ型: `string` | `cell`

出力引数

すべて折りたたむ

たとえば、

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

制限

• 問題内の各制約式は、同じ比較を使用しなければなりません。たとえば、以下のコードは、`cons1``<=` 比較を使用し、`cons2``>=` 比較を使用しており、`cons1``cons2` が同じ式内にあるため、エラーが発生します。

```prob = optimproblem; x = optimvar('x',2,'LowerBound',0); cons1 = x(1) + x(2) <= 10; cons2 = 3*x(1) + 4*x(2) >= 2; prob.Constraints = [cons1;cons2]; % This line throws an error```

このエラーは、制約ごとに個別の式を使用することで回避できます。

```prob.Constraints.cons1 = cons1; prob.Constraints.cons2 = cons2;```

ヒント

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

Watch now