Вторая часть тренинга по решению задач оптимизации в пакете GLPK. На примере задачи о рационе рассматривается работа с параметрами, зависящими от двух множеств. Описаны способы определения данных для таких параметров. Разобрана структура отчета по устойчивости, формируемого GLPK. Описаны приемы форматированного вывода результатов решения задачи с помощью операторов for и printf.
1. Основы моделирования в
пакете GUSEK/GLPK
v 0.3 2015-03-06
Задача о рационе
Двухиндексные задачи
Форматированный вывод
Заходякин Г.В. postlogist@gmail.com
2. План занятия
• Содержательная постановка
• Модель с отдельными ограничениями
• Форматированный вывод на экран
• Двухиндексная модель
• Форматы определения данных
2
3. Содержательная постановка задачи
• Рацион для питания животных на ферме состоит из двух видов кормов A и B.
• Один килограмм корма A стоит 80 ден. ед. и содержит: 1 ед. жиров, 3 ед. белков,
1 ед. углеводов, 2 ед. нитратов. Один килограмм корма B стоит 10 ден. ед. и
содержит 3 ед. жиров, 1 ед. белков, 8 ед. углеводов, 4 ед. нитратов.
• Требуется составить наиболее дешевый рацион питания, обеспечивающий жиров
не менее 6 ед., белков не менее 9 ед., углеводов не менее 8 ед., нитратов не
более 16 ед.
3
5. Концептуальная модель
• Данные для решения задачи в табличном виде:
• Отношения между элементами и свойствами:
Корм A B Требование
Цена 80 10 → min
Жиры 1 3 ≥6
Белки 3 1 ≥ 9
Углеводы 1 8 ≥ 8
Нитраты 2 4 ≤ 16
Элементы множества
Свойства
элемента
A B C …Виды корма
Свойства: Цена Жиры Белки Углеводы Нитраты
Требования
к рациону:
→ min
≥
мин.Ж
≥
мин.Б
≥
мин.У
≤
макс.Н
Решения: Кол-во
5
6. Модель с отдельными ограничениями
• Обозначения для модели:
• Математическая постановка:
A B C …FOOD
Свойства: cost fat prot carb nitr
Требования
к рациону:
→ min ≥ minfat
≥
minprot
≥
mincarb
≤ maxnitr
Решения: buy
(множество)
�
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ⋅ 𝑐𝑐𝑐𝑐𝑐𝑐𝑡𝑡𝑓𝑓 → 𝑚𝑚𝑚𝑚𝑚𝑚
𝑠𝑠. 𝑡𝑡. �
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑓𝑓𝑓𝑓𝑡𝑡𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minfat
𝑠𝑠. 𝑡𝑡. �
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minprot
𝑠𝑠. 𝑡𝑡. �
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ mincarb
𝑠𝑠. 𝑡𝑡. �
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑛𝑛𝑛𝑛𝑛𝑛𝑛𝑛𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≤ 𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚
𝑠𝑠. 𝑡𝑡. 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ 0 ∀𝑓𝑓 ∈ 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
6
7. Подготовка
• Запустите GUSEK и сохраните пустой файл модели под именем korm.mod
(например, на рабочий стол)
– Расширение должно быть обязательно .mod, от этого зависит подсветка
команд и доступный набор действий с файлом
• В этом примере мы будем хранить и модель, и данные в одном
файле
7
8. Компоненты оптимизационной модели
• Для формализации модели на языке моделирования необходимо
определить следующие компоненты:
1. Множества (set) – соответствуют типам объектов в содержательной постановке
задачи – продукты, клиенты, периоды времени, ресурсы и т.п.; содержат
названия или коды этих объектов
2. Параметры (parameter) – содержат количественные характеристики, которые
заранее известны; могут иметь одно значение, или характеризовать каждый
элемент некоторого множества
3. Переменные (var) – содержат неизвестные заранее количественные
характеристики объектов, т.е. решения, которые необходимо принять в задаче
оптимизации
4. Целевая функция (minimize/maximize) – линейное выражение, соответствующее
критерию эффективности в задаче
5. Ограничения (subject to или s.t.) – линейное выражение, соответствующее
некоторому ограничению/требованию
• Порядок определения компонентов произвольный, но компонент,
который включается в выражение, должен быть обязательно уже
определен. Поэтому удобен именно такой порядок определения, как на
этом слайде: параметры и переменные почти всегда зависят от
множеств. Без переменных и параметров невозможно записать ни одно
выражение для целевой функции или ограничений.
8
9. Модель на MathProg: множества и параметры
• Для реализации модели нам необходимо одно множество – FOOD (виды корма):
• Каждый элемент множества (вид корма) обладает набором свойств (содержание
питательных компонентов), которые войдут в модель как параметры,
определенные на множестве FOOD:
• Также существует ряд свойств, которые относятся уже не к отдельным видам
корма, а ко всему рациону в целом (требования к питательности):
• Обратите внимание: MathProg чувствителен к регистру символов.
Имена нужно вводить в точности, как показано на слайде 9
11. Данные для модели
• Ранее мы задавали данные для
модели в такой последовательности:
1. элементы множеств:
set FOOD = A B;
2. параметры:
param cost := A 80 B 10;
param fat := A 1 B 3;
…
• Однако во многих случаях удобнее использовать
табличный формат определения параметров, который позволяет задать все свойства
элементов множеств одновременно:
param : cost fat prot carb nitr :=
A 80 1 3 1 2
B 10 3 1 8 4;
– Для удобства ввода таблицы названия параметров в первой строке, а также значения в каждой строке, разделяются
символами табуляции (клавиша TAB)
• В этом варианте прежде, чем задавать значения параметров, нужно, как и ранее, сначала
задать элементы множеств. Но можно одновременно задать и элементы множеств, и
параметры. Это наиболее удобный способ, который мы и применим в данной модели (см.
следующий слайд)
Корм A B Требование
Цена 80 10 → min
Жиры 1 3 ≥6
Белки 3 1 ≥ 9
Углеводы 1 8 ≥ 8
Нитраты 2 4 ≤ 16
11
12. Данные для модели
• Раздел данных для нашей модели показан на рисунке
– Синтаксис для одновременного определения элементов множества и их свойств:
param : множество : свойство1 свойство 2 :=
элемент1 знач11 знач12
элемент2 знач21 знач22;
– Стрелки на рисунке обозначают символы табуляции. Их отображением можно
управлять с помощью команды меню: View>Whitespace
12
13. Расчет модели
• Включите создание файлов с отчетами по решению
(Tools>Generate Output File on Go)
и устойчивости (Tools>Generate LP Sensitivity Analysis)
и запустите модель
13
14. Отчёт по решению
Activity – ЛЧ ограничения, либо переменная решения
Lower/Upper Bound – границы для переменной/ЛЧ
Marginal – теневая цена
St – статус переменной(ограничения):
• B – базисная (не связывающее ограничение),
• NU – связывающее ограничение-неравенство,
достигнут верхний предел ЛЧ,
• NL – то же, достигнут нижний предел ЛЧ
• NS – связывающее ограничение-равенство
Минимальная стоимость рациона (190) достигается при покупке 2 единиц корма A и 3 единиц
корма B. Связывающие ограничения – по белкам и нитратам. Информация о теневых ценах
ограничений приведена в столбце Marginal. При увеличении минимального содержания белка на
1 стоимость рациона вырастет на 30 единиц. При увеличении максимального содержания
нитратов на 1 стоимость рациона упадет на 5 единиц. Дополнительная информация приведена в
отчете по устойчивости (см. следующий слайд).
14
15. Отчёт по устойчивости (1)
В первой части отчёта – анализ чувствительности к изменению ограничений:
• Значение левой части ограничения в оптимальном решении (Activity)
• Остаток (Slack) или теневая цена (Marginal)
• Диапазон изменения правой части ограничения (Activity range): в первой строке – минимальное, во второй
строке – максимальное
• Ограничение, которое становится активным при граничных значениях правой части (Limiting Variable) -
базисная переменная, достигшая одной из своих границ
• Для связывающего ограничения по белкам (Prot) мы видим:
• Теневая цена: 30 – на столько увеличится стоимость рациона при увеличении минимального
содержания белка
• Теневая цена постоянна при изменении требования от 4 до 24 единиц. При снижении требований
по содержанию белка до 4 единиц будет уменьшаться количество корма A в рационе (он более богат
белком и стоит дороже). При нижнем граничном значении этот корм не будет приобретаться вообще.
15
16. Интерпретация отчета по устойчивости
• Рассмотрим связывающее ограничение по белкам (Prot):
• Теневая цена (Marginal): 30 – на столько увеличится стоимость рациона при увеличении минимального
содержания белка
• Теневая цена постоянна при изменении требования от 4 до 24 единиц (Activity Range).
• При снижении требований по содержанию белка до 4 единиц будет уменьшаться количество корма A
в рационе (он более богат белком и стоит дороже). На нижней границе этот корм не будет
приобретаться вообще. Связывающим ограничением станет условие неотрицательности для
количества корма A.
• При увеличении требований по белку до 24 единиц будет увеличиваться количество корма A. Однако,
поскольку этот корм беден углеводами, связывающим ограничением станет требование по
минимальному содержанию углеводов в рационе
Корм A B Требование
Цена 80 10 → min
Белки 3 1 ≥ 9
Углеводы 1 8 ≥ 8
16
17. Отчёт по устойчивости (2)
Во второй части отчёта – анализ чувствительности к изменению целевых
коэффициентов
• оптимальное значение переменной решения (Activity)
• целевой коэффициент (Obj coef) или теневая цена для границы (Marginal)
• диапазон изменения целевого коэффициента (Obj coef range): в первой строке – минимальное
значение, во второй строке – максимальное
• оптимальные значения переменной решения при граничных значениях целевого
коэффициента (Activity range)
• значения целевой функции при граничных значениях (Obj value at break point)
• ограничение, которое становится активным при граничных значениях целевого коэффициента
(Limiting Variable)
17
18. Форматированный вывод результатов
• Ранее мы использовали для вывода результатов команду display, которая выводит в консоль значения
указанных переменных:
• Недостатком display является то, что она выводит все значения переменных по отдельности. Это
неудобно, если данных много.
• Более читаемые результаты решения можно получить с помощью команды printf, которая используется
для форматированного вывода
• После printf необходимо указать в кавычках (одинарных или двойных) строку для вывода на печать:
• При выводе через printf переход на следующую строку автоматически не производится. Следующая
команда продолжит ту же строку (обратите внимание, что пробел также не был добавлен):
• Чтобы принудительно перевести строку, необходимо вставить в текст символ n:
• Обратную черту можно использовать и для вывода других специальных символов, например,
табуляции: t. Для вывода обратной черты нужно писать: 18
19. Шаблоны форматов printf
• Мощь printf в том, что эта команда позволяет формировать строку для вывода по шаблону.
Вы можете включить в текст строки спецификаторы форматов (шаблоны) для вычисляемых
результатов, которые при выводе будут заменены на результаты вычислений. Формулы для
вычисления нужно записать после строки-шаблона через запятую
– Вывод строки (%s):
– Строка, которая подставляется вместо %s, получена сцеплением нескольких строк (&)
– Действительное число (%f):
– Округление до заданного числа знаков после запятой (2 знака):
– Вывод в поле заданной ширины (5 знаков):
19
20. Спецификаторы форматов printf
Подробнее – см. здесь: http://www.mir-koda.ru/full_leson_cpp.php?id=6
Спецификатор Значение
%s строка
%5s строка фиксированной длины – 5 символов
%-5s строка длиной 5 символов, выравнивание по левому краю
%d целое число
%f действительное число с плавающей точкой
%.2f то же, точность 2 десятичных знака
%5.2f то же, фиксированная ширина шаблона – 6 символов (с точкой)
%g действительное число, при необходимости используется
экспоненциальный формат
%.2g то же, точность 2 значащие цифры
%% символ процента %
20
21. Использование printf в MathProg
• Разумеется, выражения, которые подставляются в строку, могут быть вычислены и с
использованием компонентов модели
• Обычно printf используется совместно с индексными выражениями (например, {f in FOOD})
• На рисунке показана команда, позволяющая получить отформатированный отчет по
решению задачи о рационе:
21
23. Концептуальная модель
• При разработке предыдущей модели мы выделили одно множество – множество видов корма (т.е.
физических объектов). Но в качестве множества можно рассматривать также и множество свойств
каждого вида корма. Некоторые из свойств – содержание компонентов – очень похожи между собой.
• Новая схема отношений между видами корма и их свойствами:
Корм A B Требование
Цена 80 10 → min
Жиры 1 3 ≥6
Белки 3 1 ≥ 9
Углеводы 1 8 ≥ 8
Нитраты 2 4 ≤ 16
Множество видов корма
Множество
компонентов
A B C …Виды корма
Компоненты:
Цена
Жиры Белки Углеводы Нитраты
Содержание в рационе мин макс
Кол-во
Содержание
Решение
Свойство компонента
Свойство корма
Свойство компонента корма
23
24. Двухиндексная модель
• Обозначения для модели:
• Математическая постановка:
�
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ⋅ 𝑐𝑐𝑐𝑐𝑐𝑐𝑡𝑡𝑓𝑓 → 𝑚𝑚𝑚𝑚𝑚𝑚
𝑠𝑠. 𝑡𝑡. ∀𝑐𝑐 ∈ 𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶:
𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑚𝑡𝑡𝑐𝑐 ≤ �
𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑐𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≤ maxcontc
𝑠𝑠. 𝑡𝑡. 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ 0 ∀𝑓𝑓 ∈ 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹
A B C …FOOD
COMP
cost
fat prot carb nitr
mincont maxcont
buy
content
24
25. MathProg: множества и параметры двухиндексной модели
• Создайте новую модель – korm2sets.mod
• На рисунке показаны объявления множеств и компонентов новой модели
– Множества теперь два – корма и компоненты
– Некоторые параметры характеризуют только корм, некоторые – только компонент, некоторые –
сочетание компонента и корма
– Для упрощения записи ограничений, нам пришлось с каждым компонентом связать два параметра –
минимальное и максимальное значение (в исходной постановке было только одно)
– Для содержания компонентов в рационе заданы удобные значения по умолчанию (default);
9999 – это искусственная граница, достаточно большое число, которое гарантированно не будет
достигнуто в данной задаче. Т.е., если максимальное содержание компонента не будет явно задано
в данных, то ограничение, фактически, никак не будет влиять на решение
– Для максимального содержания компонента задана проверка: для любого компонента этот
параметр не может быть меньше, чем минимальное содержание
25
26. MathProg: двухиндексная модель
• Формализация двухиндексной модели приведена на рисунке
– Content – это не одно ограничение, а множество ограничений: ограничение по составу задается
для каждого компонента
– Множество ограничений создается благодаря использованию индексирующего выражения
{c in COMP} после имени ограничения
– Обратите внимание, что при использовании параметра content, который зависит от двух множеств,
мы использовали порядок индексов – компонент, корм. Так необходимо делать, потому что мы
определили именно такой порядок индексов для этого параметра (см. предыдущий слайд)
26
27. Данные для двухиндексной модели
• Данные для двухиндексной модели
показаны на рисунке
– Для кормов мы сразу задали и элементы множества,
и их стоимость
– Для компонентов мы поступили так же,
отличие лишь в том, что у элементов этого
множества – два свойства (параметра)
– Обратите внимание, что значения параметров
для компонентов, которые не требуется задавать,
обозначены точками. Нельзя просто пропустить их.
– Для параметра content используется табличный (2D)
формат определения значений
27
28. Реляционный формат данных
• На рисунке показан альтернативный способ определения значений параметра – реляционный (relation –
англ. отношение)
• При реляционном способе данные хранятся в виде плоских (одномерных) таблиц. Единственным
измерением в таких таблицах являются строки. А для уникальной идентификации строк используются
ключевые столбцы (один или несколько).
• В этом примере ключевыми столбцами являются 1 и 2 (компоненты и виды корма). Именно свойства
отношения между этими объектами – содержание компонента в корме - записаны в таблице.
Таких свойств может быть и больше (в этом случае добавляются дополнительные столбцы)
• В противоположность реляционному формату, на предыдущем слайде мы использовали
двухмерный формат для параметра content:
таблица имела два измерения – компонент и вид корма
• Реляционный формат выгодно использовать по нескольким причинам:
– именно в этом формате хранятся данные в учетных системах
предприятий и базах данных;
– если какие-то сочетания элементов множеств в ключевых
столбцах не имеют смысла, то их не нужно указывать в таблице;
в двухмерной же таблице должны быть все возможные сочетания
элементов индексирующих множеств;
– в отношение могут вступать три и более множеств, в этом случае
табличный формат использовать невозможно
• Свойства кормов и компонентов мы также задавали в реляционном
формате (в этих таблицах был один ключевой столбец)
28
29. Использование данных из внешнего файла
• При сценарном анализе часто необходимо рассчитывать одну и ту же модель для разных наборов
исходных данных. Поэтому целесообразно разделять данные и модель и хранить их в различных файлах.
GUSEK, как и другие подобные инструменты, позволяет легко заменять файлы данных и находить
решение в новой ситуации
• Создайте в GUSEK новый файл и сохраните его как korm2sets.dat в ту же папку, где находится модель
• При запуске модели данные будут браться из этого файла. Внешний файл данных имеет приоритет над
данными в файле с моделью. Убедитесь в этом, изменив какие-либо параметры в файле и запустив
модель повторно (не забудьте вернуть измененные числа обратно)
• Файл данных не обязательно
называть так же, как и файл
с моделью. Но в этом случае
его имя должно быть явно
указано в настройках GUSEK
• Чтобы назначить другой
файл данных, откройте его
в GUSEK и выполните
команду:
Tools> Set as Default .dat File
29
31. Форматированный вывод решения
• Поскольку мы представили компоненты кормов как множество, нам больше не
нужно выводить их свойства по отдельности. Вывод таблицы с решением можно
автоматизировать, используя команду printf.
• Добавьте показанные на рисунке команды в файл korm2sets.mod, чтобы получить
форматированный отчет по решению
31
32. Форматированный вывод таблиц: for
• При большом объеме данных для анализа результатов удобно использовать табличный
формат данных. Таблица состоит из столбцов фиксированной ширины. Значения в столбцах
выводятся с помощью команды printf. Строки таблицы можно получить, многократно
применяя команду printf для каждого элемента множества (в данном случае – множества
COMP). Разумеется, не требуется указывать индекс каждого элемента вручную.
Автоматизировать перебор значений помогает команда for
• Команда for повторяет какое-либо действие несколько раз. Количество повторений
определяется индексирующим выражением после for. Набор действий, которые должны
повторяться, указывают в фигурных скобках после for:
Заголовок
11
симв.
4 симв.,
∀ корм
7
симв.
5
симв.
5
симв.
∀компонент
32
33. Форматированный вывод таблиц: for
• Добавьте показанные на рисунке команды для вывода таблицы с отчетом по содержанию
компонентов в рационе
Заголовок
11
симв.
4 симв.,
∀ корм
7
симв.
5
симв.
5
симв.
∀компонент
33