Loops 在GAMS中创建宏/循环
在GAMS中考虑以下集合和参数:Loops 在GAMS中创建宏/循环,loops,macros,gams-math,Loops,Macros,Gams Math,在GAMS中考虑以下集合和参数: set i / 1,3 / j / j1,j2,j3 /; parameter stock(i,j); 考虑我想在参数中输入一个特定值: stock("1","j1") = 10; stock("3","j3") = 10; 我可以使用宏$setGlobal、loop(或类似的)来代替将其写在两行中,首先(1)指定它应该为哪个集合执行操作,然后(2)仅将等式写在一行
set i / 1,3 /
j / j1,j2,j3 /;
parameter stock(i,j);
考虑我想在参数中输入一个特定值:
stock("1","j1") = 10;
stock("3","j3") = 10;
我可以使用宏$setGlobal、loop(或类似的)来代替将其写在两行中,首先(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;
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;
编辑(基于评论/编辑的问题):
如果不只是关于对角线,还可以显式定义更一般的映射。可以这样做:
set i / 1,2 /
j / j1,j2 /;
parameter stock(i,j);
stock(i,j)$(ord(i)=ord(j)) = 10;
display stock;
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。然而,我想要股票(“3”,“j3”)=10。如果集合i中的值等于集合j中j之后的值,是否可以说应该插入值10?这有意义吗?我修改了课文,所以解释得更好。太好了!非常感谢!:-)