Синтаксис для вложенных продуктов и сумм в функции оптимизации AMPL - PullRequest
0 голосов
/ 16 января 2019

У меня проблемы с индексированием по набору. По какой-то причине я получаю синтаксическую ошибку для квадратной скобки внутри моей суммы для sum {i in {1..n_paths}} P[i];.

Я могу отобразить набор {i in {1..n_paths}} и P[1] или любой другой допустимый i, но я как-то неправильно форматирую выражение суммы.

ampl: param n_paths;
ampl: set P {1..n_paths};
ampl: display sum {i in {1..n_paths}} P[i];

syntax error
context:  display sum {i in {1..n_paths}}  >>> P[ <<< i];

1 Ответ

0 голосов
/ 17 января 2019

В вашем примере 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.

...