Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js
МатБюро Учебник по МОР Симплексное решение производственной задачи

Симплекс-метод решения производственной задачи

Постановка задачи

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

Ресурс Изделие A Изделие B Изделие C Сколько ресурса на складах
R1 1 2 3 35
R2 2 3 2 45
R3 3 1 1 40
Прибыль 4 5 6  

Точно так же, как в предыдущем пункте, попробуем записать систему ограничений нашей задачи и целевую функцию в виде неравенств. Обозначим за xA,xB и xC количество производимых изделий A, B и C, соответственно. Больше не будем расписывать весь процесс подробно, покажем лишь получение первого ограничения

Сколько всего потребуется ресурса R1? Для изделия A необходима 1 единица данного ресурса, для изделия B - 2 единицы, а для изделия C - 3 единицы. Всего, следовательно, необходимо 1xA+2xB+3xC единиц. Так как у нас 35 единиц данного ресурса на складе, необходимо, чтобы это значение было не больше чем 35: 1xA+2xB+3xC35

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

{xA+2xB+3xC352xA+3xB+2xC453xA+xB+xC40xA,xB,xC0F(xA,xB,xC)=4xA+5xB+6xCmax
Понравилось? Добавьте в закладки

Начинаем решение задачи симплекс-методом

Чтобы начать решать производственную задачу симплекс-методом, необходимо, как и в случае графического метода, наши неравенства превратить в равенства. Рассмотрим первое неравенство:

xA+2xB+3xC35

Что означает это выражение? Оно означает, что количество потребляемых ресурсов R1 не должно быть больше количества, которое у нас на складе. Но оно вполне может быть и меньше, например, 30. Тогда некоторое количество ресурсов останется на складе неиспользованными. Обозначим это число (обратите внимание, оно не должно быть меньше нуля) за x1. Если его добавить к числу использованных ресурсов, должно получиться ровно 35:

xA+2xB+3xC+x1=35

Точно так же, добавим переменные x2 и x3 (число оставшихся на складе ресурсов вида R2 и R3) ко второму и третьему ограничениям. В итоге получим следующую систему ограничений:

{xA+2xB+3xC+x1=352xA+3xB+2xC+x2=453xA+xB+xC+x3=40xA,xB,xC,x1,x2,x30F(xA,xB,xC)=4xA+5xB+6xCmax

Так как симплекс-метод представляет собой итерационный метод, - он умеет только последовательно улучшать уже найденное решение, но не находить его, на первом этапе нам необходимо найти какое-то начальное решение.

Начальное решение может быть любое, но должно удовлетворять ограничениям задачи. Если мы записали производственную задачу в форме, приведенной выше, начальное решение найти очень просто. Это решение с нулевым доходом, когда мы ничего не производим. То есть, xA,xB,xC=0. При этом у нас не тратится ни одного ресурса со склада, следовательно, x1=35,x2=45,x3=40. Такое решение можно записать в виде (0,0,0,35,45,40) - то есть, в скобках просто последовательно перечислить переменные (сначала "основные", а потом "введенные нами").

После того, как мы это сделали, необходимо составить симплекс-таблицу. У нее будут следующие параметры:

  1. Чтобы найти число столбцов данной таблицы, необходимо прибавить 2 к общему числу переменных нашей задачи. В нашей задаче 6 переменных - xA,xB,xC,x1,x2,x3, следовательно, наша таблица будет иметь 8 столбцов.
  2. Чтобы найти число строк данной таблицы, необходимо прибавить 2 к числу переменных начального решения, не равных нулю. В начальном решении три переменных не равно нулю - x1,x2,x3, следовательно, наша таблица будет иметь 5 строк.

Построим данную таблицу. В первой строке запишем наши переменные, а в первом столбце - переменные, не равные нулю (они будут в дальнейшем называться "базисные"):

  xA xB xC x1 x2 x3 B
x1              
x2              
x3              
F              

Заполнять эту таблицу очень просто. Чтобы заполнить все столбцы, кроме последнего, и все строки, кроме последней, необходимо подставить в клетки таблицы коэффициенты в соответствующих ограничениях. Например, в строку x2 и столбец xC необходимо поставить цифру 2 - так как, если рассмотреть ограничение номер 2 - как раз то, в которое входит переменная x2 -

2xA+3xB+2xC+x2=45

То переменная xC входит в это уравнение с коэффициентом 2. В строку x3 и столбец x2 необходимо поставить цифру 0 - так как, если рассмотреть ограничение номер 3 - как раз то, в которое входит переменная x3 -

3xA+xB+xC+x3=40

То переменная x2 вообще не входит в это уравнение, то есть, входит в это уравнение с коэффициентом 0. В строку x3 и столбец x3 необходимо поставить цифру 1 - так как, если рассмотреть ограничение номер 3 - как раз то, в которое входит переменная x3 -

3xA+xB+xC+x3=40

То переменная x3 входит в это уравнение с коэффициентом 1. Заполним подобным образом все коэффициенты:

  xA xB xC x1 x2 x3 B
x1 1 2 3 1 0 0  
x2 2 3 2 0 1 0  
x3 3 1 1 0 0 1  
F              

В последний столбец заносим свободные члены соответствующих ограничений:

  xA xB xC x1 x2 x3 B
x1 1 2 3 1 0 0 35
x2 2 3 2 0 1 0 45
x3 3 1 1 0 0 1 40
F              

И, наконец, в последнюю строку записываем коэффициенты целевой функции при соответствующих переменных с противоположным знаком. Как можно видеть из выражения нашей целевой функции -

F(xA,xB,xC)=4xA+5xB+6xCmax

Она не зависит от переменных x1,x2,x3, следовательно, в этих столбцах необходимо поставить нули. Кроме того, в правую нижнюю клетку ставим текущее значение целевой функции. Так как мы пока ничего не производим, значит и прибыли не получаем, и значение целевой функции равно нулю.

  xA xB xC x1 x2 x3 B
x1 1 2 3 1 0 0 35
x2 2 3 2 0 1 0 45
x3 3 1 1 0 0 1 40
F -4 -5 -6 0 0 0 0

Обратите внимание на клетки таблицы, выделенные жирным. В каждом столбце у нас один из коэффициентов - единица, а остальные нули. Таких столбцов на любом этапе решения у нас должно быть столько, сколько в задаче ограничений, то есть, в нашем случае, три. Причем единички должны быть на пересечении одинаковых столбца и строки, то есть, как в нашем случае, x1x1, x2x2, x3x3.

Итерация 1

Дальнейший процесс решения задачи симплекс-методом итеративен, то есть, мы повторяем некоторый набор действий (итераций) несколько раз. Но прежде чем выполнять очередную итерацию, необходимо проверить, может быть, наше решение уже идеально, и ничего делать не надо? Для этого необходимо проверить, есть ли в последней строке отрицательные элементы. Есть. Их три. Следовательно, наше решение не оптимально.

Выберем самое большое по модулю отрицательное значение -6 в столбце xC, эту переменную необходимо добавить к нашему базису (то есть, ввести ее в одну из строк слева). Но тогда одну из переменных текущего базиса (x1,x2,x3) необходимо убрать. Чтобы узнать, какую, необходимо найти для каждой базисной переменной (каждой строки) отношение свободного члена (значения в столбце B) к коэффициенту в строке xC (переменной, которую, как мы решили выше, необходимо ввести в базис). Обратите внимание, что это отношение должно существовать, и оно должно быть положительно. Если это не так, мы просто пропускаем соответствующую строку

  xA xB xC x1 x2 x3 B BxC
x1 1 2 3 1 0 0 35 35311,67
x2 2 3 2 0 1 0 45 452=22,5
x3 3 1 1 0 0 1 40 401=40
F -4 -5 -6 0 0 0 0  

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

  xA xB xC x1 x2 x3 B
  13 23 1 13 0 0 353
x2 2 3 2 0 1 0 45
x3 3 1 1 0 0 1 40
F -4 -5 -6 0 0 0 0

Обратите внимание, из первой строки исчезло название строки - x1. Это потому, что x1 - больше не базисная переменная. Она была бы базисной, если бы был столбец x1, в котором была бы одна единица, а остальные нули. Но такого столбца больше нет. Теперь первая строка не выражает никакой базисной переменной. Нам же необходимо, чтобы базисной стала переменная xC. Первое требование к базисным переменным для нее выполняется - есть столбец xC, и у него в первой строке число 1. Но вот остальные числа не равны нулю. Так давайте их сделаем такими.

  1. Чтобы во второй строке, в столбце xC число 2 превратить в ноль, вычтем из второй строки две первых.
  2. Чтобы в третьей строке, в столбце xC число 1 превратить в ноль, вычтем из третьей строки первую.
  3. Чтобы в последней строке, в столбце xC число -6 превратить в ноль, добавим к последней строке шесть первых.
  xA xB xC x1 x2 x3 B
xC 13 23 1 13 0 0 353
x2 2213 3223 221 0213 120 020 452353
x3 313 123 1-1 013 0-0 1-0 40353
F 4+613 5+623 6+61 0+613 0+60 0+60 0+6353

Проводим математические действия и получаем итоговую таблицу.

  xA xB xC x1 x2 x3 B
xC 13 23 1 13 0 0 353
x2 43 53 0 23 1 0 653
x3 83 13 0 13 0 1 853
F -2 -1 0 2 0 0 70

Теперь первая строка у нас выражает базисную переменную xC, так как действительно, в столбце xC одно значение равно 1, а остальные - 0. Итерация выполнена.

Итерация 2

Хорошо. Итерация 1 закончена, начинаем такую же итерацию 2. Прежде чем выполнять очередную итерацию, необходимо проверить, идеально ли наше решение? В последней строке есть отрицательные элементы, следовательно, наше решение не оптимально.

Выберем самое большое по модулю отрицательное значение -2 в столбце xA, эту переменную необходимо добавить к нашему базису, а одну из переменных текущего базиса (xC,x2,x3) необходимо убрать. Чтобы узнать, какую, необходимо найти для каждой базисной переменной отношение свободного члена к коэффициенту в строке xA (переменной, которую, как мы решили выше, необходимо ввести в базис). Обратите внимание, что это отношение должно существовать, и оно должно быть положительно. Если это не так, мы просто пропускаем соответствующую строку

  xA xB xC x1 x2 x3 B BxA
xC 13 23 1 13 0 0 353 353:13=35
x2 43 53 0 23 1 0 653 653:43=654=16,25
x3 83 13 0 13 0 1 853 853:83=858=10,625
F -2 -1 0 2 0 0 70  

Мы нашли отношения для каждой строки, и для переменной x3 отношение получилось наименьшим. Поэтому именно данную переменную необходимо убрать из базиса, заменив, как мы определили выше, переменной xA. Прежде всего, найдем значение элемента на пересечении найденной строки и найденного столбца. Он равен 83. И нам нужно всю найденную строку на этот элемент поделить:

  xA xB xC x1 x2 x3 B
xC 13 23 1 13 0 0 353
x2 43 53 0 23 1 0 653
  1 18 0 18 0 38 858
F -2 -1 0 2 0 0 70

Из третьей строки исчезло название строки - x3. Это потому, что x3 - больше не базисная переменная. Нам же необходимо, чтобы базисной стала переменная xA. Первое требование к базисным переменным для нее выполняется - есть столбец xA, и у него в третьей строке число 1. Но вот остальные числа не равны нулю. Так давайте их сделаем такими.

  1. Чтобы в первой строке, в столбце xA число 13 превратить в ноль, вычтем из первой строки третью, умноженную на 13.
  2. Чтобы во второй строке, в столбце xA число 43 превратить в ноль, вычтем из второй строки третью, умноженную на 43
  3. Чтобы в последней строке, в столбце xA число -2 превратить в ноль, добавим к последней строке две третьих.
  xA xB xC x1 x2 x3 B
xC 13131 231318 1130 1313(18) 0130 01338 35313858
x2 43431 534318 0430 2343(18) 1430 04338 65343858
  1 18 0 18 0 38 858
F 2+21 1+218 0+20 2+2(18) 0+20 0+238 70+2858

Проводим математические действия и получаем итоговую таблицу.

  xA xB xC x1 x2 x3 B
xC 0 58 1 38 0 18 658
x2 0 32 0 12 1 12 152
xA 1 18 0 18 0 38 858
F 0 34 0 74 0 34 3654

Теперь третья строка у нас выражает базисную переменную xA, так как действительно, в столбце xA одно значение равно 1, а остальные - 0. Итерация выполнена.

Итерация 3

Итерация 2 закончена, начинаем такую же итерацию 3. Прежде чем выполнять очередную итерацию, необходимо проверить, идеально ли наше решение? В последней строке есть отрицательный элемент, следовательно, наше решение не оптимально. Этот элемент один, в столбце xB, эту переменную необходимо добавить к нашему базису, а одну из переменных текущего базиса (xC,x2,xA) необходимо убрать. Чтобы узнать, какую, необходимо найти для каждой базисной переменной отношение свободного члена к коэффициенту в строке xB (переменной, которую, как мы решили выше, необходимо ввести в базис). Обратите внимание, что это отношение должно существовать, и оно должно быть положительно. Если это не так, мы просто пропускаем соответствующую строку

  xA xB xC x1 x2 x3 B BxB
xC 0 58 1 38 0 18 658 658:58=13
x2 0 32 0 12 1 12 152 152:32=5
xA 1 18 0 18 0 38 858 858:18=85
F 0 34 0 74 0 34 3654  

Мы нашли отношения для каждой строки, и для переменной x2 отношение получилось наименьшим. Поэтому именно данную переменную необходимо убрать из базиса, заменив, как мы определили выше, переменной xB. Прежде всего, найдем значение элемента на пересечении найденной строки и найденного столбца. Он равен 32. И нам нужно всю найденную строку на этот элемент поделить:

  xA xB xC x1 x2 x3 B
xC 0 58 1 38 0 18 658
  0 1 0 13 23 13 5
xA 1 18 0 18 0 38 858
F 0 34 0 74 0 34 3654

Из второй строки исчезло название строки - x2. Это потому, что x2 - больше не базисная переменная. Нам же необходимо, чтобы базисной стала переменная xB. Первое требование к базисным переменным для нее выполняется - есть столбец xB, и у него в третьей строке число 1. Но вот остальные числа не равны нулю. Так давайте их сделаем такими.

  1. Чтобы в первой строке, в столбце xB число 58 превратить в ноль, вычтем из первой строки вторую, умноженную на 58.
  2. Чтобы в третьей строке, в столбце xB число 18 превратить в ноль, вычтем из третьей строки вторую, умноженную на 18.
  3. Чтобы в последней строке, в столбце xB число 34 превратить в ноль, добавим к последней строке вторую, умноженную на 34.
  xA xB xC x1 x2 x3 B
xC 0580 58581 1580 3858(13) 05823 1858(13) 658585
  0 1 0 13 23 13 5
xA 1180 18181 0180 1818(13) 01823 3818(13) 858185
F 0+340 34+341 0+340 74+34(13) 0+3423 34+34(13) 3654+345

Проводим математические действия и получаем итоговую таблицу.

  xA xB xC x1 x2 x3 B
xC 0 0 1 712 512 112 5
xB 0 1 0 13 23 13 5
xA 1 0 0 112 112 512 10
F 0 0 0 32 12 12 95

Теперь вторая строка у нас выражает базисную переменную xB, так как действительно, в столбце xB одно значение равно 1, а остальные - 0. Итерация выполнена.

Итерация 4

Итерация 3 закончена, начинаем такую же итерацию 4. Прежде чем выполнять очередную итерацию, необходимо проверить, идеально ли наше решение? В последней строке НЕТ отрицательных элементов, следовательно, наше решение ОПТИМАЛЬНО. Осталось лишь записать получившееся решение. Как мы помним, всего у нас шесть переменных - xA,xB,xC,x1,x2,x3, и из них только три в базисе - xA,xB,xC (строки в итоговой таблице). Следовательно, остальные три переменных - x1,x2,x3 равны нулю. Но, на самом деле, они нам и неинтересны, потому что мы ввели их сами - это остатки ресурсов на складах (то есть, у нас совсем не осталось ресурсов на складах - мы использовали все, что было). Значения же переменных xA,xB,xC мы получили в последнем столбце таблицы: xC=5, xB=5, xA=10, или, как часто записывают решение таких задач - (10,5,5). При этом можно посчитать значение получаемого дохода (целевой функции), а можно и не считать - оно посчитано за нас в правой нижней ячейке последней таблицы - 95. Проверим это. Подставим в нашу целевую функцию получившееся решение:

F(xA,xB,xC)=4xA+5xB+6xC F(xA,xB,xC)=410+55+65=40+25+30=95

Действительно, получилось 95, как и в таблице. Итак, мы нашли решение производственной задачи симплекс-методом - для трех товаров и трех ресурсов. Графическим методом это решение также можно было бы найти, но было бы очень сложно, так как пришлось бы рисовать трехмерный график. Для четырех или более производимых товаров, графически решить задачу линейного программирования вообще невозможно - только симплекс-методом.

Выводы

Видно, что в процессе решения нам понадобилось заполнять множество таблиц и делать много скучных вычислений. Поэтому было бы неплохо, если бы работу за нас выполнил компьютер. Такая возможность существует - в программе Microsoft Excel есть специальная функция Поиск решений, которая может решить задачу линейного программирования за нас. Как это сделать, мы рассмотрим в следующих двух частях - для Microsoft Excel 2003 (и более старых версий) и для Microsoft Excel 2007 (и более новых версий).

Далее: 2.1.3. Решение ЗЛП в Excel 2010, 2.1.4. Решение ЗЛП в Excel 2003


Полезное по теме