Тренинг glpk, часть 3: Транспортная задача
TRANSCRIPT
![Page 1: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/1.jpg)
Основы моделирования в пакете GUSEK/GLPK
v 0.3 2015-03-09
Решение задач транспортного типаОперации с множествами
Заходякин Г.В. [email protected]
![Page 2: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/2.jpg)
План занятия• Содержательная постановка транспортной задачи• Модель на языке MathProg• Полезные операции с множествами в MathProg
2
![Page 3: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/3.jpg)
Содержательная постановка• Компания располагает тремя складами, расположенными в Подмосковье (Химки, Чехов и
Ногинск) • Продукция со складов доставляется клиентам в ближайших областях. В этом примере спрос
клиентов каждой области агрегирован до областного центра• Известен объем заказов, полученных от клиентов и запасов, доступных на каждом складе• Известно расстояние от каждого склада до каждого клиента• Требуется найти план перевозок (распределения), обеспечивающий минимальные
транспортные затраты и при этом удовлетворить спрос всех клиентов
3
![Page 4: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/4.jpg)
Транспортная задача на карте…
Требуется составить план перевозок с минимальными затратами, прикотором полностью удовлетворяется весь спрос 4
![Page 5: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/5.jpg)
Математическая постановка задачи
𝐹𝐹 = �𝑤𝑤∈𝑊𝑊
�𝑚𝑚∈𝑀𝑀
𝑐𝑐 ⋅ 𝑑𝑑𝑤𝑤𝑚𝑚 ⋅ 𝑥𝑥𝑤𝑤𝑚𝑚 → 𝑚𝑚𝑚𝑚𝑚𝑚
�𝑚𝑚∈𝑀𝑀
𝑥𝑥𝑤𝑤𝑚𝑚 = 𝐼𝐼𝑤𝑤 ,∀𝑤𝑤 ∈ 𝑊𝑊
�𝑤𝑤∈𝑊𝑊
𝑥𝑥𝑤𝑤𝑚𝑚 = 𝐷𝐷𝑚𝑚,∀𝑚𝑚 ∈ 𝑀𝑀
𝑥𝑥𝑤𝑤𝑚𝑚 ≥ 0,∀𝑤𝑤 ∈ 𝑊𝑊,∀𝑚𝑚 ∈ 𝑀𝑀
Обозначения:• 𝑊𝑊 – множество складов• 𝑀𝑀 – множество рынков• 𝑥𝑥𝑤𝑤𝑚𝑚 - объем перевозок по маршруту 𝑤𝑤 → 𝑚𝑚• 𝑑𝑑𝑤𝑤𝑚𝑚- расстояние между пунктами• с – тариф, в расчете на ед. продукта на км• 𝐼𝐼𝑤𝑤 - запасы склада 𝑤𝑤• 𝐷𝐷𝑚𝑚 - спрос на рынке 𝑚𝑚
Владимир … Ниж-
ний
500Запасы
M (рынки)
W (склады)
𝑥𝑥Химки,Владимир
Х Ч Н
500 1000
100Спрос 300
структураданных решения
5
![Page 6: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/6.jpg)
ПЕРВАЯ МОДЕЛЬ:ВСЕ МАРШРУТЫ
6
![Page 7: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/7.jpg)
Подготовка• Создайте новую модель и сохраните ее в файл:
transportation.mod
7
![Page 8: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/8.jpg)
Множества и параметры модели• На рисунке показано объявление множеств и параметров модели
– Для каждого параметра мы задали проверку на допустимое значение, а также разумное значение по умолчанию. Например, если между какими-то пунктами маршрут прокладывать нецелесообразно, можно пропустить в данных это расстояние; при этом по умолчанию длина маршрута станет очень большой, и маршрут не будет использоваться
– Ключевое слово check позволяет задать более сложную проверку: мы можем проверять не просто отдельные значения загружаемых данных, а использовать произвольные выражения для контроля правильности. Поскольку эта проверка не является частью математической постановки модели, здесь можно использовать произвольные нелинейные функции
– В классической постановке транспортной задачи, которую мы используем, запасы на складах и спрос клиентов в точности равны. На практике, такое условие редко реализуется, поэтому контролируемое условие может оказаться чрезмерно строгим
8
![Page 9: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/9.jpg)
Переменные и целевая функция• На рисунке показано объявление переменных модели
и выражение для целевой функции– В этой задаче переменные решения (план перевозок)
имеют структуру таблицы: строки таблицы – склады, столбцы – клиенты (на рисунке для компактности показанатранспонированная таблица)
– Целевая функция - транспортные затраты - зависит от объемов перевозок по каждому маршруту и его длины
– Мы считаем, что транспортные тарифы по всем направлениям одинаковые, поэтому не важно, какое именнозначение принимает параметр tariff. Сумма будет изменяться пропорционально значению параметра, а оптимальное решение не изменится. В этой задаче примем tariff за 1
– Целевую функцию можно записать несколькими способами. Наиболее компактный – одна сумма, в индексирующем выражении которой присутствуют оба множества. Порядок написания индексов здесь не важен. Порядок важен тогда, когда мы обращаемся к переменной или таблице расстояний. Поскольку мы задали их индексы как {склад, клиент}, - правильно писать: trans[w, m]. Наоборот – trans[m, w] – нельзя.
9
![Page 10: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/10.jpg)
Ограничения• На рисунке показана система ограничений
– В модели присутствуют 2 вида ограничений: для каждого склада –возможный объем поставок, для каждого клиента – требование по выполнению спроса; при этом клиент, в принципе, может снабжаться с разных складов
– Оба ограничения представляют собой множество ограничений (индексирующее выражение задано в {} после имени ограничения)
10
![Page 11: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/11.jpg)
Данные• На рисунке показан раздел данных для решения задачи (в одном файле с моделью)
– Мы, по возможности, используем одновременное определение элементов множества и свойств этих элементов (в реляционном формате)
– В модели мы определили индексы для параметра distance – склад, модель. Но, поскольку клиентов много, такую таблицу неудобно вводить. Поэтому в разделе данных можно указать, что таблица приведена в транспонированном виде (tr), тогда ошибки не будет
– Можно использовать русские символы для элементов множеств, но тогда нужны кавычки❶
❷
11
![Page 12: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/12.jpg)
Проба• Добавьте перед разделом данных команды solve и display, чтобы вывести значение
транспортных затрат и план перевозок• Запустите модель, чтобы проверить решение
• На рисунке приведен фрагмент плана перевозок. Очевидно, что выдаваемый автоматически отчет крайне неудобен для анализа: он содержит все переменные решения, даже если какой-либо маршрут не предполагается использовать
12
![Page 13: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/13.jpg)
Фильтрация в индексных выражениях• До сих пор при записи индексирующих выражений в MathProg мы использовали все элементы
некоторого множества, или все возможные сочетания элементов из нескольких множеств. Однако часто требуются не все элементы, а лишь те, которые обладают нужными свойствами
• Для отбора нужных элементов используются фильтры. После двоеточия в индексном выражении можно записать условие. Если записанное в условии выражение истинно для текущего элемента, то он включается в индекс и используется. Иначе – пропускается
• Несколько условий можно объединить в одно с помощью союзов: И (&&), ИЛИ (||), например: trans[w, m] > 0 && trans[w, m] < 100 – оба условия должны выполняться одновременно
• Фильтры работают в любой ситуации – и при определении компонентов модели тоже• На рисунке мы вывели план перевозок только по используемым маршрутам. Обратите внимание, что из-
за порядка индексов список получился отсортированным по рынкам
13
![Page 14: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/14.jpg)
Форматированный отчет• Команды для получения форматированного отчета
показаны на рисунке внизу• Мы используем для вывода строк таблицы
команду for, которая повторяет для каждогоклиента (строки) команды printf для печатиобъемов перевозок с разных складов (столбцы)
• При необходимости, вы можете обратиться запояснениями об использовании специальныхсимволов (\n) и спецификаторов формата (%)к тренингу по задаче о рационе
14
![Page 15: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/15.jpg)
ВТОРАЯ МОДЕЛЬ:ТОЛЬКО РАЗУМНЫЕ МАРШРУТЫ
15
![Page 16: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/16.jpg)
Решение на карте…• Сравнение решения с картой позволяет утверждать, что план перевозок в нашей задаче получился
довольно разумным: каждый город снабжается с ближайшего склада• Однако в задаче реалистичного размера – с большим числом клиентов – выбранный нами способ
формализации модели приведет к проблеме: число переменных решения определяется произведением числа складов и клиентов (30)
• Можно несколько снизить размерность задачи, если рассматривать не все возможные маршруты, а только те, которыецелесообразноиспользовать
• Даже текущая постановка позволяетисключить частьмаршрутов, еслиудалить для нихрасстояние в таблицеданных (значениепо умолчанию оченьвелико)
• Однако, есть болееэлегантное решение
16
![Page 17: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/17.jpg)
Модель 2: множества• Сохраните копию модели 1 под именем transportation2.mod• Мы модифицируем старую модель, чтобы учесть возможность явно задавать списком допустимые
маршруты• На рисунке показан раздел с объявлением множеств в новой версии модели
– Добавилось новое множество – маршруты (ROUTES)– Под маршрутом мы будем понимать пару элементов – (склад, магазин). Именно пары таких
сочетаний являются элементами множества ROUTES– В принципе, для объявления такого двухэлементного множества достаточно было написать:
set ROUTES dimen 2; #элементы множества – это пары значений– В данном случае мы дополнительно указали, что множество ROUTES – это подмножество декартова
произведения множеств WH и MARKETS:𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅 ⊆ 𝑊𝑊𝑊𝑊 × 𝑀𝑀𝑀𝑀𝑅𝑅𝑀𝑀𝑅𝑅𝑅𝑅𝑅𝑅
То есть, в это множество может входить часть или все сочетания склада и магазина. Но, например, пары: (склад, склад) – не подойдут– При нарушении требования к элементам маршрута будет выведено сообщение об ошибке
17
![Page 18: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/18.jpg)
Модель 2: параметры• Измените объявление параметра distance, как показано на рисунке
18
![Page 19: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/19.jpg)
Модель 2: переменные и критерий• Измените объявление переменной trans и выражение для целевой функции, как
показано на рисунке– Теперь переменная определена только на возможных маршрутах, задаваемых множеством ROUTES,
мы рассматриваем не все сочетания складов и магазинов– При определении целевой функции, в сумме, мы, как и раньше вводим индексные переменные.
Однако отличие в том, что теперь мы получаем эти индексы из элементов множества ROUTES: как было определено ранее, это множество состоит из пар: (склад, магазин). Поэтому первый индекс (w) соответствует складу, а второй (m) – магазину. В выражении под знаком суммы отличий нет, мы можем использовать заданные таким образом индексы как обычно
19
![Page 20: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/20.jpg)
Модель 2: ограничения• Выражения для ограничений в новой модели показаны на рисунке:
• Ранее мы рассматривали для каждого склада сумму по всем клиентам. Теперь же для подсчета суммы будут использоваться только те клиенты, к которым заданы маршруты, т.е. в множестве ROUTES к ним есть маршрут, который начинается на этом складе
• Эквивалентная, но более громоздкая запись ограничения – с использованием фильтра:
• Рекомендуем применять краткую форму, показанную вначале
20
![Page 21: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/21.jpg)
Модель 2: вывод решения• Поскольку теперь используются не все маршруты, необходимо модифицировать команды
для вывода решения:
• В коде для вывода таблицы необходимо модифицировать выражение для плана перевозок по маршруту (печать, вложенная в for). Теперь мы используем условное выражение: if условие then формула1 else формула2
• Условное выражение работает подобно функции ЕСЛИ() в Excel: если условие – истина, то результат вычисляется по формуле1, иначе – по формуле 2. В плане для невозможных маршрутов будут стоять нули
21
![Page 22: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/22.jpg)
Модель 2: данные• В разделе данных необходимо изменить
определение параметра distance и задатьэлементы множества допустимых маршрутов(ROUTES)
• Оба этих объекта определяются одновременно,как показано на рисунке
• Первые два значения (строки) – это пара элементовмаршрута (начало и конец), числовое значениев третьем столбце – расстояние
• Обратите внимание на порядок индексов:он должен совпадать с тем, который был указанпри объявлении параметра и множества, т.е.:склад, клиент
22
![Page 23: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/23.jpg)
Модель 2: решение• Для сравнения, на рисунке показаны результаты по моделям 1 и 2• Мы ограничили область допустимых решений, убрав часть маршрутов, поэтому затраты получились выше• Но этот результат точнее отражает наши требования
23
![Page 24: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/24.jpg)
ТРЕТЬЯ МОДЕЛЬ:ИНДЕКСИРОВАННЫЕ МНОЖЕСТВА
24
![Page 25: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/25.jpg)
Модель 3: индексированные множества• Сохраните копию модели под именем transportation3.mod. В этом примере мы немного модифицируем
модель, чтобы сделать более удобной запись ограничений• На рисунке показаны два дополнительных множества, которые создаются на основе списка маршрутов:
– множество CUST задает для каждого склада множество рынков, к которым от этого склада есть маршрут (т.е. это множество возможных клиентов данного склада). Чтобы узнать, кого снабжает склад w, нужно написать: CUST[w]
– множество SUPL задает для каждого рынка множество возможных поставщиков• в MathProg такие индексированные множества называются “indexed collection of sets” – индексированная
коллекция множеств (для краткости будем называть их «индексированные множества»)
25
![Page 26: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/26.jpg)
Оператор setof• Оператор setof очень полезен, т.к. он позволяет конструировать новые множества на основе существующих.
Рассмотрим его работу на примере:
– Мы определяем индексированное множество CUST– Рассматриваются все элементы множества складов WH– Для каждого склада множество клиентов формируется
с помощью оператора setof– В скобках после setof написано выражение,
порождающее некоторое множество. В данномслучае это выражение выбирает из множествамаршрутов все маршруты, которые начинаютсяна складе w
– Маршрут представляет собой пару значений: (склад, рынок). Мы можем ссылаться на эти значения,соответственно, как w и m
– Сразу после скобок {} указан шаблон, который определяет, какие части элементов сгенерированногомножества нам нужны. В данном случае – толькорынок (m)
– В результате для каждого склада получится списокклиентов, которые с него снабжаются. Например,для склада в Чехове получим:CUST[“Чехов”] = “Калуга”, “Рязань”, “Москва”, “Тула” 26
![Page 27: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/27.jpg)
Модель 3: использование индексированных множеств
• Используя созданные нами дополнительные множества, можно более понятно записать ограничения в модели:
• Например, для ограничения по складам, в индексе для суммы теперь явно указано, что необходимо включать все рынки, снабжаемые со склада w – CUST[w]
• Другие элементы модели изменения не требуют. Поскольку мы не меняли математическую постановку, результаты расчета в точности совпадают с прежними
27
![Page 28: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/28.jpg)
Операции с множествами• Полезно знать основные операции с множествами. Рассмотрим их на примере• Пусть 𝑀𝑀 = 𝑎𝑎, 𝑏𝑏, 𝑐𝑐 , 𝐵𝐵 = {𝑏𝑏, 𝑐𝑐,𝑑𝑑}
Операция Результат Математическая запись
Оператор MathProg
Объединение {𝑎𝑎, 𝑏𝑏, 𝑐𝑐,𝑑𝑑} 𝑀𝑀⋃𝐵𝐵 A union B
Пересечение {𝑏𝑏, 𝑐𝑐,𝑑𝑑} 𝑀𝑀⋂𝐵𝐵 A inter B
Декартово произведение
{ 𝑎𝑎, 𝑏𝑏 , 𝑎𝑎, 𝑐𝑐 , 𝑎𝑎,𝑑𝑑 ,𝑏𝑏, 𝑏𝑏 , 𝑏𝑏, 𝑐𝑐 , 𝑏𝑏,𝑑𝑑 ,𝑐𝑐, 𝑏𝑏 , 𝑐𝑐, 𝑐𝑐 , 𝑐𝑐,𝑑𝑑 }
𝑀𝑀 × 𝐵𝐵 A cross B
Разность {𝑎𝑎} 𝑀𝑀\B A diff B
Симметричная разность
{𝑎𝑎,𝑑𝑑} 𝑀𝑀⨁𝐵𝐵 A symdiff B
𝑀𝑀⋃𝐵𝐵 𝑀𝑀⋂𝐵𝐵 𝑀𝑀 × 𝐵𝐵 𝑀𝑀\B 𝑀𝑀⨁𝐵𝐵
(𝑎𝑎, 𝑏𝑏)
28
![Page 29: Тренинг GLPK, часть 3: Транспортная задача](https://reader031.vdocuments.site/reader031/viewer/2022013111/55c5a0febb61eb62468b4681/html5/thumbnails/29.jpg)
Для чего это можно использовать• Операции с множествами очень полезны для приведения данных к нужному формату и удобной записи
компонентов модели• Вспомним, например, задачу о составлении рациона (см. тренинг): в каждом виде корма содержалось
4 компонента: 3 полезных и 1 вредный. Из-за этого пришлось писать «универсальные» ограничения, задающие нижнюю и верхнюю границу на содержание компонента в рационе. Из-за этого потребовалось ввести искусственные границы для максимального содержания компонентов, которые в большинстве случаев не имели смысла
• Теперь эту задачу мы можем решить более адекватно (здесь приведены только измененные компоненты модели и данных):
29