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