2011-09-21 97 views
2

我想为GAMS中的3D表格分配值。但它似乎不能像Matlab一样工作.....运气好吗?代码是其次,问题是在最后几行:GAMS,矩阵直接分配

Sets 
     n   nodes      /Sto , Lon , Par , Ber , War , Mad , Rom/
     i   scenarios     /1 * 4/
     k   capacity level   /L, N, H/; 

alias(n,m); 

Table balance(n,i) traffic balance for different nodes 
     1  2  3  4 
Sto  50  50  -50  -50 
Lon  -40  40  -40  40 
Par  0  0  0  0 
Ber  0  0  0  0 
War  40  -40  40  -40 
Mad  0  0  0  0 
Rom  -50  -50  50  50 ; 

Scalar r fluctuation rate of the capacity level 
/0.15/; 

Parameter p(k) probability of each level 
/L 0.25 
    N 0.5 
    H 0.25/; 

Table nor_cap(n,m) Normal capacity level from n to m 
      Sto Lon  Par  Ber  War  Mad  Rom 
Sto  0  11  14  25  30  0  0 
Lon  11  0  21  0  0  14  0 
Par  14  21  0  22  0  31  19 
Ber  25  0  22  0  26  0  18 
War  30  0  0  26  0  18  22 
Mad  0  14  31  0  18  0  15 
Rom  0  0  19  18  22  15  0 ; 

Table max_cap(n,m,k) capacity level under each k 
max_cap(n,m,'N')=nor_cap(n,m) 
max_cap(n,m,'L')=nor_cap(n,m)*(1-r) 
max_cap(n,m,'H')=nor_cap(n,m)*(1+r); 

回答

0

最后分配到3 d矩阵应与参数来做到,而不是表。一般来说,我还会注意到TABLE是非常严格的(2维,代码内部的文本输入)。您可能需要考虑$ GDXIN(或EXECUTE_LOAD)和一些GAMS实用程序来加载xls或csv文件。

作为MATLAB和GAMS的用户,我会注意到GAMS依赖于每个数组的“索引”,但否则它们可能非常相似。在你的情况下,max_cap(n,m,k)就像每个容量级别场景下from_city和to_city之间的最大容量。你的矩阵需要被声明为一个PARAMETER,它可以是任何n维(索引)矩阵,甚至包括一个SCALAR。

另外,如果您真的需要快速回答,请尝试GAMS邮件列表,全球精通GAMS用户的数量不能超过几千,因此可能很难在StackOverflow上找到快速答案 - 真棒就像更常用的语言一样。