在 GAMS 中创建 macro/loop

Create macro/loop in GAMS

考虑 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

我该怎么做?

是对角线(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;

编辑(基于 comments/the 编辑的问题):

如果不只是关于对角线,还可以明确定义更通用的映射。可以这样做:

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;