【问题标题】:Create macro/loop in GAMS在 GAMS 中创建宏/循环
【发布时间】:2020-10-20 11:26:36
【问题描述】:

考虑 GAMS 中的以下集合和参数:

set i  / 1,3 /
    j  / j1,j2,j3 /;

parameter stock(i,j);

考虑我想在参数中放入一个特定的值:

stock("1","j1") = 10;
stock("3","j3") = 10;

我可以使用宏、$setGlobal、循环(或类似的)来代替两行写,首先 (1) 指定它应该为哪个集合执行,然后 (2) 其次只在一行中写方程?

我可以创建一个子集:

set subset_i(i) / 1,3/
    subset_j(j) / j1,j3 /;

然后循环遍历这些子集:

loop(subset_i,
   loop(subset_j,
      stock(i,j) = 10;
   );
);

然后我得到每个组合的值:

1   j1  10
1   j2  10
1   j3  10
3   j1  10
3   j2  10
3   j3  10

我只想要:

1   j1  10
3   j3  10

我该怎么做?

【问题讨论】:

    标签: loops macros gams-math


    【解决方案1】:

    您要设置的正是对角线 (1-j1; 2-j2)?或者这只是一个随机的例子,映射也可能是另一个?如果是对角线,可以这样:

    set i  / 1,2 /
        j  / j1,j2 /;
    
    parameter stock(i,j);
    
    stock(i,j)$(ord(i)=ord(j)) = 10;
    
    display stock;
    

    编辑(基于 cmets/编辑的问题):

    如果不仅仅是对角线,也可以明确定义更一般的映射。可以这样完成:

    set i        / 1,  3      /
        j        / j1, j2, j3 /
        map(i,j) / 1.j1, 3.j3 /;
    
    parameter stock(i,j);
    
    stock(map(i,j)) = 10;
    
    display stock;
    

    【讨论】:

    • 一个小问题:如果你设置了 i / 1,3 / 而不是设置 i / 1,2 /,那么我得到的结果是:stock("3"," j2") = 10 . 但是,我想要 stock("3"," j3") = 10。如果集合 i 中的值等于集合 j 中 j 之后的值,是否可以说它应该插入值 10?有意义吗?
    • 我已经更改了文字,所以它解释得更好。
    • 完美!非常感谢! :-)
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多