Main Content

optimconstr

空の最適化制約配列の作成

説明

optimconstr を使用して、制約式のセットを初期化します。

ヒント

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

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

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

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

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

すべて折りたたむ

在庫モデルの制約を作成します。各期間の開始時点の商品の在庫は、前期間の終了時点の在庫と等しくなります。各期間で、在庫は buy ずつ増加し、sell ずつ減少します。変数 stock は、期間の終了時点の在庫です。

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

show(stockbalance)
(1, 1)

  -buy(1) + sell(1) + stock(1) == 100

(2, 1)

  -buy(2) + sell(2) - stock(1) + stock(2) == 0

(3, 1)

  -buy(3) + sell(3) - stock(2) + stock(3) == 0

(4, 1)

  -buy(4) + sell(4) - stock(3) + stock(4) == 0

(5, 1)

  -buy(5) + sell(5) - stock(4) + stock(5) == 0

(6, 1)

  -buy(6) + sell(6) - stock(5) + stock(6) == 0

(7, 1)

  -buy(7) + sell(7) - stock(6) + stock(7) == 0

(8, 1)

  -buy(8) + sell(8) - stock(7) + stock(8) == 0

(9, 1)

  -buy(9) + sell(9) - stock(8) + stock(9) == 0

(10, 1)

  -buy(10) + sell(10) - stock(9) + stock(10) == 0

(11, 1)

  -buy(11) + sell(11) - stock(10) + stock(11) == 0

(12, 1)

  -buy(12) + sell(12) - stock(11) + stock(12) == 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);

新しい制約を表示し、stockbalance の制約と同じであることを確認します。

show(stockbalance2)
(1, 1)

  -buy(1) + sell(1) + stock(1) == 100

(2, 1)

  -buy(2) + sell(2) - stock(1) + stock(2) == 0

(3, 1)

  -buy(3) + sell(3) - stock(2) + stock(3) == 0

(4, 1)

  -buy(4) + sell(4) - stock(3) + stock(4) == 0

(5, 1)

  -buy(5) + sell(5) - stock(4) + stock(5) == 0

(6, 1)

  -buy(6) + sell(6) - stock(5) + stock(6) == 0

(7, 1)

  -buy(7) + sell(7) - stock(6) + stock(7) == 0

(8, 1)

  -buy(8) + sell(8) - stock(7) + stock(8) == 0

(9, 1)

  -buy(9) + sell(9) - stock(8) + stock(9) == 0

(10, 1)

  -buy(10) + sell(10) - stock(9) + stock(10) == 0

(11, 1)

  -buy(11) + sell(11) - stock(10) + stock(11) == 0

(12, 1)

  -buy(12) + sell(12) - stock(11) + stock(12) == 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 の制約を確認します。

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

入力引数

すべて折りたたむ

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

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

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

  • constr = optimconstr(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

出力引数

すべて折りたたむ

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

以下に例を示します。

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>= 比較を使用しており、cons1cons2 が同じ式内にあるため、エラーが発生します。

    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;

ヒント

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

  • optimconstr の代わりに optimineq を使用して、不等式を作成できます。同様に、optimconstr の代わりに optimeq を使用して、等式を作成できます。

バージョン履歴

R2017b で導入