Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Тренинг GLPK, часть 2: Двухиндексные задачи

624 views

Published on

Вторая часть тренинга по решению задач оптимизации в пакете GLPK. На примере задачи о рационе рассматривается работа с параметрами, зависящими от двух множеств. Описаны способы определения данных для таких параметров. Разобрана структура отчета по устойчивости, формируемого GLPK. Описаны приемы форматированного вывода результатов решения задачи с помощью операторов for и printf.

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

Тренинг GLPK, часть 2: Двухиндексные задачи

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

×