Если T предназначено для представления количества недель в многопериодной модели, оно должно быть целым числом и больше 1. Включив эти условия в объявление T,
param T > 1 integer;
мы вводим ограничение типа (integer) используемых в модели данных и диапазона(>0) значений параметра. Запись предписывает AMPL отклонять данные, если T случайно установлено <= 1 с выдачей сообщения об ошибке:
error processing param T: failed check: param T = 1 is not > 1;
или
error processing param T: failed check: param T = 2.5 is not an integer;
AMPL не будет отправлять экземпляр проблемы решателю, пока остаются какие-либо подобные ошибки. В объявлении индексированной коллекции параметров простое ограничение, такое как integer или >= 0, применяется к каждому параметру. Наши примеры часто используют эти конструкции, чтобы указать, что векторы и массивы неотрицательны:
param demand{DEST,PROD} >= 0;
Однако, если мы укажем фиктивные индексы в выражении индексации, мы можем использовать их, чтобы указать разные ограничения для каждого параметра:
param f_min {FOOD} >= 0; param f_max {j in FOOD} >= f_min[j];
integer || binary
Результатом этих объявлений является определение пары параметров f_max[j]>= f_min[j] для каждого j в наборе FOOD. Фраза ограничения для объявления параметра может содержать слово integer (целое) или binary (двоичное) или оператор сравнения, за которым следует арифметическое выражение. В то время как целое число ограничивает параметр целыми значениями, двоичное ограничивает его нулем или единицей. Арифметическое выражение может относиться к наборам и параметрам, ранее определенным в модели, и к фиктивным индексам, определенным в текущем объявлении. В одном объявлении может быть несколько фраз ограничения, и в этом случае они должны быть разделены запятыми.
В особых случаях ограничительная фраза может даже ссылаться на параметр, в объявлении которого она появляется. Например, некоторые многопериодные модели производства определяются с помощью параметра cumulative_market[p,t], который представляет совокупный спрос на продукт p в течение недель с 1 по t. Поскольку значение совокупного спроса увеличивается, мы можем написать фразу ограничения следующим образом:
param cumulative_market{p in PROD, t in 1..T} >=
cumulative_market[p,t-1]; # ERROR
Однако для параметров cumulative_market[p,1] фраза ограничения будет ссылаться на данные cumulative_market[p,0], которые не определены. AMPL отклонит объявление с сообщением об ошибке.
If-then-else в ограничениях параметров
Нам вновь понадобится условное выражение, которое обрабатывает первый период отдельно:
param cumulative_market{p in PROD, t in 1..T} >= if t = 1 then 0 else cumulative_market[p,t-1];
То же самое можно записать более компактно:
param cumulative_market{p in PROD, t in 1..T} >= if t > 1 then cumulative_market[p,t-1];
Поскольку предполагается, что else 0. Почти всегда требуется некоторая форма выражения if-then-else, чтобы сделать возможной такую ссылку на себя.
Конструкция check
Иногда, желательно наложить более сложное ограничение на данные модели, чем то, которое можно выразить с помощью фразы ограничения в объявлении. Операторы check предоставляют утверждения, помогающие убедиться в том, что правильные данные были прочитаны или созданы. Каждый оператор проверки оценивается при выполнении одной из команд solve, write, solution. Оператор check имеет следующий синтаксис:
check [indexingopt:] lexpr;
Например, мы бы хотели, наложить проверку того, что в транспортной модели, общий объем предложения равнялся общему спросу. Для этого, мы можем использовать конструкцию check:
check: sum{i in ORIG}supply[i] = sum{j in DEST}demand[j];
Мультимодальная версия использует индексированную проверку, чтобы сказать, что общее предложение должно равняться общему спросу для каждого продукта:
Здесь ограничение проверяется один раз для каждого элемента p in PROD. Если проверка не удалась для какого-либо участника, AMPL напечатает сообщение об ошибке и отклонит все данные.
Необходимо применять проверочное выражение как определенный тип ограничения, но только для исходных данных. Ограничительное предложение является логическим выражением, которое может использовать любые ранее определенные наборы и параметры, а также фиктивные индексы, определенные в выражении индексации оператора. После считывания значений данных логическое выражение должно принимать значение true. Если было указано индексное выражение, логическое выражение оценивается отдельно для каждого назначения элементов набора фиктивного индекса и должно быть истинным для каждого элемента.
Настоятельно рекомендуется использовать ограничительные фразы и операторы проверки для проверки данных модели. Эти функции помогут обнаружить ошибки в данных на ранней стадии, когда их легко исправить. Не обнаруженные ошибки данных в лучшем случае вызовут ошибку при генерации переменных и ограничений, так что вы получите сообщение об ошибке. В других случаях ошибки данных приводят к генерации неверной линейной программы. Если повезет, неправильный LP будет иметь бессмысленное оптимальное решение и нужно будет потратить много времени на выяснение причин бессмысленных данных. В худшем случае неправильный LP будет иметь вероятное решение, и ошибка останется незамеченной.
Бесконечные границы данных
Бесконечность Infinity - представляет собой предопределенный параметр. Это максимальный порог, выше которого верхние границы считаются отсутствующими (т. е. бесконечными), а -Infinity - порог, ниже которого нижние границы считаются отсутствующими. Таким образом:
set A; param Ub{A} default Infinity; param Lb{A} default -Infinity; var V {i in A} >= Lb[i], <= Ub[i];
компоненты V, для которых значение Lb не указано в разделе данных, не ограничены с низу, и компоненты, для которых значение Ub не указано, не ограничены с верху. Аналогичным образом можно установить необязательные: нижнюю и верхнюю границы ограничения. На компьютерах с арифметикой IEEE (большинство современных систем) Infinity - это значение IEEE ∞.