Настройте линейную программу, основанную на проблеме

Преобразуйте задачу в форму решателя

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

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

Оставшаяся часть этого примера затронута только с преобразованием задачи к синтаксису решателя. Пример сопровождает видео Моделирование Оптимизации, Часть 2: основанное на проблеме Решение Математической модели.

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

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

  1. Получите полную идею проблемы

  2. Идентифицируйте цель (максимизация или минимизация чего-то)

  3. Идентифицируйте (назовите) переменные

  4. Идентифицируйте ограничения

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

  6. Задайте все величины в математическом обозначении

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

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

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

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

0.002614 HPS + 0.0239 PP + 0.009825 EP.

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

2500P1≤ 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

Самый дешевый метод управления заводом стоит 1207,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         11239
  • BF1, 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.

Похожие темы