Параметры AMPL могут быть определены краткими рекурсивными записями. Рекурсия в AMPL поддерживает множество видов рядов.
Определение значения каждого последующего элемента как суммы предыдущих элементов
Задание значения каждого последующего элемента как суммы предыдущих элементов:
param N; param s {j in 1..N} = sum {jj in 1..j} jj; или, используя формулу: param s {j in 1..N} = j * (j+1) / 2;
либо, используя рекурсивное определение,
param s {j in 1..N} = if j = 1 then 1 else s[j-1] + j;
Итерационное суммирование предыдущих/последующих элементов набора.
Итерационное Tagg суммирование предыдущих Tagg элементов набора.
param avail_agg {t in Tagg..T by Tagg}= sum {u in t-Tagg+1..t} avail[u];
Итерационное Tagg суммирование всех предыдущих (включая текущий) элементов набора.
param avail_agg {t in Tagg..T by Tagg}= sum {u in 1..t} avail[u];
Последовательное 1..Т суммирование всех предыдущих(включая текущий) членов набора.
param avail_agg {t in 1..T}= sum {u in 1..t} avail[u];
Итерационное Tagg суммирование последующих Tagg элементов набора.
param avail_agg {t in 1..T by Tagg}= sum {u in t..t+Tagg-1} avail[u];
Факториал числа
Запись для определения факториала числа:
param fact{j in 1..10}= if j = 1 then 1 else fact[j-1]* j;
или
param fact {i in 0..c} := prod {j in 1..i} j;
Числа Фибоначи
Выражение для чисел Фибоначи:
fib[n] число Фибоначи: f0 = f1 = 1 and fn = fn-1 + fn-2: param fib{j in 0..10}= if j=0 or j=1 then 1 else fib[j-1]+fib[j-2];
n-е число Фибоначчи равно ближайшему целому числу
Функция Аккермана
Функция Аккермана: Используя рекурсивное объявление, можно определить ack[i,j].
param odd {i in 1..10} = if i = 1 then 3 else min {j in odd[i-1]+2..odd[i-1]*2 by 2: not exists{k in 1..i-1} j mod odd[k] = 0} j; set PER; param T >= 1; param Tagg integer >= 1; param avail{PER};
POWER SET
Набор состоящий из полного перечня вариаций поднаборов своих элементов.
set D ordered; set P within {D,D}; param c{P}; set Adj{i in D} within P := {(u,v) in P: u==i or v==i}; param n:= card(D); set S:= 0..(2**n-1); set POW{k in S}:= {i in D: (k div 2**(ord(i,D)-1)) mod 2 ==1}; var x{P} binary; subject to span{i in D}: sum{(u,v) in Adj[i]}x[u,v] >= 1; subject to size: sum{(i,j) in P} x[i,j] = n -1; subject to no_cycles{k in S: card({i in POW[k],j in POW[k]: (i,j)in P}) >= 3}: sum{i in POW[k], j in POW[k]: (i,j) in P} x[i,j] <= card(POW[k]) - 1; minimize cost: sum{(i,j) in P} c[i,j] * x[i,j]; data; set D := 1 2 3 4 5; param :P: c: 1 2 3 4 5 := 1 . 100 125 120 110 2 100 . 40 65 60 3 125 40 . 45 55 4 120 65 45 . 50 5 110 60 55 50 . ; solve; display cost, x;