optimeq

Создайте пустой массив равенства оптимизации

Описание

Использовать optimeq для инициализации набора выражений равенства.

пример

eq = optimeq(N) создает N-by-1 массив пустых оптимизационных равенств. Использование eq чтобы инициализировать цикл, который создает равенства. Используйте получившиеся равенства как ограничения в задаче оптимизации или как уравнения в задаче уравнения.

пример

eq = optimeq(cstr) создает массив пустых равенств оптимизации, которые индексируются cstr, массив ячеек из векторов символов или строковых векторов.

Если cstr 1-байт- n cstr, где n cstr количество элементов cstr, затем eq также 1-байт- n cstr. В противном случае eq является n cstr-by-1.

eq = optimeq(cstr1,N2,...,cstrk) или eq = optimeq({cstr1,cstr2,...,cstrk}) или eq = optimeq([N1,N2,...,Nk]), для любой комбинации cstr и N аргументы, создает n cstr1-by- N2-by-... -by- n cstrk массив пустых оптимизационных равенств, где n cstr количество элементов в cstr.

Примеры

свернуть все

Создайте ограничения равенства для модели инвентаризации. Запас товаров в начале каждого периода равен запасу в конце предыдущего периода. В течение каждого периода запас увеличивается на 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 = optimeq(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;

Вместо использования цикла можно создать те же ограничения при помощи матричных операций над переменных.

stockbalance2 = optimeq(12, 1);
t = 2:12;
stockbalance2(t) = stock(t) == stock(t-1) + buy(t) - sell(t);
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

Создание ограничений в цикле может быть более длительным, чем создание ограничений с помощью матричных операций.

Создайте индексированные равенств для проблемы, которая включает доставку товаров между аэропортами. Во-первых, создайте индексы, представляющие аэропорты.

airports = ["LAX" "JFK" "ORD"];

Создайте индексы, представляющие товары, которые будут отправляться из одного аэропорта в другой.

goods = ["Electronics" "Foodstuffs" "Clothing" "Raw Materials"];

Создайте массив, дающий вес каждого модуля товара.

weights = [1 20 5 100];

Создайте массив переменных, представляющих количества товаров, которые будут отправляться из каждого аэропорта в аэропорт. quantities(airport1,airport2,goods) представляет количество goods отгружается из airport1 на airport2.

quantities = optimvar('quantities',airports,airports,goods,'LowerBound',0);

Создать ограничение равенства, что сумма весов грузов, отправляемых из каждого аэропорта, равна сумме весов грузов, отправляемых в аэропорт.

eq = optimeq(airports);
outweight = optimexpr(size(eq));
inweight = optimexpr(size(eq));
for i = 1:length(airports)
    temp = optimexpr;
    temp2 = optimexpr;
    for j = 1:length(airports)
        for k = 1:length(goods)
            temp = temp + quantities(i,j,k)*weights(k);
            temp2 = temp2 + quantities(j,i,k)*weights(k);
        end
    end
    outweight(i) = temp;
    inweight(i) = temp2;
    eq(i) = outweight(i) == inweight(i);
end

Исследуйте равенства.

show(eq)
(1, 'LAX')

  -quantities('JFK', 'LAX', 'Electronics')
- quantities('ORD', 'LAX', 'Electronics')
+ quantities('LAX', 'JFK', 'Electronics')
+ quantities('LAX', 'ORD', 'Electronics')
- 20*quantities('JFK', 'LAX', 'Foodstuffs')
- 20*quantities('ORD', 'LAX', 'Foodstuffs')
+ 20*quantities('LAX', 'JFK', 'Foodstuffs')
+ 20*quantities('LAX', 'ORD', 'Foodstuffs')
- 5*quantities('JFK', 'LAX', 'Clothing')
- 5*quantities('ORD', 'LAX', 'Clothing')
+ 5*quantities('LAX', 'JFK', 'Clothing')
+ 5*quantities('LAX', 'ORD', 'Clothing')
- 100*quantities('JFK', 'LAX', 'Raw Materials')
- 100*quantities('ORD', 'LAX', 'Raw Materials')
+ 100*quantities('LAX', 'JFK', 'Raw Materials')
+ 100*quantities('LAX', 'ORD', 'Raw Materials') == 0

(1, 'JFK')

  quantities('JFK', 'LAX', 'Electronics')
- quantities('LAX', 'JFK', 'Electronics')
- quantities('ORD', 'JFK', 'Electronics')
+ quantities('JFK', 'ORD', 'Electronics')
+ 20*quantities('JFK', 'LAX', 'Foodstuffs')
- 20*quantities('LAX', 'JFK', 'Foodstuffs')
- 20*quantities('ORD', 'JFK', 'Foodstuffs')
+ 20*quantities('JFK', 'ORD', 'Foodstuffs')
+ 5*quantities('JFK', 'LAX', 'Clothing')
- 5*quantities('LAX', 'JFK', 'Clothing')
- 5*quantities('ORD', 'JFK', 'Clothing')
+ 5*quantities('JFK', 'ORD', 'Clothing')
+ 100*quantities('JFK', 'LAX', 'Raw Materials')
- 100*quantities('LAX', 'JFK', 'Raw Materials')
- 100*quantities('ORD', 'JFK', 'Raw Materials')
+ 100*quantities('JFK', 'ORD', 'Raw Materials') == 0

(1, 'ORD')

  quantities('ORD', 'LAX', 'Electronics')
+ quantities('ORD', 'JFK', 'Electronics')
- quantities('LAX', 'ORD', 'Electronics')
- quantities('JFK', 'ORD', 'Electronics')
+ 20*quantities('ORD', 'LAX', 'Foodstuffs')
+ 20*quantities('ORD', 'JFK', 'Foodstuffs')
- 20*quantities('LAX', 'ORD', 'Foodstuffs')
- 20*quantities('JFK', 'ORD', 'Foodstuffs')
+ 5*quantities('ORD', 'LAX', 'Clothing')
+ 5*quantities('ORD', 'JFK', 'Clothing')
- 5*quantities('LAX', 'ORD', 'Clothing')
- 5*quantities('JFK', 'ORD', 'Clothing')
+ 100*quantities('ORD', 'LAX', 'Raw Materials')
+ 100*quantities('ORD', 'JFK', 'Raw Materials')
- 100*quantities('LAX', 'ORD', 'Raw Materials')
- 100*quantities('JFK', 'ORD', 'Raw Materials') == 0

Чтобы избежать вложенных for циклы, выражение равенств с помощью стандартных операторов MATLAB ®. Создайте массив уходящих количеств путем суммирования по индексам аэропорта прибытия. Выжать результат, чтобы удалить синглтонную размерность.

departing = squeeze(sum(quantities,2));

Вычислите веса уходящих количеств.

departweights = departing * weights';

Точно так же вычислите веса поступающих количеств.

arriving = squeeze(sum(quantities,1));
arriveweights = arriving*weights';

Создайте ограничения, чтобы отходящие веса равнялись приходящим весам.

eq2 = departweights == arriveweights;

Включите соответствующие имена индексов для равенств путем установки IndexNames свойство.

eq2.IndexNames = {airports,{}};

Отображение новых равенств. Обратите внимание, что они соответствуют предыдущим равенствам, но являются транспонированными векторами.

show(eq2)
('LAX', 1)

  -quantities('JFK', 'LAX', 'Electronics')
- quantities('ORD', 'LAX', 'Electronics')
+ quantities('LAX', 'JFK', 'Electronics')
+ quantities('LAX', 'ORD', 'Electronics')
- 20*quantities('JFK', 'LAX', 'Foodstuffs')
- 20*quantities('ORD', 'LAX', 'Foodstuffs')
+ 20*quantities('LAX', 'JFK', 'Foodstuffs')
+ 20*quantities('LAX', 'ORD', 'Foodstuffs')
- 5*quantities('JFK', 'LAX', 'Clothing')
- 5*quantities('ORD', 'LAX', 'Clothing')
+ 5*quantities('LAX', 'JFK', 'Clothing')
+ 5*quantities('LAX', 'ORD', 'Clothing')
- 100*quantities('JFK', 'LAX', 'Raw Materials')
- 100*quantities('ORD', 'LAX', 'Raw Materials')
+ 100*quantities('LAX', 'JFK', 'Raw Materials')
+ 100*quantities('LAX', 'ORD', 'Raw Materials') == 0

('JFK', 1)

  quantities('JFK', 'LAX', 'Electronics')
- quantities('LAX', 'JFK', 'Electronics')
- quantities('ORD', 'JFK', 'Electronics')
+ quantities('JFK', 'ORD', 'Electronics')
+ 20*quantities('JFK', 'LAX', 'Foodstuffs')
- 20*quantities('LAX', 'JFK', 'Foodstuffs')
- 20*quantities('ORD', 'JFK', 'Foodstuffs')
+ 20*quantities('JFK', 'ORD', 'Foodstuffs')
+ 5*quantities('JFK', 'LAX', 'Clothing')
- 5*quantities('LAX', 'JFK', 'Clothing')
- 5*quantities('ORD', 'JFK', 'Clothing')
+ 5*quantities('JFK', 'ORD', 'Clothing')
+ 100*quantities('JFK', 'LAX', 'Raw Materials')
- 100*quantities('LAX', 'JFK', 'Raw Materials')
- 100*quantities('ORD', 'JFK', 'Raw Materials')
+ 100*quantities('JFK', 'ORD', 'Raw Materials') == 0

('ORD', 1)

  quantities('ORD', 'LAX', 'Electronics')
+ quantities('ORD', 'JFK', 'Electronics')
- quantities('LAX', 'ORD', 'Electronics')
- quantities('JFK', 'ORD', 'Electronics')
+ 20*quantities('ORD', 'LAX', 'Foodstuffs')
+ 20*quantities('ORD', 'JFK', 'Foodstuffs')
- 20*quantities('LAX', 'ORD', 'Foodstuffs')
- 20*quantities('JFK', 'ORD', 'Foodstuffs')
+ 5*quantities('ORD', 'LAX', 'Clothing')
+ 5*quantities('ORD', 'JFK', 'Clothing')
- 5*quantities('LAX', 'ORD', 'Clothing')
- 5*quantities('JFK', 'ORD', 'Clothing')
+ 100*quantities('ORD', 'LAX', 'Raw Materials')
+ 100*quantities('ORD', 'JFK', 'Raw Materials')
- 100*quantities('LAX', 'ORD', 'Raw Materials')
- 100*quantities('JFK', 'ORD', 'Raw Materials') == 0

Создание ограничений в цикле может быть более длительным, чем создание ограничений с помощью матричных операций.

Входные параметры

свернуть все

Размер ограничительной размерности, заданный как положительное целое число.

  • Размер constr = optimeq(N) является N-by-1.

  • Размер constr = optimeq(N1,N2) является N1-by- N2.

  • Размер constr = optimeq(N1,N2,...,Nk) является N1-by- N2-by-... -by- Nk.

Пример: 5

Типы данных: double

Имена для индексации, заданные как массив ячеек из векторов символов или строковый вектор.

Пример: {'red','orange','green','blue'}

Пример: ["red";"orange";"green";"blue"]

Типы данных: string | cell

Выходные аргументы

свернуть все

Равенства, возвращенные как пустые OptimizationEquality массив. Использование eq чтобы инициализировать цикл, который создает равенства.

Для примера:

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

Совет

  • Вы можете использовать optimconstr вместо optimeq создать ограничения равенства для задач оптимизации или уравнений для задач уравнения.

Введенный в R2019b