На этом шаге мы рассмотрим преобразование сетевой модели в задачу линейного программирования.
Определение модели сети с ограниченной пропускной способностью как задачи линейного программирования необходимо для разработки симплексного алгоритма решения задач данного типа. Используя определения, данные в шаге 127, мы можем записать задачу линейного программирования для сети с ограниченной пропускной способностью следующим образом.
Минимизировать:
при ограничениях:
Результирующий "чистый" поток fj, протекающий через узел j, вычисляется по формуле
fj = (Величина потока, выходящего из узла j) - (Величина потока, входящего в узел j).
Нижнюю границу пропускной способности lij можно удалить из ограничений с помощью подстановки xij = x'ij - lij. Для нового потока верхней границей пропускной способности будет величина uij - lij. В этом случае результирующий поток через узел i будет равен [fi] - lij, а через узел j - [fj] + lij. На рисунке 1 показаны преобразования характеристик дуги (i, j) после исключения ее нижней границы пропускной способности.
Рис.1. Преобразования характеристик
Основные ограничения формулируемой задачи линейного программирования связаны с определением входных и выходных потоков, протекающих через каждый узел, что порождает следующую задачу линейного программирования:
x12 x13 x14 x23 x25 x34 x35 x46 x56 Миними- 3 4 1 5 6 1 2 2 4 зировать Узел 1 1 1 1 = 100 Узел 2 -1 1 1 = 200 Узел 3 -1 -1 1 1 = 50 Узел 4 -1 -1 1 =-150 Узел 5 -1 -1 1 = -80 Узел 6 -1 -1 =-120 Нижние 0 0 50 0 0 70 0 100 0 границы Верхние Б Б 80 Б Б 120 Б 120 Б границы Примечание. Б - бесконечность.
Сделаем замечание о структуре коэффициентов, формирующих ограничения. В столбце, соответствующем переменной xij, всегда в строке i стоит +1, а в строке j находится -1. Остальные коэффициенты равны нулю. Такая структура коэффициентов типична для сетевых моделей.
Для переменных, представляющих потоки через дуги, имеющие ненулевые нижние границы пропускных способностей, выполняем замену:
x14 = x'14 + 50, x34 = x'34 + 70, x46 = x'46 + 100.
В результате получаем следующую задачу линейного программирования:
x12 x13 x14 x23 x25 x34 x35 x46 x56 Миними- 3 4 1 5 6 1 2 2 4 зировать Узел 1 1 1 1 = 50 Узел 2 -1 1 1 = 200 Узел 3 -1 -1 1 1 = -20 Узел 4 -1 -1 1 =-130 Узел 5 -1 -1 1 = -80 Узел 6 -1 -1 = -20 Верхние Б Б 30 Б Б 50 Б 20 Б границы Примечание. Б - бесконечность.
Соответствующая сеть после исключения нижних границ пропускных способностей дуг показана на рисунке 2.
Рис.2. Сеть после исключения нижних границ
Отметим, что данную сеть можно получить непосредственно из сети, представленной на рисунке 3, с помощью преобразований, показанных на рисунке 1, причем без необходимости записи в виде задачи линейного программирования.
Рис.3. Схема маршрутов
В следующем примере представлена сетевая модель, которая исходно не удовлетворяет условию узлового потока (т.е. условию, что результирующий поток, проходящий через узел, равен разности выходного и входного потоков), но которую можно преобразовать в модель, удовлетворяющую этому условию, путем изменения ограничений соответствующей задачи линейного программирования.
Месяц Январь Февраль Март Апрель К-во рабочих 100 120 80 170
Поскольку спрос на рабочих различен в разные месяцы, возможно, экономически целесообразно нанять больше рабочих, чем требуется, в текущем месяце. Стоимость найма рабочих и удержания их в "ждущем режиме" зависит от времени трудоустройства, как показано в следующей таблице:
Время трудоустройства (месяцы) 1 2 3 4 Стоимость на одного рабочего (рубли) 100 130 180 220
Обозначим через xij количество рабочих, нанятых на начало i-го месяца и освобожденных на начало j-го. Например, x12 - это количество рабочих, нанятых в январе только на один месяц.
Чтобы сформулировать задачу линейного программирования, нужно добавить еще пятый месяц (май). Тогда, например, переменная x45 будет обозначать количество рабочих, нанятых в апреле на один месяц. Естественно, на май нет заказа на рабочих.
Ограничения строятся так, чтобы спрос на рабочих в месяц k можно было бы удовлетворить за счет всех рабочих xij, где i<=k<=j. Обозначив через Si (Si>=0) количество рабочих, "лишних" в месяце i, получим следующую задачу линейного программирования:
x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 S1 S2 S3 S4 100 130 180 220 100 130 180 100 130 100 Min Янв. 1 1 1 1 -1 100 Фев. 1 1 1 1 1 1 -1 120 Март 1 1 1 1 1 1 -1 80 Апр. 1 1 1 1 -1 170
В данной задаче линейного программирования нет той специальной структуры коэффициентов ограничений, что была в модели из примера 1. Тем не менее, эта задача имеет свою специфику, которая позволит преобразовать ее в сетевую модель. Выполним следующие действия.
Применение описанной процедуры к задаче данного примера приводит к следующей задаче линейного программирования, которая уже имеет структуру сетевой модели.
Таким образом, задачу распределения рабочих можно представить в виде эквивалентной задачи нахождения потока минимальной стоимости в сети с ограниченной пропускной способностью (рисунок 4):
x12 x13 x14 x15 x23 x24 x25 x34 x35 x45 S1 S2 S3 S4 100 130 180 220 100 130 180 100 130 100 Min Янв. 1 1 1 1 -1 100 Фев. -1 1 1 1 1 -1 20 Март -1 -1 1 1 1 -1 -40 Апр. -1 -1 -1 1 1 -1 90 Май -1 -1 -1 -1 -1 -1 -170
Рис.4. Сеть с ограниченной пропускной способностью
Задачу линейного программирования можно решить с помощью специализированных программных средств, например Microsoft Excel.
На следующем шаге мы рассмотрим симплексный алгоритм для сетей с ограниченной пропускной способностью.