Решение задач линейного программирования компьютерным перебором комбинаций величин искомых переменных

УДК 519.852.6

РЕШЕНИЕ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ КОМПЬЮТЕРНЫМ ПЕРЕБОРОМ КОМБИНАЦИЙ ВЕЛИЧИН

ИСКОМЫХ ПЕРЕМЕННЫХ

Ю.П. Смирнов, А.В. Шумилина

Дано описание вычислительной программы, позволяющей весьма просто решать задачи линейного программирования. Приведено решение ряда простых примеров, взятых из известных источников [1,2,3].

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

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

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

Как известно [2,3], задачи линейного программирования подразделяются на общие, канонические и стандартные. В общих задачах ограничения на переменные представлены некоторым количеством уравнений и неравенств. В канонических задачах ограничения заданы в виде уравнений, а в стандартных только неравенствами.

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

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

1. Задаться численной величиной целевой функции, заведомо большей или меньшей предполагаемого ее значения в зависимости от смысла задачи.

2. Для общих и канонических задач из общего числа искомых переменных выбрать основные переменные, число их не более числа равенств.

209

3. Неосновные переменные перенести в правую часть уравнений.

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

5. Составить циклы перебора значений неосновных переменных, вложенные друг в друга (для стандартных задач пункты 2,3,4 опускаются, так как деление на основные и неосновные переменные теряет смысл - задаются изменения каждой переменной).

6. Задать шаг изменения каждой неосновной переменной в цикле.

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

8. Внутрь системы вычислительных циклов вставить решение системы линейных уравнений относительно основных переменных и проверку условий в виде неравенств. Если все условия выполняются, то вычисляется значение целевой функции.

9. Далее при тех же условиях сравнивается значение целевой функции с предыдущим лучшим ее значением и, если последнее лучше, то ее величина запоминается вместе с соответствующими величинами всех искомых переменных.

10. Так продолжается, пока не будут исчерпаны все шаги в пределах заданных интервалов изменения переменных.

11. Для повышения уверенности в получении оптимального результата можно повторять вычисления, уменьшая шаг и (или) увеличивая интервал изменения некоторых переменных.

Далее рассматривается несколько примеров, решение которых выполнялось с применением языка программирования ШгЬоЬаБЮ.

Пример 1. Задача на составление смеси [1]

Составляется комбинированный корм из трех злаков: кукурузы, овса и ржи. Калорийность и содержание витамина С в одном кг каждого злака, а также цена одного кг злака указаны в табл. 1 ниже [1].

Таблица 1

Калорийность, содержание витамина С в одном кг каждого злака, _цена одного кг злака_

Параметры Кукуруза Овес Рожь

Ккал 200 175 100

Витамин С (г) 5 1 3

Цена (руб) 6 4 1

Требуется составить наиболее дешевый комбинированный корм, 1 кг которого содержал бы не менее 125 ккал и не менее 2 г витамина С.

Решение. Обозначим содержание кукурузы, овса и ржи в 1 кг комбикорма символами Х1,Х2 и Х3 (кг) соответственно. По условию задачи эти переменные удовлетворяют следующей системе ограничений:

210

X + Х2 + Х3 — 1,

8x1 + 7X2 + 4X3 > 5, 5x1 + х2 + 3x3 > 2, х1 > 0,х2 > 0,х3 > 0. Требуется найти план, доставляющий минимум функции затрат

r — 6 X1 + 4 X2 + X3-> min

Ниже приведен полный текст программы в символах языка программирования, решающей поставленную задачу: г0=1000

for x1=0 to 1 step .001 for x2=0 to 1 step .001 x3=1-x2-x1

if x3>=0 and 8*x1+7*x2+4*x3>=5 and 5*x1+x2+3*x3>=2 then_ r=6*x1+4*x2+x3

if r<r0 and x3>=0 and 8*x1+7*x2+4*x3>=5 and 5*x1+x2+3*x3>=2_ then r0=r : x10=x1 : x20=x2 : x30=x3 next x2 : next x1 print r0, x10, x20, x30

Из текста программы видно, что в качестве основной переменной выбрана х3, а хх и х2 - неосновные переменные, могущие принимать значения в интервале от 0 до 1. Внутрь тела циклов изменения величин хх и х2 вставлена математическая модель задачи. Если выполняется первый набор условий при произвольной комбинации величин хх и х2, то это допустимая комбинация переменных и для нее вычисляется целевая функция. Выполнение второго набора условий означает, что для данной комбинации величин переменных значение целевой функции оказалось лучше прежнего, и оно запоминается вместе с соответствующими величинами всех переменных. Таким образом, в процессе счета производится улучшение показаний целевой функции и в итоге вычислений оказывается лучший результат. Это напоминает поиск в симплекс-методе, только здесь нет необходимости искать вершины выпуклых многогранников.

Вычисления с приведенными в программе числовыми данными приводят к результату: r0 » 2.002, хю — 0, х20 » 0.334, х30 » 0.666.

Точный результат из [1]: r 0 — 2, хю — 0, х20 —1/3, х30 — 2/3.

В другом варианте решения для изменения неосновных переменных можно использовать генератор случайных чисел rnd в интервале между 0 и 1, тогда вычислительная программа несколько изменится: r0=1000

for s=1 to 1000 step 1 x1=rnd : x2=rnd : x3=1-x2-x1

if x3>=0 and 8*x1+7*x2+4*x3>=5 and 5*x1+x2+3*x3>=2 then_ r=6*x1+4*x2+x3

if r<r0 and x3>=0 and 8*x1+7*x2+4*x3>=5 and 5*x1+x2+3*x3>=2 then r0=r : x10=x1 : x20=x2 : x30=x3 next s : print r0, x10, x20, x30 Здесь параметр s обозначает номер шага в процессе вычислений. Результат:

r0 » 2.002455, х10 » 0.0000241, Х20 » 0.3341163, Х30 » 0.665864 Пример 2. Транспортная задача [2,3].

Имеются три поставщика и четыре потребителя. Мощность поставщиков и спросы потребителей, а также затраты на перевозку единицы груза для каждой пары "поставщик - потребитель" сведены в табл. 2 поставок, расположенную ниже. Искомый объем перевозки от /-того поставщика у-тому потребителю указан в правом нижнем углу каждой клетки и обозначен как ху. В левом верхнем углу каждой клетки приведен коэффициент затрат на перевозку единицы груза для каждой пары "поставщик -потребитель".

Задача ставится следующим образом. Найти объемы перевозок ху для каждой пары "поставщик - потребитель" так, чтобы:

1) мощности всех поставщиков были реализованы;

2) спросы всех потребителей были удовлетворены;

3) суммарные затраты на перевозку были бы минимальны. Суммарные затраты на перевозку выражаются через коэффициенты

затрат следующим образом:

r = Х11 + 2 Х12 + 5 Х13 + 3x14 + Х21 + 6 Х22 + 5x23 + 2 Х24 + 6 Х31 +

+ 3x32 + 7 Х33 + 4 Х34.

Таблица 2

Затраты на перевозку единицы груза для каждой пары «поставщик - потребитель»

Мощность поставщиков Потребители и их спрос

1 2 3 4

20 110 40 110

60 1 Х11 2 Х12 5 Х13 3 Х14

120 1 Х21 6 Х22 5 Х23 2 Х24

100 6 Х31 3 Х32 7 Х33 4 Х34

Решение. Математическая модель задачи представляется следующим образом. Заданные мощности поставщиков и спросы потребителей накладывают ограничения на значения неизвестных ху. Чтобы мощность каждого из поставщиков была реализована, надо составить уравнение баланса для каждой строки таблицы поставок, т.е.

Хц + х^2 + х^з + х^4 = 60,

Х21 + Х22 + Х23 + Х24 = 120,

Х31 + Х32 + Х33 + Х34 = 100.

Чтобы спрос каждого из потребителей был удовлетворен, уравнение баланса должно быть составлено для каждого столбца таблицы поставок:

Хц + Х21 + Х31 = 20,

Х12 + Х22 + Х32 =110,

Х13 +Х 23+Х33 = 40, Х14 + Х24 + Х34 = 110.

Объемы перевозимых грузов не могут быть отрицательными, по-

этому

Ху>0 (I = 1,2,3; у =1,2,3,4). Суммарные затраты должны быть минимальны

Г — Хп + 2 Х12 + 5х13 + 3х14 + Х21 + 6 Х22 + 5 Х23 + ^тШ

++2 Х24 6 Х31 ^ъ 3Х32 7 Х33 ^ъ 4 Х34.

Особенности этой задачи таковы:

* ограничения представлены системой уравнений (транспортная задача задана в канонической форме);

* коэффициенты при переменных системы уравнений равны 1 или 0;

* каждая переменная входит в систему ограничений дважды: один раз в систему уравнений (1), и один раз в систему (2).

* суммарная мощность поставщиков равна суммарному спросу потребителей (закрытая модель транспортной задачи).

Общее число переменных равно 12. Для закрытой модели транспортной задачи ранг матрицы системы уравнений (1), (2) на единицу меньше общего числа уравнений [2]. Это максимальное число линейно независимых уравнений. Отсюда имеем 6 основных (базисных) и 6 неосновных переменных.

Выбор вида переменных отчасти произволен, надо только иметь в виду, что в каждом уравнении систем (1),(2) должно быть не менее одной основной и одной неосновной переменной. Ниже системы уравнений (1), (2) переписаны и в них для наглядности помечены черточкой базисные переменные.

Хц + Х12 + Х13 + Х14 — 60,

Х 21 + Х 22 + Х 23 + Х 24 —120,

ХП + Х 21 + Х31 — 20, Х12 + Х 22 + Х32 =110, Х13 +Х 23 + Х33 = 40,

Х31 + х32 + х33 + х34 - 100 - _11Л

Х14 + х 24 + Х34 — 1Ю.

Из этой системы выразить основные переменные через неосновные очень просто, так как коэффициенты при всех переменных равны единице:

Х13 — 60 — Х11 — Х12 — Х14,

Х21 = 140 — Х11 — Х12 — Х14 — Х22 — x24,

Х23 = —20 + Хц + Х12 + Х14 — Х33,

Х31 = —120 + Х12 + Х14 + Х22 + Х24 — Х33,

Х32 =110 — Х12 — x22, Х34 = 110 — Х14 — Х24.

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

r0=10000

for x11=0 to 60 step 10 for x12=0 to 60 step 10 for x14=0 to 60 step 10 for x22=0 to 110 step 10 for x24=0 to 110 step 10 for x33=0 to 160 step 10

x13=60-x11-x12-x14 : x21=140-x11-x12-x14-x22-x24 :_ x23=-20+x11+x12+x14-x33 : x31=-120+x12+x14+x22+x24-x33 :_ x32=110-x12-x22 : x34=110-x14-x24

if x13>=0 and x21>=0 and x23>=0 and x31>=0 and x32>=0 and_ x34>=0 then r=x11+2*x12+5*x13+3*x14+x21+6*x22+5*x23+2*x24

if r<r0 and x13>=0 and x21>=0 and x23>=0 and x31>=0 and_ x32>=0 and x34>=0 then r0=r : x11a=x11 : x12a=x12 : x13a=x13:_ x14a=x14: x21a=x21 : x22a=x22 : x23a=x23 : x24a=x24 :x31a=x31_ : x32a=x32 : x33a=x33 : x34a=x34

next x33,x24,x22,x14,x12,x11

print x11a,x12a,x13a,x14a,x21a,x22a,x23a,x24a,x31a,x32a,x33a,_ x34a,r0

Интервал изменения каждой неосновной переменной задавался из следующих соображений: рассматривалась правая часть каждого уравнения системы (5), она не должна при предельных условиях делаться отрицательной. Для первого уравнения системы (5) каждое слагаемое правой части по отдельности не должно превышать число 60 (это интервал для переменных x11, x12, x14). Из пятого и шестого уравнений соответственно име-

+6*x31+3*x32+7*x33+4*x34

ем интервал 110 для x22 и x24. Наименьший интервал для x33 получается из третьего уравнения, он равен 160. Увеличение интервалов сверх найденных значений приведет к росту времени вычислений и не улучшит результат, уменьшение может привести к потере оптимального результата.

Наши вычисления по приведенной программе дали полное совпадение с оптимальным результатом в [2]:

хц=10, x12=10, xi3= 40, xi4= 0, x21=10, x22= 0, x23= 0, x24= 110, x31= 0, x32=100, x33= 0, x34= 0.

Гmin =760.

На вычисления при записанных данных уходит около трех секунд, за это время просматривается более восьмисот тысяч комбинаций величин неосновных переменных, чтобы отыскать оптимальную комбинацию. Было сделано вычисление при шаге изменения переменных, равном пяти. Результат от этого не изменился, зато время счета выросло в десятки раз. Если же взять шаг изменения равным единице, то это увеличит время вычислений ровно в миллион раз, и они продлятся около месяца.

Пример 3. (Взят из пособия [1]).

Мини-пекарня планирует выпечку батонов и булочек. На производство одного батона расходуется 450 г муки, 10 г масла и 0.5 яйца, а на производство одной булочки - 150 г муки, 5 г масла и 1 яйцо. В пекарню ежедневно завозят 180 кг муки, 10 кг масла и 775 яиц. Прибыль от реализации батона равна 3 рублям, а от реализации булочки - 5 рублям. В день необходимо производить не менее 780 единиц продукции и получать не менее 3500 рублей прибыли. Требуется разработать план, обеспечивающий максимальную прибыль.

Решение. Обозначим производимое в день количество батонов символом xb а x2 - число булочек. По условию задачи эти переменные удовлетворяют следующей системе ограничений:

x1 + x2 > 780,

xi /2 + x2 £ 775, 1 2 (6) x1 + x2/2 £ 500,

3x1 + x2 £ 1200.

Третье условие в системе (6) есть ограничение на количество масла, привозимого каждый день, а четвертое - на количество муки. В последних двух условиях пропорционально изменены коэффициенты для придания записям более простого вида. Формула прибыли имеет вид:

r = 3x1 + 5 x2.

Полный текст программы задачи в символах ШгЬоЬаБю'а:

г0=1

for x1=0 to 400 step 1

for x2=0 to 775 step 1

if 3*x1+x2<=1200 and x1+x2/2<=500 and x1+x2>=780 and_ x1/2+x2<=775 then r=3*x1+5*x2

if r>r0 and 3*x1+x2<=1200 and x1+x2/2<=500 and x1+x2>=780_ and x1/2+x2<=775 then r0=r : x10=x1 : x20=x2 next x2, x1 : print r0, x10, x20

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

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

rmax = 3950, Хю = 150, Х20 = 700. Текст программы с использованием генератора случайных чисел r0=1

for s=1 to 1000000 step 1 x1=400*rnd : x2=775*rnd

if 3*x1+x2<=1200 and x1+x2/2<=500 and x1+x2>=780 and_ x1/2+x2<=775 then r=3*x1+5*x2

if r>r0 and 3*x1+x2<=1200 and x1+x2/2<=500 and x1+x2>=780_ and x1/2+x2<=775 then r0=r : x10=x1 : x20=x2 next s : print r0, x10, x20 Результат вычислений:

rmax = 3949.177, x10 = 149.941, x20 = 699.871 оказался весьма близким к точным целочисленным значениям. Пример 4. (Взят из пособия [2])..

Имеется большое количество бревен длиной 3 м. Из них распиливанием следует получить заготовки двух видов: длиной 1.2 м и длиной 0.9 м, причем заготовок каждого вида должно быть получено не менее 50 шт. и 81 шт. соответственно. Каждое бревно можно распилить на указанные заготовки тремя способами: 1) на 2 заготовки по 1.2 м; 2) на 1 заготовку по 1.2 м и 2 заготовки по 0.9 м; 3) на 3 заготовки по 0.9 м. Найти число бревен, распиливаемых каждым способом, с тем чтобы требуемые количества заготовок каждого вида были получены из наименьшего числа бревен.

Решение. Обозначим через Х1, Х2, Х3 числа бревен, распиливаемых соответственно 1-м, 2-м и 3-м способами. Из них можно получить 2Х1 + Х2 заготовок по 1.2 м и 2Х2 + 3x3 заготовок по 0.9 м. Общее количество бревен, потребное для изготовления названных заготовок, обозначим символом r . Тогда математическая модель задачи примет вид:

216

r = xi + x 2 + Х3-> min

при ограничениях

2xi + Х2 > 50, 2x2 + 3x3 > 81

Все переменные - неотрицательные целые числа. Ниже приведен полный текст программы, решающей данную задачу. Длины интервалов изменения переменных в циклах вычислений определяются по правым частям неравенств, и они должны быть: для xi - не менее 25, для x2 - не менее 41, для x3 - не менее 27, чтобы покрыть объем, в котором может находиться оптимальная точка г0=1000

for x1=0 to 30 step 1 for x2=0 to 50 step 1 for x3=0 to 30 step 1

if 2*x1+x2>=50 and 2*x2+3*x3>=81 then r=x1+x2+x3

if r<r0 and 2*x1+x2>=50 and 2*x2+3*x3>=81 then_

r0=r : x10=x1 : x20=x2 : x30=x3

next x3, x2, x1

print r0, x10, x20, x30

Вычисления дают нам следующий оптимальный результат:

rmin = 46, x10 = 4, x20 = 42, x30 = 0. В учебном пособии [2] отмечается альтернативность оптимальных результатов в целочисленных задачах, и утверждается, что в этой задаче должно быть четыре таких варианта. Они приводятся, но наш результат не совпадает ни с одним из них. Лучший их результат по отношению к величине отходов уступает нашему результату. Приведем его: rmin = 46, x10 = 5, x 20 = 41, x30 = 0. В нашем случае 2.4 м бревен уходят в отходы, а в их случае - 3 м. В нашем случае делается 50 заготовок в 1.2 м и 84 заготовки длиной 0.9 м. А в их случае делается 51 заготовка в 1.2 м и 82 заготовки длиной 0.9 м. Таким образом, наш результат является пятым альтернативным вариантом, и он оказался лучше по минимуму отходов, хотя никаких дополнительных критериев, как можно видеть, в программу не вставлено. Выводы:

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

2. Приведенные простые примеры относятся к различающимся видам задач: в первом примере решается общая задача линейного программирования, во втором примере - каноническая задача, а в третьем и четвертом примерах - стандартная задача.

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

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

5. Для повышения точности результата следует уменьшать шаги изменения задаваемых переменных. При большом числе задаваемых переменных и малых шагах их изменения количество исчисляемых комбинаций и время вычисления может быть недопустимо велико. Чтобы получить достаточную точность результата за приемлемое время, надо проводить вычисления в несколько этапов. Перед началом вычислений надо задаться сравнительно крупными шагами и интервалами изменения, обеспечивающими попадание оптимума в заданный объем. Получив при этих условиях сравнительно близкую к оптимуму точку, надо выделить вокруг нее меньший объем. Для этого надлежит отступить от нее на величину шага в обе стороны по каждой задаваемой координате и задаться значительно меньшими величинами шагов. Далее снова проводятся вычисления, и все действия повторяются, пока не будет достигнута приемлемая точность.

6. Для снижения количества исчисляемых комбинаций и времени счета можно также попытаться использовать генератор случайных чисел. В первом и третьем примерах применение генератора rnd дает очень близкий к оптимуму результат. Однако уже в примере с транспортной задачей для числа циклов изменения переменных 107 результат качественно отличался от оптимального - в таблице результатов не оказалось клеток с близкими к нулю величинами.

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

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

9. Предложенный метод может применяться и к нелинейным задачам, но решение и анализ систем нелинейных уравнений сильно осложнит дело для случаев аналогов общей и канонической задач нелинейного программирования. Между тем препятствий для решения рассмотренным методом аналогов стандартных задач в нелинейной постановке не видно.

Список литературы

1. Самаров К.Л. Линейное программирование: учебно-методическое пособие. М: ООО «Резольвента», 2009. 20 с.

2. Исследование операций в экономике: учебное пособие / под ред. проф. Н.Ш. Кремера М.: ЮНИТИ, 2000. 407 с.

3. Глаголев А. А., Солнцева Т.В. Курс высшей математики. М.: Изд-во «Высшая школа», М.: 1971. 654 с.

Смирнов Юрий Павлович, д-р техн. наук, профессор, ir_1949@,mail. ru, Россия, Тула, Тульский государственный университет,

Шумилина Алиса Вячеславна, студентка, ir_1949@,mail. ru, Россия, Тула, Технический колледж им Мосина при Тульском государственном университете

SOLVING THE PROBLEMS OF LINEAR PROGRAMMING BY COMPUTER MULTIPLE VARIETY COMBINATIONS OF VALUE DESIRABLE VARIABLES

Yu.P. Smirnov, A. V. Shumilina

A description is given of a computational program that makes it very easy to solve linear programming problems. The solution of a number of simple examples taken from known sources [1,2,3] is given.

Key words: linear programming, main and minor variables, objective function, optimal point.

Smirnov Yury Pavlovich, doctor of technical sciences, professor, ir_1949@,mail. ru, Russia, Tula, Tula State University,

Shumilina Alisa Vyacheslavna, student, ir_1949@,mail.ru, Rossia, Tula, Mosin Technical College at Tula State University