В вашем примере P - это индексированная коллекция наборов, что означает, что каждый P[i]
сам является набором. Например:
reset;
param n_paths := 2;
set P{1..n_paths};
data;
set P[1] := 1 2 5;
set P[2] := 6 5 1;
Здесь display P[1];
возвращает set P[1] := 1 2 3;
.
Если я попытаюсь оценить sum{i in 1..n_paths} P[i]
, я прошу AMPL добавить набор {1,2,3} в набор {6,5,1}, а sum
из двух наборов не определено , Если я хочу сложить все элементы от P[1]
до P[n_paths]
, тогда мне нужна двойная сумма:
display sum{i in 1..n_paths} sum{j in P[i]} j;
# caution: this will fail if we have non-numbers in our sets
Возвращает 20: 1 + 2 + 5 от P[1]
, добавляемое к 6 + 5 + 1 от P[2]
.
Я мог бы также объединить наборы до суммирования:
display sum{j in union{i in 1..n_paths} P[i]} j;
Поскольку union
отбрасывает дублирующиеся значения, это приводит к суммированию 1, 2, 5 и 6, чтобы получить 14.