Этот пример показывает, как преобразовать задачу из математической формы в синтаксис решателя Optimization Toolbox™ с помощью основанного на решателе подхода. Пока задачей является линейная программа, методы применяются ко всем решателям.
Переменные и выражения в задаче представляют модель работы химического завода, из примера в Edgar и химмельблау [1]. Есть два видео, которые описывают проблему.
Математическое моделирование с оптимизацией, Часть 1 показывает задачу в живописной форме. Он показывает, как сгенерировать математические выражения образцового Описания из графика.
Моделирование оптимизации, Часть 2: Преобразование в форму решателя описывает, как преобразовать эти математические выражения в синтаксис решателя Optimization Toolbox. В этом видео показано, как решить проблему, и как интерпретировать результаты.
Оставшаяся часть этого примера касается исключительно преобразования задачи в синтаксис решателя. Пример внимательно следит за видео 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
Все переменные положительны.
Чтобы решить задачу оптимизации, выполните следующие шаги.
Шаги также показаны в видео Optimization Modeling, Part 2: Converting to Solver Form.
Чтобы найти подходящий решатель для этой задачи, смотрите Таблицу решений оптимизации. Таблица просит вас классифицировать задачу по типам целевой функции и типам ограничений. Для этой задачи целевая функция является линейной, и ограничения являются линейными. Таблица решений рекомендует использовать linprog
решатель.
Как вы видите в Задачах, Обрабатываемых Функциями Optimization Toolbox или linprog
страница с описанием функции, linprog
решатель решает задачи вида
(1) |
fTx означает вектор-строку констант f умножения вектора-столбца переменных x. Другими словами,
fTx = <reservedrangesplaceholder7> (1) x (1) + f (2) x (2) +... + f (<reservedrangesplaceholder2>) x (<reservedrangesplaceholder0>),
где n - длина f.
A x ≤ b представляет линейные неравенства. A является k -by - n матрицей, где k - количество неравенств, а n - количество переменных (размер x). b является вектором длины k. Для получения дополнительной информации см. «Ограничения линейного неравенства».
Aeq x = beq представляет линейные равенства. Aeq является m -by - n матрицей, где m - количество равенств, а n - количество переменных (размер x). beq является вектором длины m. Для получения дополнительной информации см. Раздел «Линейные Ограничения равенства».
<reservedrangesplaceholder5> ≤ <reservedrangesplaceholder4> ≤ <reservedrangesplaceholder3> означает, что каждый элемент в векторе x должен быть больше, чем соответствующий элемент lb и должен быть меньшим, чем соответствующий элемент 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
The 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.