0

自然な再帰関係を持つパラメーターのセットを定義する必要があります。

これは、一連の (9 つの) パラメータ S に対して階乗関数を定義しようとする MWE です。

$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 でパラメーターを再帰的に定義することは可能ですか? そうでない場合、回避策は何ですか?

(PS十分な担当者がいる人は、タグ「GAMS」を作成して、この質問に追加する必要があります。)

4

1 に答える 1

0

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;
于 2011-09-29T18:36:09.550 に答える