Как определить параметр рекурсивно в GAMS? - PullRequest
0 голосов
/ 28 сентября 2011

Мне нужно определить набор параметров, которые имеют естественную рекурсивную связь.

Вот MWE, где я пытаюсь определить факториальную функцию по набору (девяти) параметров S:

$title TitleOfProblem

set S / s1*s9 /;

alias(S, S1, S2);

set delta1(S1,S2);
delta1(S1,S2) = yes$(ord(S1) + 1 = ord(S2));

parameter f(S);

f(S) = 1$(ord(S) = 1) + (ord(S) * sum(S1$(delta1(S1, S)), f(S1)))$(ord(S) > 1);

display f;

"delta1" - это отношение, содержащее пары элементов в отсортированном порядке, которые отличаются на 1. Логически, определение f совпадает с определением факториальной функции (для входов с 1 по 9), но GAMS, похоже, не нравится что f определяется рекурсивно. Результат компиляции GAMS выглядит примерно так:

f(S) = 1$(ord(S) = 1) + (ord(S) * sum(S1$(delta1(S1, S)), f(S1)))$(ord(S) > 1);
                                                          $141

141  Symbol neither initialized nor assigned
    A wild shot: You may have spurious commas in the explanatory
    text of a declaration. Check symbol reference list.

Вопрос:

Возможно ли рекурсивное определение параметра в GAMS? Если нет, то что такое обходной путь?

(П.С. Кто-то с достаточным количеством представителей должен создать тег «GAMS» и добавить его к этому вопросу.)

1 Ответ

0 голосов
/ 29 сентября 2011

Кто-то показал мне решение для моего примера, используя цикл while. Однако это решение относится только к факториалу и не обобщается на произвольную рекурсивную функцию.

$title factorial

set S / s1*s9 /;

parameter f(S);
parameter temp;

Loop(S,
  temp=ord(s);
  f(S)=ord(s);
    While(temp > 1,
      f(S) = f(S) * (temp-1);
      temp = temp - 1;
    );
);

display f;
...