Задачи линейного программирования

Сначала запишем условие производственной задачи из предыдущей главы:

Ресурс Изделие A Изделие B Сколько ресурса на складах
R1 1 3 15
R2 2 1 20
R3 3 2 35
Прибыль 5 10

А теперь попробуем записать систему ограничений нашей задачи и целевую функцию в виде неравенств. Обозначим за xA,xBxA,xB количество производимых изделий A и B, соответственно.

  • Сколько всего потребуется ресурса R1? Для изделия A необходима 1 единица данного ресурса, а для изделия B — 3 единицы. Всего, следовательно, необходимо 1xA+3xB1⋅xA+3⋅xB единиц. Так как у нас 15 единиц данного ресурса на складе, необходимо, чтобы это значение было не больше чем 15: 1xA+3xB151⋅xA+3⋅xB≤15
  • Сколько всего потребуется ресурса R2? Для изделия A необходимы 2 единицы данного ресурса, а для изделия B — 1 единица. Всего, следовательно, необходимо 2xA+1xB2⋅xA+1⋅xB единиц. Так как у нас 20 единиц данного ресурса на складе, необходимо, чтобы это значение было не больше чем 20: 2xA+1xB202⋅xA+1⋅xB≤20
  • Сколько всего потребуется ресурса R3? Для изделия A необходимы 3 единицы данного ресурса, а для изделия B — 2 единицы. Всего, следовательно, необходимо 3xA+2xB3⋅xA+2⋅xB единиц. Так как у нас 35 единиц данного ресурса на складе, необходимо, чтобы это значение было не больше чем 35: 3xA+2xB353⋅xA+2⋅xB≤35
  • Мы не можем производить отрицательное количество изделий. Следовательно, xA,xB0xA,xB≥0
  • В итоге мы получаем 5 единиц прибыли за каждое изделие A и 10 единиц за каждое изделие B. Всего мы получаем прибыли 5xA+10xB5⋅xA+10⋅xB. Естественно, мы хотим максимизировать данную величину. Можно записать, что F(xA,xB)=5xA+10xBmaxF(xA,xB)=5⋅xA+10⋅xB→max

 

Итак, у нас получилась система ограничений и целевая функция следующего вида:

⎧⎩⎨⎪⎪xA+3xB152xA+xB203xA+2xB35xA,xB0F(xA,xB)=5xA+10xBmax{xA+3xB≤152xA+xB≤203xA+2xB≤35xA,xB≥0F(xA,xB)=5xA+10xB→max

Чтобы решить данную задачу линейного программирования графическим методом, необходимо сначала превратить (мысленно) все неравенства в равенства, и на время забыть про целевую функцию. То есть, получить следующую систему:

⎧⎩⎨⎪⎪⎪⎪xA+3xB=152xA+xB=203xA+2xB=35xA=0xB=0{xA+3xB=152xA+xB=203xA+2xB=35xA=0xB=0

Мы получили пять уравнений с двумя переменными, следовательно, мы можем построить их графики. Например, мы можем направить ось с переменной xAxA вправо (где обычно у нас ось абсцисс) и ось с переменной xBxB вверх (где обычно у нас ось ординат). Для построения графиков нужно лишь выразить из этих уравнений xBxB. Сделаем это:

⎧⎩⎨⎪⎪⎪⎪3xB=15xAxB=202xA2xB=353xAxA=0xB=0{3xB=15−xAxB=20−2xA2xB=35−3xAxA=0xB=0
⎧⎩⎨⎪⎪⎪⎪⎪⎪xB=513xAxB=202xAxB=17,51,5xAxA=0xB=0{xB=5−13xAxB=20−2xAxB=17,5−1,5xAxA=0xB=0

Прежде чем строить графики, разберемся с последними двумя уравнениями, xA=0xA=0и xB=0xB=0. Эти уравнения выражают сами оси — абсцисс и ординат. А так как в исходных ограничениях были неравенства xA0xA≥0 и xB0xB≥0, то точка нашего решения должна быть правее и выше, чем эти оси — то есть, находиться в первой четверти. Поэтому эти две линии можно не строить, а просто учитывать, что решение в первой четверти.

Остальные линии мы построим на графике, и получим следующую картину (естественно, на нормальном графике не нужно рисовать такие стрелки, они лишь для наглядности, чтобы не перепутать линии друг с другом):

строим прямые ограничений

Каждая из этих линий разбивает область допустимых решений на две — одна находится правее и выше каждой из этих линий, вторая — левее и ниже. Какая из них нужна нам? Та, которая левее и ниже. Во-первых, в исходных неравенствах у нас был знак «меньше или равно», а левее и ниже как раз более маленькие значения переменных. А во-вторых, как мы говорили в предыдущем пункте, решение (0,0) вполне удовлетворяет условию задачи, хоть и не является оптимальным. А точка (0,0) — начало координат — расположена как раз левее и ниже каждой из прямых.

То есть, нам нужно найти область, расположенную левее и ниже, чем каждая из наших прямых. Отобразим ее:

выделяем область допустимых решений

Эта область, во-первых, расположена в первой четверти, как и должно быть, во-вторых, левее и ниже прямых xB=513xAxB=5−13xA и xB=202xAxB=20−2xA. Прямая xB=17,51,5xAxB=17,5−1,5xA оказалась не участвующей в решении, так иногда бывает, это не страшно.

Далее задачу можно решать двумя способами.

Основной способ

Рассмотрим первый из них. Для него нужно нарисовать линию нулевого дохода, то есть, линию, при которой целевая функция равна нулю: 5xA+10xB=05xA+10xB=0. Если упростить данное выражение, получим xB=0,5xAxB=−0,5xA. Построим эту функцию красным цветом, и уберем подписи. Она будет расположена не в первой четверти, это нормально.

строим линию уровня целевой функции

Эта линия состоит из точек, каждая из которых является решением, применяя которое, мы получим нулевой доход. Однако с тем условием, что xA,xB0xA,xB≥0, такое решение мы получаем всего одно — в точке (0,0) — остальные точки лежат во второй и четвертой четверти.

Что будет, если эту линию поднимать выше (параллельным переносом)? Мы получим линии, которые будут давать больший, чем 0 доход. Получается, чем выше мы поднимем данную линию, тем лучше. Однако совсем до бесконечности поднимать ее не получится, ведь она должна хотя бы касаться разрешенной области, обозначенной серым цветом (сейчас она касается только в точке (0,0)). Попробуем провести (пока на глаз) линии, параллельные данной, через оставшиеся три точки многоугольника:

двигаем линии уровня целевой функции

Мы нарисовали еще две линии, параллельные линии нулевого дохода, но расположенные выше. Средняя из них проходит через две точки нашего многоугольника с решениями, а самая высокая — через еще одну точку многоугольника. Кроме того, она вообще пересекает наш многоугольник в одной-единственной точке. И еще выше данную линию поднять нельзя — она вообще перестанет пересекать наш многоугольник. Следовательно, эта линия и есть «линия максимального дохода», а наше решение находится, как раз, в той точке, в которой эта линия пересекает нашу область допустимых решений — в точке пересечения линий xB=513xAxB=5−13xA и xB=202xAxB=20−2xA. Найдем координаты данной точки. Для этого приравняем эти два значения для xBxB:

513xA=202xA5−13xA=20−2xA
13xA+2xA=205−13xA+2xA=20−5
53xA=1553xA=15
5xA=455xA=45
xA=9xA=9
xB=2029=2018=2xB=20−2⋅9=20−18=2

Итак, наше решение находится в точке (9,2). Это означает, что необходимо производить 9 единиц изделия A и 2 единицы изделия B. При этом мы получим прибыль

F(xA,xB)=59+102=45+20=65F(xA,xB)=5⋅9+10⋅2=45+20=65

Во всех остальных точках многоугольника решений прибыль будет меньше.

Другой способ

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

обозначаем точки

Найдем координаты каждой из них. Координаты точки O мы знаем — (0,0). Координаты точки B мы нашли выше (по первому способу) — (9,2). Точка A — это точка на прямой xB=513xAxB=5−13xA, причем xA=0xA=0. Следовательно xB=5xB=5. То есть, ее координаты (0,5). Точка C — это точка на прямой xB=202xAxB=20−2xA, причем xB=0xB=0. То есть, 202xA=020−2xA=02xA=202xA=20xA=10xA=10. Следовательно, ее координаты (10,0).

Теперь найдем значение целевой функции в каждой из данных точек:

F(O)=F(0,0)=50+100=0+0=0F(O)=F(0,0)=5⋅0+10⋅0=0+0=0
F(A)=F(0,5)=50+105=0+50=50F(A)=F(0,5)=5⋅0+10⋅5=0+50=50
F(B)=F(9,2)=59+102=45+20=65F(B)=F(9,2)=5⋅9+10⋅2=45+20=65
F(C)=F(10,0)=510+100=50+0=50F(C)=F(10,0)=5⋅10+10⋅0=50+0=50

Действительно, в точке B наша функция принимает максимальное значение, равное 65. Это и есть максимальная прибыль, которую можно получить в данном случае.

А если товаров больше?

Как говорилось в предыдущем разделе, графическим способом можно решать только задачу для двух производимых товаров. Это потому, что если товаров будет больше двух, то и переменных будет больше двух, например, три — xA,xB,xCxA,xB,xC. И тогда придется строить трехмерный график, в котором запросто можно запутаться. А если переменных больше трех, то график не построить вообще. Однако специально для этих случаев был разработан еще один метод решения задач линейного программирования, и, в частности, производственной задачи — симплекс-метод, который мы рассмотрим в следующей главе.