В этом примере показано, как преобразовать задачу из математической формы в синтаксис решателя Optimization Toolbox™ с использованием подхода, основанного на решателе. В то время как задача является линейной программой, методы применяются ко всем решателям.
Переменные и выражения в задаче представляют собой модель работы химического завода, из примера в Эдгаре и Химмельблау [1]. Есть два видео, которые описывают проблему.
Математическое моделирование с оптимизацией, часть 1 показывает проблему в графической форме. В нем показано, как создать математические выражения описания модели на основе рисунка.
Моделирование оптимизации, деталь 2: Преобразование в форму решателя описывает, как преобразовать эти математические выражения в синтаксис решателя панели инструментов оптимизации. В этом видео показано, как решить проблему и как интерпретировать результаты.
В остальном этот пример касается только преобразования задачи в синтаксис решателя. Пример полностью соответствует видео Optimization Modeling, Part 2: Converting to Solver Form. Основное отличие видео от примера состоит в том, что в этом примере показано, как использовать именованные переменные или индексные переменные, похожие на хэш-ключи. Это различие заключается в объединении переменных в один вектор.
В видео Математическое моделирование с оптимизацией, Часть 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
Все переменные являются положительными.
Чтобы решить проблему оптимизации, выполните следующие действия.
Шаги также показаны в видеоролике «Оптимизация моделирования, часть 2: преобразование в форму решателя».
Чтобы найти подходящий решатель для этой проблемы, обратитесь к Таблице решений оптимизации (Optimization Decision Table). В таблице предлагается классифицировать проблему по типу целевой функции и типам ограничений. Для этой задачи целевая функция является линейной, а ограничения - линейными. В таблице решений рекомендуется использовать linprog решатель.
Как показано в разделе Проблемы, обрабатываемые функциями панели инструментов оптимизации или linprog справочная страница функции, linprog решатель решает задачи формы
| (1) |
fTx означает вектор строки констант f, умножающий вектор столбца переменных x. Другими словами,
fTx = f (1) x (1) + f (2) x (2) +... + f (n) x (n),
где n - длина f.
А x ≤ b представляет линейные неравенства. A - матрица k-by-n, где k - число неравенств, а n - число переменных (размер x). b - вектор длины k. Дополнительные сведения см. в разделе Ограничения линейного неравенства.
Aeq x = beq представляет линейные равенства. Aeq - матрица m-на-n, где m - число уравнений, а n - число переменных (размер x). beq - вектор длины м. Дополнительные сведения см. в разделе Ограничения линейного равенства.
1b ≤ x ≤ ub означает, что каждый элемент в векторе x должен быть больше соответствующего элемента 1b и должен быть меньше соответствующего элемента ub. Дополнительные сведения см. в разделе Ограничения границ.
Синтаксис linprog решатель, как показано на его справочной странице функции,
[x fval] = linprog(f,A,b,Aeq,beq,lb,ub);
Входные данные для linprog решатель - это матрицы и векторы в уравнении 1.
В уравнениях описания модели 16 переменных. Поместите эти переменные в один вектор. Имя вектора переменных - x в уравнении 1. Определите порядок и создайте компоненты x из переменных.
Следующий код конструирует вектор с использованием массива имен ячеек для переменных.
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1',...
'BF2','HPS','MPS','LPS','P1','P2','PP','EP'};
N = length(variables);
% create variables for indexing
for v = 1:N
eval([variables{v},' = ', num2str(v),';']);
endПри выполнении этих команд в рабочей области создаются следующие именованные переменные:

Эти именованные переменные представляют индексные номера для компонентов x. Создавать именованные переменные не требуется. На видео Optimization Modeling, Part 2: Converting to Solver Form показано, как решить проблему с помощью индексных номеров компонентов x.
В уравнениях описания модели имеются четыре переменные с нижними границами и шесть с верхними. Нижние границы:
P1 ≥ 2500
P2 ≥ 3000
MPS ≥ 271,536
LPS ≥ 100,623.
Кроме того, все переменные являются положительными, что означает, что они имеют нижнюю границу нуля.
Создание вектора нижней границы lb как вектор 0затем добавьте четыре других нижних границы.
lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = ...
[2500,3000,271536,100623];Переменные с верхними границами:
P1 ≤ 6250
P2 ≤ 9000
I1 ≤ 192,000
I2 ≤ 244,000
C ≤ 62,000
LE2 ≤ 142000.
Создайте вектор верхней границы как вектор Infзатем добавьте шесть верхних границ.
ub = Inf(size(variables)); ub([P1,P2,I1,I2,C,LE2]) = ... [6250,9000,192000,244000,62000,142000];
Существует три линейных неравенства в уравнениях описания модели:
I1 - HE1 ≤ 132,000
EP + PP ≥ 12,000
P1 + P2 + PP ≥ 24,550.
Чтобы иметь уравнения в виде A x≤b, поместите все переменные в левой части неравенства. Все эти уравнения уже имеют такую форму. Обеспечить, чтобы каждое неравенство находилось в форме «меньше» путем умножения на -1, где это целесообразно:
I1 - HE1 ≤ 132,000
-EP - PP ≤ -12,000
-P1 - P2 - PP ≤ -24,550.
В рабочей области MATLAB ® создайте A матрица как нулевая матрица 3 на 16, соответствующая 3 линейным неравенствам в 16 переменных. Создать b вектор с тремя компонентами.
A = zeros(3,16); A(1,I1) = 1; A(1,HE1) = -1; b(1) = 132000; A(2,EP) = -1; A(2,PP) = -1; b(2) = -12000; A(3,[P1,P2,PP]) = [-1,-1,-1]; b(3) = -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.
Чтобы иметь уравнения в виде Aeq x = beq, поместите все переменные на одной стороне уравнения. Уравнения становятся:
LE2 + HE2 - I2 = 0
LE1 + LE2 + BF2 - LPS = 0
I1 + I2 + BF1 - HPS = 0
C + MPS + LPS - HPS = 0
LE1 + HE1 + C - I1 = 0
HE1 + HE2 + BF1 - BF2 - MPS = 0
1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1 - 1359.8 I1 = 0
1267.8 HE2 + 1251.4 LE2 + 3413 P2 - 1359.8 I2 = 0.
Теперь напишите Aeq матрица и beq вектор, соответствующий этим уравнениям. В рабочей области MATLAB создайте Aeq матрица как нулевая матрица 8 на 16, соответствующая 8 линейным уравнениям в 16 переменных. Создать beq вектор с восемью компонентами, все нулевые.
Aeq = zeros(8,16); beq = zeros(8,1); Aeq(1,[LE2,HE2,I2]) = [1,1,-1]; Aeq(2,[LE1,LE2,BF2,LPS]) = [1,1,1,-1]; Aeq(3,[I1,I2,BF1,HPS]) = [1,1,1,-1]; Aeq(4,[C,MPS,LPS,HPS]) = [1,1,1,-1]; Aeq(5,[LE1,HE1,C,I1]) = [1,1,1,-1]; Aeq(6,[HE1,HE2,BF1,BF2,MPS]) = [1,1,1,-1,-1]; Aeq(7,[HE1,LE1,C,P1,I1]) = [1267.8,1251.4,192,3413,-1359.8]; Aeq(8,[HE2,LE2,P2,I2]) = [1267.8,1251.4,3413,-1359.8];
Целевая функция:
fTx = 0.002614 HPS + 0.0239 PP + 0.009825 EP.
Записать это выражение как вектор f умножителей вектора x:
f = zeros(size(variables)); f([HPS PP EP]) = [0.002614 0.0239 0.009825];
Теперь у вас есть входные данные, требуемые linprog решатель. Вызовите решатель и распечатайте выходные данные в форматированном виде:
options = optimoptions('linprog','Algorithm','dual-simplex');
[x fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
for d = 1:N
fprintf('%12.2f \t%s\n',x(d),variables{d})
end
fvalРезультат:
Optimal solution found.
136328.74 I1
244000.00 I2
128159.00 HE1
143377.00 HE2
0.00 LE1
100623.00 LE2
8169.74 C
0.00 BF1
0.00 BF2
380328.74 HPS
271536.00 MPS
100623.00 LPS
6250.00 P1
7060.71 P2
11239.29 PP
760.71 EP
fval =
1.2703e+03 fval вывод дает наименьшее значение целевой функции в любой возможной точке.
Вектор решения x - точка, в которой целевая функция имеет наименьшее значение. Обратите внимание, что:
BF1, BF2, и LE1 являются 0, их нижние границы.
I2 является 244,000, его верхняя граница.
Ненулевые компоненты f векторы
HPS — 380,328.74
PP — 11,239.29
EP — 760.71
Видео Optimization Modeling, Part 2: Converting to Solver Form дает интерпретацию этих характеристик с точки зрения исходной задачи.
[1] Эдгар, Томас Ф. и Дэвид М. Химмельблау. Оптимизация химических процессов. Макгроу-Хилл, Нью-Йорк, 1988 год.