Создание пустого массива оптимизации равенства
Использовать optimeq для инициализации набора выражений равенства.
Совет
Полный рабочий процесс см. в разделах Рабочий процесс оптимизации на основе задач или Рабочий процесс решения уравнений на основе проблем.
Создание ограничений равенства для инвентарной модели. Запас материала в начале каждого периода равен запасу в конце предыдущего периода. В течение каждого периода запас увеличивается на 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
Создание ограничений в цикле может занять больше времени, чем создание ограничений с помощью матричных операций.
N - Размер размера ограниченияРазмер размера ограничения, заданный как положительное целое число.
Размер constr = optimeq(N) является N-по-1.
Размер constr = optimeq(N1,N2) является N1около-N2.
Размер constr = optimeq(N1,N2,...,Nk) является N1около-N2-by-... -by-Nk.
Пример: 5
Типы данных: double
cstr - Имена для индексированияИмена для индексирования, заданные как массив ячеек символьных векторов или строковый вектор.
Пример: {'red','orange','green','blue'}
Пример: ["red";"orange";"green";"blue"]
Типы данных: string | cell
eq - РавенстваOptimizationEquality множествоРавенства, возвращенные как пустые 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 для создания ограничений равенства для задач оптимизации или уравнений для задач уравнений.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.