Этот пример показывает, как преобразовать линейную задачу от математической формы в синтаксис решателя Optimization Toolbox™ с помощью основанного на проблеме подхода.
Переменные и выражения в проблеме представляют модель работы химическим заводом от примера в Эдгаре и Химмелбло [1]. Существует два видео, которые описывают проблему.
Математическое Моделирование с Оптимизацией, Часть 1 показывает проблему в графической форме. Это показывает, как сгенерировать математические выражения Образцового Описания от изображения.
Моделирование оптимизации, Часть 2: основанное на проблеме Решение Математической модели описывает, как преобразовать эти математические выражения в синтаксис решателя Optimization Toolbox. Это видео показывает, как решить проблему, и как интерпретировать результаты.
Остаток от этого примера затронут только с преобразованием проблемы к синтаксису решателя. Пример тесно следует за видео Моделированием Оптимизации, Частью 2: основанное на проблеме Решение Математической модели.
Видео Математическое Моделирование с Оптимизацией, Часть 1 предполагает, что один способ преобразовать проблему в математическую форму к:
Получите полную идею проблемы
Идентифицируйте цель (максимизация или минимизация чего-то)
Идентифицируйте (называют) переменные
Идентифицируйте ограничения
Определите, какими переменными можно управлять
Задайте все количества в математическом обозначении
Проверяйте модель на полноту и правильность
Для значения переменных в этом разделе смотрите видео Математическое Моделирование с Оптимизацией, Частью 1.
Задача оптимизации должна минимизировать целевую функцию согласно всем другим выражениям как ограничения.
Целевая функция:
0.002614 HPS + 0.0239 PP + 0.009825 EP.
Ограничения:
2500 ≤ P1 ≤ 6250
I1 ≤ 192,000
C ≤ 62,000
I1 - HE1 ≤ 132,000
I1 = LE1 + HE1 + C
1359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1
3000 ≤ P2 ≤ 9000
I2 ≤ 244,000
LE2 ≤ 142,000
I2 = LE2 + HE2
1359.8 I2 = 1267.8 HE2 + 1251.4 LE2 + 3413 P2
HPS = I1 + I2 + BF1
HPS = C + MPS + LPS
LPS = LE1 + LE2 + BF2
MPS = HE1 + HE2 + BF1 - BF2
P1 + P2 + PP ≥ 24,550
EP + PP ≥ 12,000
MPS ≥ 271,536
LPS ≥ 100,623
Все переменные положительны.
Первый метод решения включает создание переменной оптимизации для каждой проблемной переменной. Когда вы создаете переменные, включаете их границы.
P1 = optimvar('P1','LowerBound',2500,'UpperBound',6250); P2 = optimvar('P2','LowerBound',3000,'UpperBound',9000); I1 = optimvar('I1','LowerBound',0,'UpperBound',192000); I2 = optimvar('I2','LowerBound',0,'UpperBound',244000); C = optimvar('C','LowerBound',0,'UpperBound',62000); LE1 = optimvar('LE1','LowerBound',0); LE2 = optimvar('LE2','LowerBound',0,'UpperBound',142000); HE1 = optimvar('HE1','LowerBound',0); HE2 = optimvar('HE2','LowerBound',0); HPS = optimvar('HPS','LowerBound',0); MPS = optimvar('MPS','LowerBound',271536); LPS = optimvar('LPS','LowerBound',100623); BF1 = optimvar('BF1','LowerBound',0); BF2 = optimvar('BF2','LowerBound',0); EP = optimvar('EP','LowerBound',0); PP = optimvar('PP','LowerBound',0);
Создайте контейнер задачи оптимизации. Включайте целевую функцию в проблему.
linprob = optimproblem('Objective',0.002614*HPS + 0.0239*PP + 0.009825*EP);В выражениях задач существует три линейных неравенства:
I1 - HE1 ≤ 132,000
EP + PP ≥ 12,000
P1 + P2 + PP ≥ 24,550.
Создайте эти ограничения неравенства и включайте их в проблему.
linprob.Constraints.cons1 = I1 - HE1 <= 132000; linprob.Constraints.cons2 = EP + PP >= 12000; linprob.Constraints.cons3 = P1 + P2 + PP >= 24550;
Существует восемь линейных равенств:
I2 = LE2 + HE2
LPS = LE1 + LE2 + BF2
HPS = I1 + I2 + BF1
HPS = C + MPS + LPS
I1 = LE1 + HE1 + C
MPS = HE1 + HE2 + BF1 - BF2
1359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1
1359.8 I2 = 1267.8 HE2 + 1251.4 LE2 + 3413 P2.
Включайте эти ограничения также.
linprob.Constraints.econs1 = LE2 + HE2 == I2; linprob.Constraints.econs2 = LE1 + LE2 + BF2 == LPS; linprob.Constraints.econs3 = I1 + I2 + BF1 == HPS; linprob.Constraints.econs4 = C + MPS + LPS == HPS; linprob.Constraints.econs5 = LE1 + HE1 + C == I1; linprob.Constraints.econs6 = HE1 + HE2 + BF1 == BF2 + MPS; linprob.Constraints.econs7 = 1267.8*HE1 + 1251.4*LE1 + 192*C + 3413*P1 == 1359.8*I1; linprob.Constraints.econs8 = 1267.8*HE2 + 1251.4*LE2 + 3413*P2 == 1359.8*I2;
Проблемная формулировка завершена. Решите проблему с помощью solve.
linsol = solve(linprob);
Optimal solution found.
Выполните целевую функцию. (Вы, возможно, попросили это значение, когда вы вызвали solve.)
evaluate(linprob.Objective,linsol)
ans = 1.2703e+03
Самый дешевый метод работы объектом стоит 1 207,30$.
Исследуйте значения переменных решения.
tbl = struct2table(linsol)
tbl =
1×16 table
BF1 BF2 C EP HE1 HE2 HPS I1 I2 LE1 LE2 LPS MPS P1 P2 PP
___ ___ ______ ______ __________ __________ __________ __________ ________ ___ __________ __________ __________ ____ ______ _____
0 0 8169.7 760.71 1.2816e+05 1.4338e+05 3.8033e+05 1.3633e+05 2.44e+05 0 1.0062e+05 1.0062e+05 2.7154e+05 6250 7060.7 11239
Эта таблица слишком широка, чтобы видеть легко. Сложите переменные, чтобы получить их к вертикальной ориентации.
vars = {'P1','P2','I1','I2','C','LE1','LE2','HE1','HE2',...
'HPS','MPS','LPS','BF1','BF2','EP','PP'};
outputvars = stack(tbl,vars,'NewDataVariableName','Amt','IndexVariableName','Var')outputvars =
16×2 table
Var Amt
___ __________
P1 6250
P2 7060.7
I1 1.3633e+05
I2 2.44e+05
C 8169.7
LE1 0
LE2 1.0062e+05
HE1 1.2816e+05
HE2 1.4338e+05
HPS 3.8033e+05
MPS 2.7154e+05
LPS 1.0062e+05
BF1 0
BF2 0
EP 760.71
PP 11239BF1, BF2 и LE1 является 0, их нижние границы.
I2 является 244,000, его верхняя граница.
Ненулевые компоненты целевой функции (стоимость)
HPS — 380,328.74
PP — 11,239.29
EP — 760.71
Видео Моделирование Оптимизации, Часть 2: основанное на проблеме Решение Математической модели дает интерпретации этих характеристик с точки зрения исходной проблемы.
Также можно решить проблему, использующую всего одну переменную оптимизации, которая имеет индексы с именами проблемных переменных. Этот метод позволяет вам дать нижнюю границу нуля ко всем проблемным переменным целиком.
vars = {'P1','P2','I1','I2','C','LE1','LE2','HE1','HE2',...
'HPS','MPS','LPS','BF1','BF2','EP','PP'};
x = optimvar('x',vars,'LowerBound',0);Включайте границы на переменных с помощью записи через точку.
x('P1').LowerBound = 2500; x('P2').LowerBound = 3000; x('MPS').LowerBound = 271536; x('LPS').LowerBound = 100623; x('P1').UpperBound = 6250; x('P2').UpperBound = 9000; x('I1').UpperBound = 192000; x('I2').UpperBound = 244000; x('C').UpperBound = 62000; x('LE2').UpperBound = 142000;
Остаток от настройки задач подобен настройке с помощью отдельных переменных. Различие - то, что, вместо того, чтобы обратиться к переменной ее именем, таким как P1, вы обращаетесь к нему с помощью ее индекса, x('P1').
Создайте проблемный объект, включайте линейные ограничения и решите проблему.
linprob = optimproblem('Objective',0.002614*x('HPS') + 0.0239*x('PP') + 0.009825*x('EP')); linprob.Constraints.cons1 = x('I1') - x('HE1') <= 132000; linprob.Constraints.cons2 = x('EP') + x('PP') >= 12000; linprob.Constraints.cons3 = x('P1') + x('P2') + x('PP') >= 24550; linprob.Constraints.econs1 = x('LE2') + x('HE2') == x('I2'); linprob.Constraints.econs2 = x('LE1') + x('LE2') + x('BF2') == x('LPS'); linprob.Constraints.econs3 = x('I1') + x('I2') + x('BF1') == x('HPS'); linprob.Constraints.econs4 = x('C') + x('MPS') + x('LPS') == x('HPS'); linprob.Constraints.econs5 = x('LE1') + x('HE1') + x('C') == x('I1'); linprob.Constraints.econs6 = x('HE1') + x('HE2') + x('BF1') == x('BF2') + x('MPS'); linprob.Constraints.econs7 = 1267.8*x('HE1') + 1251.4*x('LE1') + 192*x('C') + 3413*x('P1') == 1359.8*x('I1'); linprob.Constraints.econs8 = 1267.8*x('HE2') + 1251.4*x('LE2') + 3413*x('P2') == 1359.8*x('I2'); [linsol,fval] = solve(linprob);
Optimal solution found.
Исследуйте решение как вертикальную таблицу.
tbl = table(vars',linsol.x')
tbl =
16×2 table
Var1 Var2
_____ __________
'P1' 6250
'P2' 7060.7
'I1' 1.3633e+05
'I2' 2.44e+05
'C' 8169.7
'LE1' 0
'LE2' 1.0062e+05
'HE1' 1.2816e+05
'HE2' 1.4338e+05
'HPS' 3.8033e+05
'MPS' 2.7154e+05
'LPS' 1.0062e+05
'BF1' 0
'BF2' 0
'EP' 760.71
'PP' 11239[1] Эдгар, Томас Ф. и Дэвид М. Химмелбло. Оптимизация химических процессов. McGraw-Hill, Нью-Йорк, 1988.