Main Content

optimconstr

빈 최적화 제약 조건 배열 생성

설명

optimconstr을 사용하여 제약 조건 표현식 집합을 초기화합니다.

전체 워크플로는 문제 기반 최적화 워크플로 항목을 참조하십시오.

예제

constr = optimconstr(N)은 빈 최적화 제약 조건으로 구성된 N×1 배열을 만듭니다. 제약 조건 표현식을 만드는 루프를 초기화하려면 constr을 사용하십시오.

예제

constr = optimconstr(cstr)cstr(문자형 벡터 또는 string형 벡터로 구성된 셀형 배열)로 인덱싱된 빈 최적화 제약 조건으로 구성된 배열을 만듭니다.

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개 인수의 모든 조합에 대해 빈 최적화 제약 조건으로 구성된 ncstrN2×...×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)의 크기는 N1×N2입니다.

  • constr = optimconstr(N1,N2,...,Nk)의 크기는 N1×N2×...×Nk입니다.

예: 5

데이터형: double

인덱싱을 위한 이름으로, 문자형 벡터 또는 string형 벡터로 구성된 셀형 배열로 지정됩니다.

예: {'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;

  • 일반적으로 루프보다는 벡터화된 표현식으로 제약 조건을 생성하는 것이 더 효율적입니다. Create Efficient Optimization Problems 항목을 참조하십시오.

  • 부등식 표현식을 생성할 때 optimconstr 대신 optimineq를 사용할 수 있습니다. 이와 유사하게, 등식 표현식을 생성할 때 optimconstr 대신 optimeq를 사용할 수 있습니다.

버전 내역

R2017b에 개발됨