В простейшем случае оператор if оценивает условие и выполняет указанное действие, если условие истинно. Например:
if Make ["coils", 2] <1500 then printf "меньше 1500 \ n";
Действие также может быть серией команд, сгруппированных в фигурные скобки, как в командах for и repeat:
if Make["coils",2] < 1500 then { printf "Fewer than 1500 coils in week 2.\n"; let market["coils",2] := market["coils",2] * 1.1; }
Необязательное else указывает альтернативное действие, которое также может быть также командой:
if Make["coils",2] < 1500 then { printf "Fewer than 1500 coils in week 2.\n"; let market["coils",2] := market["coils",2] * 1.1; } else printf "At least 1500 coils in week 2.\n";
или группой команд:
if Make["coils",2] < 1500 then printf "under 1500\n"; else { printf "at least 1500\n"; let market["coils",2] := market["coils",2] * 0.9; }
AMPL выполняет эти команды, сначала оценивая логическое выражение, следующее после if. Если выражение истинно, команда (группа команд), следующие за then, выполняются. Если выражение ложно, команда (группа команд), следующие за else, если таковые вообще имеются, выполняются.
Команда if наиболее полезна для регулирования потока управления в сценариях. Например: можно подавить любое вхождение на 100%, поместив оператор, который печатает Sell[p, t] / market[p, t] внутри if:
if Sell[p,t] < market[p,t] then printf "%7.1f%%", 100 * Sell[p,t] / market[p,t]; else printf " --- ";
В сценарии, показанном на рисунке ниже, мы можем использовать команду if внутри цикла повторения, чтобы проверить, изменилось ли двойное значение с момента предыдущего прохода цикла. Этот цикл создает таблицу, в которой есть ровно одна запись для каждого обнаруженного двойного значения.
model steelT.mod; data steelT.dat; option solution_precision 10; option solver_msg 0; set AVAIL3 default {}; param avail3_obj {AVAIL3}; param avail3_dual {AVAIL3}; let avail[3] := 1; param avail3_step := 1; param previous_dual default Infinity; repeat while previous_dual > 0 { solve; if Time[3].dual < previous_dual then { let AVAIL3 := AVAIL3 union {avail[3]}; let avail3_obj[avail[3]] := Total_Profit; let avail3_dual[avail[3]] := Time[3].dual; let previous_dual := Time[3].dual; } let avail[3] := avail[3] + avail3_step; } display avail3_obj, avail3_dual;
Оператор, следующий после then или else, сам может быть оператором if. Мы могли бы обрабатывать 0% и 100% специально, написав:
if Sell[p,t] < market[p,t] then if Sell[p,t] = 0 then printf " "; else printf "%7.1f%%", 100 * Sell[p,t]/market[p,t]; else printf " --- ";
или эквивалентно, но, возможно, более четко:
if Sell[p,t] = 0 then printf " "; else if Sell[p,t] < market[p,t] then printf "%7.1f%%", 100 * Sell[p,t]/market[p,t]; else printf " --- ";
Во всех случаях else соединяется с ближайшим предшествующим доступным if.
Конструкция «if-then» или «if-then-else» считается нелинейной, если в выражении между if и else имеются переменные. Дополнительную информацию об операторе if-then-else можно найти в других разделах справочной документации.