Операторы арифметической редукции применяются в соответствии со следующей записью:
reduction-op indexing expr
где, reduction-op : sum, prod, max, min ( expr )
Например:
sum{i in Prod}cost[i] * Make[i];
Область действия выражения индексации распространяется до конца выражения expr. Если операция редукции сталкивается с пустым набором, результатом является значение идентификатора для операции: 0 для sum, 1 для prod, Infinity для min и -Infinity для max.
Область действия SUM
Область действия оператора sum в AMPL распространяется только до знака + , который не находится в скобках. Так, в частности, если написать sum{i in I}(f[i] * r[i]) + (c[i] * x[i])
, индекс i в I определяется только для (f[i] * r[i]), и для остальной части выражения - генерируется ошибка «i not defined». Это можно исправить, поместив круглые скобки вокруг всего выражения:
minimize Z: sum{i in I}((f[i] * r[i]) + (c[i] * x[i]));
Поскольку * имеет более высокий приоритет операторов, чем + (как показано в таблице арифметических и логических операторов книги AMPL), можно удалить внутренние скобки:
minimize Z: sum{i in I}(f[i] * r[i] + c[i] * x[i]);
Однако приоритет sum выше, чем у + или -, поэтому для цели многопериодной модели производства мы должны записать:
sum{p in PROD, t in 1..T}(sum{a in AREA[p]} revenue[p,a,t] * Sell[p,a,t] - prodcost[p] * Make[p,t] - invcost[p] * Inv[p,t]);
Внешняя сумма применяется ко всему выражению в скобках после него, а внутренняя сумма относится только к выражению revenue[p,a,t] * Sell[p,a,t]
.
Примеры применения оператора sum. Суммирование значений по неявным периодам, безиндексное суммирование значений по периодам:
param interval = 21; subject to C{k in 1..T by interval,…}: … sum{t in k..k+interval-1}PRODAMOUNT[o,f,p,j,t] …
Другие итерационные арифметические операторы предназначены для:
prod – умножения, max – для нахождения максимума, min – для нахождения минимума. В качестве примера мы используем следующую запись:
max{i in ORIG}supply[i]
для поиска максимального значения объема запаса в одном из мест происхождения.
Нужно иметь в виду, что несмотря на то, что арифметическую функцию или оператор AMPL можно применять к переменным, а также к параметрам или числовым элементам множеств, - большинство арифметических операций с переменными являются не линейными.