我需要定义一组具有自然递归关系的参数。
这是一个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中递归定义参数?如果没有,什么是解决方法?
(P.S。有足够代表的人应该创建一个标签“GAMS”并将其添加到这个问题。)
答案 0 :(得分: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;