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

33
Основы моделирования в пакете GUSEK/GLPK v 0.3 2015-03-06 Задача о рационе Двухиндексные задачи Форматированный вывод Заходякин Г.В. [email protected]

Upload: gleb-zakhodyakin

Post on 08-Aug-2015

110 views

Category:

Data & Analytics


27 download

TRANSCRIPT

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

Основы моделирования в пакете GUSEK/GLPK

v 0.3 2015-03-06

Задача о рационеДвухиндексные задачи

Форматированный вывод

Заходякин Г.В. [email protected]

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

План занятия• Содержательная постановка• Модель с отдельными ограничениями• Форматированный вывод на экран• Двухиндексная модель• Форматы определения данных

2

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

Содержательная постановка задачи• Рацион для питания животных на ферме состоит из двух видов кормов A и B.• Один килограмм корма A стоит 80 ден. ед. и содержит: 1 ед. жиров, 3 ед. белков,

1 ед. углеводов, 2 ед. нитратов. Один килограмм корма B стоит 10 ден. ед. и содержит 3 ед. жиров, 1 ед. белков, 8 ед. углеводов, 4 ед. нитратов.

• Требуется составить наиболее дешевый рацион питания, обеспечивающий жиров не менее 6 ед., белков не менее 9 ед., углеводов не менее 8 ед., нитратов не более 16 ед.

3

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

МОДЕЛЬ С ОТДЕЛЬНЫМИ ОГРАНИЧЕНИЯМИ

4

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

Концептуальная модель• Данные для решения задачи в табличном виде:

• Отношения между элементами и свойствами:

Корм A B ТребованиеЦена 80 10 → minЖиры 1 3 ≥6Белки 3 1 ≥ 9Углеводы 1 8 ≥ 8Нитраты 2 4 ≤ 16

Элементы множества

Свой

ства

элем

ента

A B C …Виды корма

Свойства: Цена Жиры Белки Углеводы Нитраты

Требованияк рациону:

→ min ≥мин.Ж

≥мин.Б

≥мин.У

≤ макс.Н

Решения: Кол-во

5

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

Модель с отдельными ограничениями• Обозначения для модели:

• Математическая постановка:

A B C …FOOD

Свойства: cost fat prot carb nitr

Требованияк рациону: → min ≥ minfat ≥

minprot≥

mincarb ≤ maxnitr

Решения: buy

(множество)

�𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ⋅ 𝑐𝑐𝑐𝑐𝑐𝑐𝑡𝑡𝑓𝑓 → 𝑚𝑚𝑚𝑚𝑚𝑚

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑓𝑓𝑓𝑓𝑡𝑡𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minfat

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑝𝑝𝑝𝑝𝑐𝑐𝑡𝑡𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minprot

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑐𝑐𝑓𝑓𝑝𝑝𝑏𝑏𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ mincarb

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑚𝑚𝑚𝑚𝑡𝑡𝑝𝑝𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≤ 𝑚𝑚𝑓𝑓𝑚𝑚𝑚𝑚𝑚𝑚𝑡𝑡𝑝𝑝

𝑐𝑐. 𝑡𝑡. 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ 0 ∀𝑓𝑓 ∈ 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

6

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

Подготовка• Запустите GUSEK и сохраните пустой файл модели под именем korm.mod

(например, на рабочий стол)– Расширение должно быть обязательно .mod, от этого зависит подсветка

команд и доступный набор действий с файлом

• В этом примере мы будем хранить и модель, и данные в одном файле

7

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

Компоненты оптимизационной модели• Для формализации модели на языке моделирования необходимо

определить следующие компоненты:1. Множества (set) – соответствуют типам объектов в содержательной постановке

задачи – продукты, клиенты, периоды времени, ресурсы и т.п.; содержат названия или коды этих объектов

2. Параметры (parameter) – содержат количественные характеристики, которые заранее известны; могут иметь одно значение, или характеризовать каждый элемент некоторого множества

3. Переменные (var) – содержат неизвестные заранее количественные характеристики объектов, т.е. решения, которые необходимо принять в задаче оптимизации

4. Целевая функция (minimize/maximize) – линейное выражение, соответствующее критерию эффективности в задаче

5. Ограничения (subject to или s.t.) – линейное выражение, соответствующее некоторому ограничению/требованию

• Порядок определения компонентов произвольный, но компонент, который включается в выражение, должен быть обязательно уже определен. Поэтому удобен именно такой порядок определения, как на этом слайде: параметры и переменные почти всегда зависят от множеств. Без переменных и параметров невозможно записать ни одно выражение для целевой функции или ограничений.

8

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

Модель на MathProg: множества и параметры• Для реализации модели нам необходимо одно множество – FOOD (виды корма):

• Каждый элемент множества (вид корма) обладает набором свойств (содержание питательных компонентов), которые войдут в модель как параметры, определенные на множестве FOOD:

• Также существует ряд свойств, которые относятся уже не к отдельным видам корма, а ко всему рациону в целом (требования к питательности):

• Обратите внимание: MathProg чувствителен к регистру символов. Имена нужно вводить в точности, как показано на слайде 9

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

Модель на MathProg: постановка• Математическая модель приведена на рисунке:

�𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ⋅ 𝑐𝑐𝑐𝑐𝑐𝑐𝑡𝑡𝑓𝑓 → 𝑚𝑚𝑚𝑚𝑚𝑚

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑓𝑓𝑓𝑓𝑡𝑡𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minfat

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑝𝑝𝑝𝑝𝑐𝑐𝑡𝑡𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ minprot

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑐𝑐𝑓𝑓𝑝𝑝𝑏𝑏𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ mincarb

𝑐𝑐. 𝑡𝑡. �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑚𝑚𝑚𝑚𝑡𝑡𝑝𝑝𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≤ 𝑚𝑚𝑓𝑓𝑚𝑚𝑚𝑚𝑚𝑚𝑡𝑡𝑝𝑝

𝑐𝑐. 𝑡𝑡. 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ 0 ∀𝑓𝑓 ∈ 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

10

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

Данные для модели• Ранее мы задавали данные для

модели в такой последовательности: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 2B 10 3 1 8 4;

– Для удобства ввода таблицы названия параметров в первой строке, а также значения в каждой строке, разделяются символами табуляции (клавиша TAB)

• В этом варианте прежде, чем задавать значения параметров, нужно, как и ранее, сначала задать элементы множеств. Но можно одновременно задать и элементы множеств, и параметры. Это наиболее удобный способ, который мы и применим в данной модели (см. следующий слайд)

Корм A B ТребованиеЦена 80 10 → minЖиры 1 3 ≥6Белки 3 1 ≥ 9Углеводы 1 8 ≥ 8Нитраты 2 4 ≤ 16

11

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

Данные для модели• Раздел данных для нашей модели показан на рисунке

– Синтаксис для одновременного определения элементов множества и их свойств:param : множество : свойство1 свойство 2 :=

элемент1 знач11 знач12элемент2 знач21 знач22;

– Стрелки на рисунке обозначают символы табуляции. Их отображением можно управлять с помощью команды меню: View>Whitespace

12

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

Расчет модели• Включите создание файлов с отчетами по решению

(Tools>Generate Output File on Go)и устойчивости (Tools>Generate LP Sensitivity Analysis)и запустите модель

13

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

Отчёт по решениюActivity – ЛЧ ограничения, либо переменная решенияLower/Upper Bound – границы для переменной/ЛЧMarginal – теневая ценаSt – статус переменной(ограничения): • B – базисная (не связывающее ограничение), • NU – связывающее ограничение-неравенство,

достигнут верхний предел ЛЧ, • NL – то же, достигнут нижний предел ЛЧ• NS – связывающее ограничение-равенство

Минимальная стоимость рациона (190) достигается при покупке 2 единиц корма A и 3 единиц корма B. Связывающие ограничения – по белкам и нитратам. Информация о теневых ценах ограничений приведена в столбце Marginal. При увеличении минимального содержания белка на 1 стоимость рациона вырастет на 30 единиц. При увеличении максимального содержания нитратов на 1 стоимость рациона упадет на 5 единиц. Дополнительная информация приведена в отчете по устойчивости (см. следующий слайд).

14

Presenter
Presentation Notes
Создаётся, если установлен флаг Tools>Generate Output File on Go Подробнее см. здесь http://en.wikibooks.org/wiki/GLPK/Solution_information#Sensitivity_analysis_report Ещё более подробно – см. файл GLPK.pdf, прилагающийся к программе
Page 15: Тренинг GLPK, часть 2: Двухиндексные задачи

Отчёт по устойчивости (1)

В первой части отчёта – анализ чувствительности к изменению ограничений:• Значение левой части ограничения в оптимальном решении (Activity)• Остаток (Slack) или теневая цена (Marginal)• Диапазон изменения правой части ограничения (Activity range): в первой строке – минимальное, во второй

строке – максимальное• Ограничение, которое становится активным при граничных значениях правой части (Limiting Variable) -

базисная переменная, достигшая одной из своих границ• Для связывающего ограничения по белкам (Prot) мы видим:

• Теневая цена: 30 – на столько увеличится стоимость рациона при увеличении минимального содержания белка

• Теневая цена постоянна при изменении требования от 4 до 24 единиц. При снижении требованийпо содержанию белка до 4 единиц будет уменьшаться количество корма A в рационе (он более богат белком и стоит дороже). При нижнем граничном значении этот корм не будет приобретаться вообще.

15

Presenter
Presentation Notes
Более подробно – см. файл GLPK.pdf, прилагающийся к программе
Page 16: Тренинг GLPK, часть 2: Двухиндексные задачи

Интерпретация отчета по устойчивости

• Рассмотрим связывающее ограничение по белкам (Prot):• Теневая цена (Marginal): 30 – на столько увеличится стоимость рациона при увеличении минимального

содержания белка• Теневая цена постоянна при изменении требования от 4 до 24 единиц (Activity Range). • При снижении требований по содержанию белка до 4 единиц будет уменьшаться количество корма A

в рационе (он более богат белком и стоит дороже). На нижней границе этот корм не будет приобретаться вообще. Связывающим ограничением станет условие неотрицательности для количества корма A.

• При увеличении требований по белку до 24 единиц будет увеличиваться количество корма A. Однако, поскольку этот корм беден углеводами, связывающим ограничением станет требование по минимальному содержанию углеводов в рационе

Корм A B ТребованиеЦена 80 10 → minБелки 3 1 ≥ 9Углеводы 1 8 ≥ 8

16

Presenter
Presentation Notes
Более подробно – см. файл GLPK.pdf, прилагающийся к программе
Page 17: Тренинг GLPK, часть 2: Двухиндексные задачи

Отчёт по устойчивости (2)

Во второй части отчёта – анализ чувствительности к изменению целевых коэффициентов• оптимальное значение переменной решения (Activity)• целевой коэффициент (Obj coef) или теневая цена для границы (Marginal)• диапазон изменения целевого коэффициента (Obj coef range): в первой строке – минимальное

значение, во второй строке – максимальное• оптимальные значения переменной решения при граничных значениях целевого

коэффициента (Activity range)• значения целевой функции при граничных значениях (Obj value at break point)• ограничение, которое становится активным при граничных значениях целевого коэффициента

(Limiting Variable)

17

Presenter
Presentation Notes
Более подробно – см. файл GLPK.pdf, прилагающийся к программе
Page 18: Тренинг GLPK, часть 2: Двухиндексные задачи

Форматированный вывод результатов• Ранее мы использовали для вывода результатов команду display, которая выводит в консоль значения

указанных переменных:

• Недостатком display является то, что она выводит все значения переменных по отдельности. Это неудобно, если данных много.

• Более читаемые результаты решения можно получить с помощью команды printf, которая используется для форматированного вывода

• После printf необходимо указать в кавычках (одинарных или двойных) строку для вывода на печать:

• При выводе через printf переход на следующую строку автоматически не производится. Следующая команда продолжит ту же строку (обратите внимание, что пробел также не был добавлен):

• Чтобы принудительно перевести строку, необходимо вставить в текст символ \n:

• Обратную черту можно использовать и для вывода других специальных символов, например, табуляции: \t. Для вывода обратной черты нужно писать: \\ 18

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

Шаблоны форматов printf• Мощь printf в том, что эта команда позволяет формировать строку для вывода по шаблону.

Вы можете включить в текст строки спецификаторы форматов (шаблоны) для вычисляемых результатов, которые при выводе будут заменены на результаты вычислений. Формулы для вычисления нужно записать после строки-шаблона через запятую

– Вывод строки (%s):

– Строка, которая подставляется вместо %s, получена сцеплением нескольких строк (&)– Действительное число (%f):

– Округление до заданного числа знаков после запятой (2 знака):

– Вывод в поле заданной ширины (5 знаков):

19

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

Спецификаторы форматов 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

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

Использование printf в MathProg• Разумеется, выражения, которые подставляются в строку, могут быть вычислены и с

использованием компонентов модели• Обычно printf используется совместно с индексными выражениями (например, {f in FOOD})• На рисунке показана команда, позволяющая получить отформатированный отчет по

решению задачи о рационе:

21

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

ДВУХИНДЕКСНАЯ МОДЕЛЬ

22

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

Концептуальная модель• При разработке предыдущей модели мы выделили одно множество – множество видов корма (т.е.

физических объектов). Но в качестве множества можно рассматривать также и множество свойствкаждого вида корма. Некоторые из свойств – содержание компонентов – очень похожи между собой.

• Новая схема отношений между видами корма и их свойствами:

Корм A B ТребованиеЦена 80 10 → minЖиры 1 3 ≥6Белки 3 1 ≥ 9Углеводы 1 8 ≥ 8Нитраты 2 4 ≤ 16

Множество видов корма

Мно

жес

тво

ком

поне

нтов

A B C …Виды корма

Компоненты:

Цена

Жиры Белки Углеводы Нитраты

Содержание в рационе мин макс

Кол-во

Содержание

Решение

Свойство компонента

Свойство корма

Свойство компонента корма

23

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

Двухиндексная модель• Обозначения для модели:

• Математическая постановка:

�𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ⋅ 𝑐𝑐𝑐𝑐𝑐𝑐𝑡𝑡𝑓𝑓 → 𝑚𝑚𝑚𝑚𝑚𝑚

𝑐𝑐. 𝑡𝑡.∀𝑐𝑐 ∈ 𝐶𝐶𝐹𝐹𝐶𝐶𝐶𝐶:

𝑚𝑚𝑚𝑚𝑚𝑚𝑐𝑐𝑐𝑐𝑚𝑚𝑡𝑡𝑐𝑐 ≤ �𝑓𝑓∈𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

𝑐𝑐𝑓𝑓𝑝𝑝𝑏𝑏𝑓𝑓 ⋅ 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≤ maxcontc

𝑐𝑐. 𝑡𝑡. 𝑏𝑏𝑏𝑏𝑦𝑦𝑓𝑓 ≥ 0 ∀𝑓𝑓 ∈ 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹

A B C …FOOD

COMP

cost

fat prot carb nitr

mincont maxcont

buy

content

24

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

MathProg: множества и параметры двухиндексной модели

• Создайте новую модель – korm2sets.mod• На рисунке показаны объявления множеств и компонентов новой модели

– Множества теперь два – корма и компоненты– Некоторые параметры характеризуют только корм, некоторые – только компонент, некоторые –

сочетание компонента и корма– Для упрощения записи ограничений, нам пришлось с каждым компонентом связать два параметра –

минимальное и максимальное значение (в исходной постановке было только одно)– Для содержания компонентов в рационе заданы удобные значения по умолчанию (default);

9999 – это искусственная граница, достаточно большое число, которое гарантированно не будет достигнуто в данной задаче. Т.е., если максимальное содержание компонента не будет явно задано в данных, то ограничение, фактически, никак не будет влиять на решение

– Для максимального содержания компонента задана проверка: для любого компонента этот параметр не может быть меньше, чем минимальное содержание

25

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

MathProg: двухиндексная модель• Формализация двухиндексной модели приведена на рисунке

– Content – это не одно ограничение, а множество ограничений: ограничение по составу задается для каждого компонента

– Множество ограничений создается благодаря использованию индексирующего выражения{c in COMP} после имени ограничения

– Обратите внимание, что при использовании параметра content, который зависит от двух множеств, мы использовали порядок индексов – компонент, корм. Так необходимо делать, потому что мы определили именно такой порядок индексов для этого параметра (см. предыдущий слайд)

26

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

Данные для двухиндексной модели• Данные для двухиндексной модели

показаны на рисунке– Для кормов мы сразу задали и элементы множества,

и их стоимость– Для компонентов мы поступили так же,

отличие лишь в том, что у элементов этогомножества – два свойства (параметра)

– Обратите внимание, что значения параметровдля компонентов, которые не требуется задавать,обозначены точками. Нельзя просто пропустить их.

– Для параметра content используется табличный (2D)формат определения значений

27

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

Реляционный формат данных• На рисунке показан альтернативный способ определения значений параметра – реляционный (relation –

англ. отношение)• При реляционном способе данные хранятся в виде плоских (одномерных) таблиц. Единственным

измерением в таких таблицах являются строки. А для уникальной идентификации строк используются ключевые столбцы (один или несколько).

• В этом примере ключевыми столбцами являются 1 и 2 (компоненты и виды корма). Именно свойства отношения между этими объектами – содержание компонента в корме - записаны в таблице. Таких свойств может быть и больше (в этом случае добавляются дополнительные столбцы)

• В противоположность реляционному формату, на предыдущем слайде мы использовалидвухмерный формат для параметра content:таблица имела два измерения – компонент и вид корма

• Реляционный формат выгодно использовать по нескольким причинам:– именно в этом формате хранятся данные в учетных системах

предприятий и базах данных;– если какие-то сочетания элементов множеств в ключевых

столбцах не имеют смысла, то их не нужно указывать в таблице; в двухмерной же таблице должны быть все возможные сочетанияэлементов индексирующих множеств;

– в отношение могут вступать три и более множеств, в этом случаетабличный формат использовать невозможно

• Свойства кормов и компонентов мы также задавали в реляционномформате (в этих таблицах был один ключевой столбец)

28

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

Использование данных из внешнего файла• При сценарном анализе часто необходимо рассчитывать одну и ту же модель для разных наборов

исходных данных. Поэтому целесообразно разделять данные и модель и хранить их в различных файлах. GUSEK, как и другие подобные инструменты, позволяет легко заменять файлы данных и находить решение в новой ситуации

• Создайте в GUSEK новый файл и сохраните его как korm2sets.dat в ту же папку, где находится модель• При запуске модели данные будут браться из этого файла. Внешний файл данных имеет приоритет над

данными в файле с моделью. Убедитесь в этом, изменив какие-либо параметры в файле и запустив модель повторно (не забудьте вернуть измененные числа обратно)

• Файл данных не обязательноназывать так же, как и файлс моделью. Но в этом случаеего имя должно быть явно указано в настройках GUSEK

• Чтобы назначить другойфайл данных, откройте егов GUSEK и выполнитекоманду:Tools> Set as Default .dat File

29

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

Использование внешних данных

korm2sets.mod

korm2sets.dat

korm2sets.mod

korm2sets_new.dat

30

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

Форматированный вывод решения• Поскольку мы представили компоненты кормов как множество, нам больше не

нужно выводить их свойства по отдельности. Вывод таблицы с решением можно автоматизировать, используя команду printf.

• Добавьте показанные на рисунке команды в файл korm2sets.mod, чтобы получить форматированный отчет по решению

31

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

Форматированный вывод таблиц: for• При большом объеме данных для анализа результатов удобно использовать табличный

формат данных. Таблица состоит из столбцов фиксированной ширины. Значения в столбцах выводятся с помощью команды printf. Строки таблицы можно получить, многократно применяя команду printf для каждого элемента множества (в данном случае – множества COMP). Разумеется, не требуется указывать индекс каждого элемента вручную. Автоматизировать перебор значений помогает команда for

• Команда for повторяет какое-либо действие несколько раз. Количество повторений определяется индексирующим выражением после for. Набор действий, которые должны повторяться, указывают в фигурных скобках после for:

Заголовок

11 симв.

4 симв., ∀ корм

7симв.

5симв.

5симв.

∀компонент

32

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

Форматированный вывод таблиц: for• Добавьте показанные на рисунке команды для вывода таблицы с отчетом по содержанию

компонентов в рационе

Заголовок

11 симв.

4 симв., ∀ корм

7симв.

5симв.

5симв.

∀компонент

33