Файл: Понятие переменной в программировании. Виды и типы переменных (ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ ИССЛЕДОВАНИЯ ПЕРЕМЕННЫХ В ПРОГРАММИРОВАНИИ).pdf
Добавлен: 30.03.2023
Просмотров: 202
Скачиваний: 1
Другой уровень абстракции требует принципиально иных решений, новой конфигурации «железа», новых команд для нового «железа». Но это уже, что называется, другая история…
ГЛАВА 3 РЕШЕНИЕ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ КОМПЬЮТЕРНЫМ ПЕРЕБОРОМ КОМБИНАЦИЙ ВЕЛИЧИН ИСКОМЫХ ПЕРЕМЕННЫХ
Линейное программирование есть раздел математики, посвященный теории и методам решения задач об отыскании экстремумов линейных функций на множествах, определяемых некоторыми линейными ограничениями (равенствами и неравенствами).
Линейное программирование широко используется в экономическом планировании, логистических задачах, распределении ресурсов, транспортных задачах и т.п. Делается это для количественного обоснования принимаемых решений в процессе управления чем либо.
Как известно [2,3], задачи линейного программирования подразделяются на общие, канонические и стандартные. В общих задачах ограничения на переменные представлены некоторым количеством уравнений и неравенств. В канонических задачах ограничения заданы в виде уравнений, а в стандартных только неравенствами.
Теория и методы решения задач линейного программирования довольно хорошо разработаны в настоящее время. Имеется обширная литература по этим вопросам. Однако, к сожалению, все известные методы и алгоритмы весьма сложны и трудоемки. Даже решение двумерных задач графическим методом требует затратных по времени построений.
Между тем вычислительные возможности компьютеров позволяют существенно снизить затраты времени и усилий исследователей в решении такого рода задач. Предлагается общее описание вычислительной программы, решающей такого рода задачи. Считается, что математическая модель задачи линейного программирования построена (записаны ограничения в виде равенств, неравенств, выражение целевой функции, содержащие искомые величины). Порядок действий:
- Задаться численной величиной целевой функции, заведомо большей или меньшей предполагаемого ее значения в зависимости от смысла задачи.
- Для общих и канонических задач из общего числа искомых переменных выбрать основные переменные, число их не более числа равенств.
209
- Неосновные переменные перенести в правую часть уравнений.
- Систему уравнений разрешить относительно основных переменных аналитически, либо решать численно на каждом шаге вычислений.
- Составить циклы перебора значений неосновных переменных, вложенные друг в друга (для стандартных задач пункты 2,3,4 опускаются, так как деление на основные и неосновные переменные теряет смысл - задаются изменения каждой переменной).
- Задать шаг изменения каждой неосновной переменной в цикле.
- Задать длину интервала изменения каждой неосновной переменной, учитывая величины правых частей исходной системы ограничений.
- Внутрь системы вычислительных циклов вставить решение системы линейных уравнений относительно основных переменных и проверку условий в виде неравенств. Если все условия выполняются, то вычисляется значение целевой функции.
- Далее при тех же условиях сравнивается значение целевой функции с предыдущим лучшим ее значением и, если последнее лучше, то ее величина запоминается вместе с соответствующими величинами всех искомых переменных.
- Так продолжается, пока не будут исчерпаны все шаги в пределах заданных интервалов изменения переменных.
- Для повышения уверенности в получении оптимального результата можно повторять вычисления, уменьшая шаг и (или) увеличивая интервал изменения некоторых переменных.
Далее рассматривается несколько примеров, решение которых выполнялось с применением языка программирования turbobasic.
Пример 1. Задача на составление смеси [1]
Составляется комбинированный корм из трех злаков: кукурузы, овса и ржи. Калорийность и содержание витамина С в одном кг каждого злака, а также цена одного кг злака указаны в табл. 1 ниже [1].
Таблица 1 - Калорийность, содержание витамина С в одном кг каждого злака, цена оДного кг злака
|
Параметры |
Кукуруза |
Овес |
Рожь |
|
Ккал |
200 |
175 |
100 |
|
Витамин С (г) |
5 |
1 |
3 |
|
Цена (руб) |
6 |
4 |
1 |
Требуется составить наиболее дешевый комбинированный корм, 1 кг которого содержал бы не менее 125 ккал и не менее 2 г витамина С.
Решение. Обозначим содержание кукурузы, овса и ржи в 1 кг комбикорма символами x1, x2 и x3 (кг) соответственно. По условию задачи эти переменные удовлетворяют следующей системе ограничений:
x1 + x2 + x3 = 1, 8^1 + 7X2 + 4X3 > 5, 5xi + X2 + ЗХ3 > 2, xi > 0,X2 > 0,X3 > 0.
Требуется найти план, доставляющий минимум функции затрат
r = 6 xi + 4 X2 + X3 ® min
Ниже приведен полный текст программы в символах языка программирования, решающей поставленную задачу:
r0=i000
for xi=0 to i step .00i for x2=0 to i step .00i x3=i-x2-xi
if x3>=0 and 8*xi+7*x2+4*x3>=5 and 5*xi+x2+3*x3>=2 then_ r=6*xi+4*x2+x3
if r<r0 and x3>=0 and 8*xi+7*x2+4*x3>=5 and 5*xi+x2+3*x3>=2_ then r0=r : xi0=xi : x20=x2 : x30=x3
next x2 : next xi
print r0, xi0, x20, x30
Из текста программы видно, что в качестве основной переменной выбрана x3, a x1 и x2- неосновные переменные, могущие принимать значения в интервале от 0 до i. Внутрь тела циклов изменения величин xi и x2 вставлена математическая модель задачи. Если выполняется первый набор условий при произвольной комбинации величин xi и x2, то это допустимая комбинация переменных и для нее вычисляется целевая функция. Выполнение второго набора условий означает, что для данной комбинации величин переменных значение целевой функции оказалось лучше прежнего, и оно запоминается вместе с соответствующими величинами всех переменных. Таким образом, в процессе счета производится улучшение показаний целевой функции и в итоге вычислений оказывается лучший результат. Это напоминает поиск в симплекс-методе, только здесь нет необходимости искать вершины выпуклых многогранников.
Вычисления с приведенными в программе числовыми данными приводят к результату: r0 » 2.002, xi0 = 0, x20 » 0.334, x30 » 0.666. Точный результат из [i]: r0 = 2, xi0 = 0, x20 =i/3, x30 = 2/3.
В другом варианте решения для изменения неосновных переменных можно использовать генератор случайных чисел rnd в интервале между 0 и i, тогда вычислительная программа несколько изменится:
r0=i000
for s=i to i000 step i
xi=rnd : x2=rnd : x3=i-x2-xi
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, x10 » 0.0000241, x20 » 0.3341163, x30 » 0.665864
Пример 2. Транспортная задача [2,3].
Имеются три поставщика и четыре потребителя. Мощность поставщиков и спросы потребителей, а также затраты на перевозку единицы груза для каждой пары “поставщик - потребитель” сведены в табл. 2 поставок, расположенную ниже. Искомый объем перевозки от z-того поставщика у-тому потребителю указан в правом нижнем углу каждой клетки и обозначен как xij. В левом верхнем углу каждой клетки приведен коэффициент затрат на перевозку единицы груза для каждой пары “поставщик - потребитель”.
Задача ставится следующим образом. Найти объемы перевозок Ху для каждой пары “поставщик - потребитель” так, чтобы:
- мощности всех поставщиков были реализованы;
- спросы всех потребителей были удовлетворены;
- суммарные затраты на перевозку были бы минимальны.
Суммарные затраты на перевозку выражаются через коэффициенты затрат следующим образом:
r = x11+ 2x12+ 5x13+ 3x14+ x21+ 6x22+ 5x23+ 2x24+ 6x31+
+3x32 +7x33 + 4x34.
Таблица 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 |
Решение. Математическая модель задачи представляется следующим образом. Заданные мощности поставщиков и спросы потребителей накладывают ограничения на значения неизвестных xij. Чтобы мощность каждого из поставщиков была реализована, надо составить уравнение баланса для каждой строки таблицы поставок, т.е.
x11+ x12+ x13+ x14= 60,
x21 + x22 + x23 + x24 = 120, (1)
x31 + x32 + x33 + x34 = 100.
Чтобы спрос каждого из потребителей был удовлетворен, уравнение баланса должно быть составлено для каждого столбца таблицы поставок:
x11+ x21+ x31= 20, x12 + x22 + x32 = 110, x13 + x23+ x33 = 40,
(2)
x14+ x24+ x34= 110.
Объемы перевозимых грузов не могут быть отрицательными, поэтому
Xij>0 (i = 1,2,3; j =1,2,3,4).
Суммарные затраты должны быть минимальны
r = Хц + 2 Xj2 + 5X13 + 3xi4 + X21 + 6 X22 + 5 X23 + i
(3)
+2x24+ 6x31+ 3x32+ 7x33+ 4x34.
Особенности этой задачи таковы:
*ограничения представлены системой уравнений (транспортная задача задана в канонической форме);
*коэффициенты при переменных системы уравнений равны 1 или 0;
*каждая переменная входит в систему ограничений дважды: один раз в систему уравнений (1), и один раз в систему (2).
*суммарная мощность поставщиков равна суммарному спросу потребителей (закрытая модель транспортной задачи).
Общее число переменных равно 12. Для закрытой модели транспортной задачи ранг матрицы системы уравнений (1), (2) на единицу меньше общего числа уравнений [2]. Это максимальное число линейно независимых уравнений. Отсюда имеем 6 основных (базисных) и 6 неосновных переменных.
Выбор вида переменных отчасти произволен, надо только иметь в виду, что в каждом уравнении систем (1),(2) должно быть не менее одной основной и одной неосновной переменной. Ниже системы уравнений (1), (2) переписаны и в них для наглядности помечены черточкой базисные переменные.
Из этой системы выразить основные переменные через неосновные очень просто, так как коэффициенты при всех переменных равны единице:
Теперь можно записать программу вычислений искомых переменных:
Интервал изменения каждой неосновной переменной задавался из следующих соображений: рассматривалась правая часть каждого уравнения системы (5), она не должна при предельных условиях делаться отрицательной. Для первого уравнения системы (5) каждое слагаемое правой части по отдельности не должно превышать число 60 (это интервал для переменных x11, x12, x14). Из пятого и шестого уравнений соответственно имеем интервал 110 для x22 и x24. Наименьший интервал для x33 получается из третьего уравнения, он равен 160. Увеличение интервалов сверх найденных значений приведет к росту времени вычислений и не улучшит результат, уменьшение может привести к потере оптимального результата.
Наши вычисления по приведенной программе дали полное совпадение с оптимальным результатом в [2]:
На вычисления при записанных данных уходит около трех секунд, за это время просматривается более восьмисот тысяч комбинаций величин неосновных переменных, чтобы отыскать оптимальную комбинацию. Было сделано вычисление при шаге изменения переменных, равном пяти. Результат от этого не изменился, зато время счета выросло в десятки раз. Если же взять шаг изменения равным единице, то это увеличит время вычислений ровно в миллион раз, и они продлятся около месяца.