exponenta event banner

Настройка линейной программы на основе решателя

Преобразовать проблему в форму решателя

В этом примере показано, как преобразовать задачу из математической формы в синтаксис решателя Optimization Toolbox™ с использованием подхода, основанного на решателе. В то время как задача является линейной программой, методы применяются ко всем решателям.

Переменные и выражения в задаче представляют собой модель работы химического завода, из примера в Эдгаре и Химмельблау [1]. Есть два видео, которые описывают проблему.

В остальном этот пример касается только преобразования задачи в синтаксис решателя. Пример полностью соответствует видео Optimization Modeling, Part 2: Converting to Solver Form. Основное отличие видео от примера состоит в том, что в этом примере показано, как использовать именованные переменные или индексные переменные, похожие на хэш-ключи. Это различие заключается в объединении переменных в один вектор.

Описание модели

В видео Математическое моделирование с оптимизацией, Часть 1 предполагает, что одним из способов преобразования задачи в математическую форму является:

  1. Получить общее представление о проблеме

  2. Определение цели (максимизация или минимизация чего-либо)

  3. Определение (наименование) переменных

  4. Определение ограничений

  5. Определение переменных, которыми можно управлять

  6. Указать все величины в математической нотации

  7. Проверить модель на полноту и правильность

Значение переменных в этом разделе см. в видео Математическое моделирование с оптимизацией, часть 1.

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

Целевая функция:

0.002614 HPS + 0.0239 PP + 0.009825 EP.

Ограничения:

2500P16250
I1192,000
C62,000
I1 - HE1132,000
I1 = LE1 + HE1 + C
1359.8 I1 = 1267.8 HE1 + 1251.4 LE1 + 192 C + 3413 P1
3000P29000
I2244,000
LE2142,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 + PP24,550
EP + PP12,000
MPS271,536
LPS100,623
Все переменные являются положительными.

Метод решения

Чтобы решить проблему оптимизации, выполните следующие действия.

Шаги также показаны в видеоролике «Оптимизация моделирования, часть 2: преобразование в форму решателя».

Выбор решателя

Чтобы найти подходящий решатель для этой проблемы, обратитесь к Таблице решений оптимизации (Optimization Decision Table). В таблице предлагается классифицировать проблему по типу целевой функции и типам ограничений. Для этой задачи целевая функция является линейной, а ограничения - линейными. В таблице решений рекомендуется использовать linprog решатель.

Как показано в разделе Проблемы, обрабатываемые функциями панели инструментов оптимизации или linprog справочная страница функции, linprog решатель решает задачи формы

minxfTx такой , что {A⋅x≤b,Aeq⋅x=beq,lb≤x≤ub.(1)
  • fTx означает вектор строки констант f, умножающий вектор столбца переменных x. Другими словами,

    fTx = f (1) x (1) + f (2) x (2) +... + f (n) x (n),

    где n - длина f.

  • А xb представляет линейные неравенства. A - матрица k-by-n, где k - число неравенств, а n - число переменных (размер x). b - вектор длины k. Дополнительные сведения см. в разделе Ограничения линейного неравенства.

  • Aeq x = beq представляет линейные равенства. Aeq - матрица m-на-n, где m - число уравнений, а n - число переменных (размер x). beq - вектор длины м. Дополнительные сведения см. в разделе Ограничения линейного равенства.

  • 1bxub означает, что каждый элемент в векторе 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.

Ограничения, связанные с записью

В уравнениях описания модели имеются четыре переменные с нижними границами и шесть с верхними. Нижние границы:

P12500
P23000
MPS271,536
LPS100,623.

Кроме того, все переменные являются положительными, что означает, что они имеют нижнюю границу нуля.

Создание вектора нижней границы lb как вектор 0затем добавьте четыре других нижних границы.

lb = zeros(size(variables));
lb([P1,P2,MPS,LPS]) = ...
    [2500,3000,271536,100623];

Переменные с верхними границами:

P16250
P29000
I1192,000
I2244,000
C62,000
LE2142000.

Создайте вектор верхней границы как вектор Infзатем добавьте шесть верхних границ.

ub = Inf(size(variables));
ub([P1,P2,I1,I2,C,LE2]) = ...
   [6250,9000,192000,244000,62000,142000];

Запись ограничений линейного неравенства

Существует три линейных неравенства в уравнениях описания модели:

I1 - HE1132,000
EP + PP12,000
P1 + P2 + PP24,550.

Чтобы иметь уравнения в виде A x≤b, поместите все переменные в левой части неравенства. Все эти уравнения уже имеют такую форму. Обеспечить, чтобы каждое неравенство находилось в форме «меньше» путем умножения на -1, где это целесообразно:

I1 - HE1132,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

Теперь у вас есть входные данные, требуемые 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 векторы

    • HPS380,328.74

    • PP11,239.29

    • EP760.71

Видео Optimization Modeling, Part 2: Converting to Solver Form дает интерпретацию этих характеристик с точки зрения исходной задачи.

Библиография

[1] Эдгар, Томас Ф. и Дэвид М. Химмельблау. Оптимизация химических процессов. Макгроу-Хилл, Нью-Йорк, 1988 год.

Связанные темы