Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

optimconstr

创建空优化约束数组

说明

使用 optimconstr 初始化一组约束表达式。

提示

有关完整的工作流,请参阅Problem-Based Optimization Workflow

示例

constr = optimconstr(N) 创建一个由空优化约束组成的 N×1 数组。使用 constr 初始化用于创建约束表达式的循环。

示例

constr = optimconstr(cstr) 创建一个按 cstr 进行索引的空优化约束数组,该数组是字符向量元胞数组或字符串向量。

如果 cstr 是 1×ncstr,其中 ncstrcstr 的元素数,则 constr 也是 1×ncstr。否则,constr 是 ncstr×1。

对于 cstrN 参数的任意组合,constr = optimconstr(cstr1,N2,...,cstrk)constr = optimconstr({cstr1,cstr2,...,cstrk})constr = optimconstr([N1,N2,...,Nk]) 会创建一个空的 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

用于索引的名称,指定为字符向量元胞数组或字符串向量。

示例: {'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

  • 您可以使用 optimineq 而不是 optimconstr 来创建不等式表达式。同样,您可以使用 optimeq 而不是 optimconstr 来创建等式表达式。

在 R2017b 中推出