Читайте также:
|
|
Функциями поэлементной обработки множеств (ФПЭМ) являются @FOR, @SUM, @MIN и @ MAX. Синтаксис всех этих функций следующий:
ФПЭМ(множество (список индексов) | квалификатор_условия: выражение);
… где и список_индексов и квалификтор_условия являются не обязательными. Важно помнить, что вы можете использовать в выражении имя множества и имена атрибутов, любые другие переменные или любые операции, выполняемые над ними. Напрример,
@SUM(WIDGETS: VALUE);
вернет выражение для суммы атрибутов VALUE для всех элементов множества WIDGETS. Функция @MIN с теми же аргументами вернет наименьшее значение VALUE среди элементов множества WIDGETS, а функция @MAX с теми же аргументами вернет наибольшее значение.
Так же, как и @FOR, все остальные функции поэлементной обработки множеств могут использовать условные выражения.
Нижеприведенная модель планирования расписания на следующей странице иллюстрирует использование условных выражений в функции @SUM. В этой задаче требуется присутствие на работе определенное количество людей в каждый из дней недели. Каждый служащий работает в течение пяти последовательных дней. Решение задачи должно дать нам количество людей, начинающих работу в каждый из дней недели (количество нанимаемых в этот день рабочих), чтобы удовлетворить недельную потребность при минимальных затратах.
В задаче количество служащих, необходимых для обеспечения работы в каждый из дней, хранится в атрибуте NEED. Результат будет помещен в атрибут START. Каждый элемент NEED и START соответствует дням недели. Неделя начинается с Monday (понедельник) и заканчивается в Sunday (воскресенье).
MODEL:
1]! задача планирования расписания:
2] каждый сотрудник занят пять последовательных дней и свободен два дня. Матрица коэффициентов этого ограничения:
4] 1 1 1 1 1
5] 1 1 1 1 1
6] 1 1 1 1 1
7] 1 1 1 1 1
8] 1 1 1 1 1
9] 1 1 1 1 1
10] 1 1 1 1 1
11] эта матрица используется в операторах с условиями
12] в строках 22 - 27;
13] SETS:
14] DAYS / MON, TUE, WED, THU, FRI, SAT, SUN/:
15] NEED, START;
16] ENDSETS
17]
18]! Целевая функция;
19] MIN = @SUM(DAYS: START);
20]
21]! Ограничения;
22] @FOR(DAYS(I):
23]! Сумма по всем сотрудника, начинающий в J – й день,
24] которые работают в день I;
25] @SUM(DAYS(J) |
26] (J #GT# I+2) #OR# (J #LE# I #AND# J #GT# I-5):
27] START(J)) >= NEED(I););
28]
29] DATA:
30] NEED = 18, 16, 15, 16, 19, 14, 12;
31] ENDDATA
END
Строки 22–27 устанавливают ограничения: в каждый из дней, сумма сотрудников, работающих в этот день, должна быть больше или равна (напомним, что оператор >= в LINGO означает больше или равно) необходимого в этот день количества работников. Условие
(J #GT# I+2) #OR# (J #LE# I #AND# J #GT# I-5)
… используется в функции @SUM таким образом, что мы не принимаем в расчет два дня, в течение которых каждый сотрудник отдыхает.
Решение приведено ниже:
OPTIMUM FOUND AT STEP 7
SOLUTION OBJECTIVE VALUE = 22.0000000
VARIABLE VALUE REDUCED COST
NEED(MON) 18.00000.0000000
NEED(TUE) 16.00000.0000000
NEED(WED) 15.00000.0000000
NEED(THU) 16.00000.0000000
NEED(FRI) 19.00000.0000000
NEED(SAT) 14.00000.0000000
NEED(SUN) 12.00000.0000000
START(MON) 8.000000.0000000
START(TUE) 2.000000.0000000
START(WED) 2.000000.0000000
START(THU) 4.000000.0000000
START(FRI) 3.000000.0000000
START(SAT) 3.000000.0000000
START(SUN).0000000.0000000
ROW SLACK OR SURPLUS DUAL PRICE
1 22.00000 1.000000
2.0000000 -.2000000
3.0000000 -.2000000
4.0000000 -.2000000
5.0000000 -.2000000
6.0000000 -.2000000
7.0000000 -.2000000
8.0000000 -.2000000
В соответствии со значением целевой функции, приведенным в верхней части отчета, следует нанять 22 сотрудника. Результат, размещенный в атрибуте START, говорит о том, что для этого решения в понедельник (MON) должны начать работу 8 сотрудников, во вторник (TUE) — 2 и т.д. Поскольку каждый сотрудник работает следующие пять (включая день начала работы), требование, записанное в атрибуте NEED (потребность), выполняется. Например, атрибут NEED определяет, что в пятницу (Friday) требуется 19 сотрудников. Их действительно будет 19, составляя сумму из тех, кто начал работу в понедельник, вторник, среду и четверг. Можете проверить это условие для каждого из дней недели.
Дальнейшее описание функций поэлементной обработки множеств можно найти в главе 7 «Функции LINGO».
Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Доступ к элементам множества — функция @FOR | | | Плотное производное множество: TRAN.LNG |