Несмотря на то, что параметры обычно представляют числовые значения, они могут дополнительно использоваться для обозначения значений true - false или для символьных строк.
Текущая версия AMPL не поддерживает полноценный «логический» тип параметра, который обозначает только значения true и false, но параметр типа bin может использоваться для того же эффекта. В качестве иллюстрации, мы опишем следующий пример: определенные продукты в каждую неделю могут специально рекламироваться и продвигаться. В связи с увеличением спроса на акционный товар, требуется увеличить их нормативный запас на период действия акции. Используя параметры типа binary, мы можем представить эту ситуацию следующими объявлениями:
param fr_reg > 0; # регулярный запас param fr_pro > fr_reg; # запас для акционных товаров param promote{PROD,1..T+1} binary; param market{PROD,1..T+1} >= 0;
Параметр promote [p,t] равен 0, когда продукт не участвует в акции, и 1, когда участвует. Таким образом, мы можем определить параметры минимального запаса с помощью выражения if-then-else следующим образом:
param mininv{p in PROD, t in 0..T} =(if promote[p,t] = 1 then fr_pro else fr_reg)* market[p,t+1]; Мы можем сказать то же самое более кратко: param mininv {p in PROD, t in 0..T} = (if promote[p,t] then fr_pro else fr_reg) * market[p,t+1];
Когда появляется такое арифметическое выражение, как promote[p,t], там где требуется логическое выражение, AMPL интерпретирует любое ненулевое значение как true, а ноль - как false. Нужно проявить осторожность, чтобы избежать неявного преобразования.
if t = 1 then 0 else cumulative_market[p,t-1]
Если мы случайно напишем:
if t then 0 else cumulative_market[p,t-1] # DIFFERENT !!!
это совершенно правильно, однако такая неявная формулировка может не передать того, что мы действительно хотели сказать.