GAMS 中的条件映射

Conditional mapping in GAMS

考虑 GAMS 中的以下数据:

set i        / 1,2,3 /
    j        / 1,2,3 /;

parameter stock(i,j);

stock(i,j) = 10; 

考虑以下映射:

set jagg            / b1,b2 /
    map2(j,jagg)    / 1.b1, 2.b1, 3.b2, 4.b2 /;

我可以使用以下方式轻松映射:

parameter stockagg(i,jagg);

stockagg(i,jagg) = sum(map2(j,jagg),stock(i,j));

但是,如果集合i等于集合j,我不想映射。 也就是说,我想要以下数据作为我的结果:

1   1   10
1   b1  10
1   b2  20
2   b1  10
2   2   10
2   b2  20
3   b1  20
3   3   10
3   b2  10
4   b1  20
4   b2  10
4   4   10

在 GAMS 中有没有简单的方法来做到这一点?

不确定,如果我完全正确地回答了你的问题,但是这给了你发布的结果:

set i        / 1,2,3,4 /
    j        / 1,2,3,4,b1,b2 /;

Alias(j,jj);

parameter stock(i,j);

stock(i,j) = 10;

set jagg(j)       / b1,b2 /
    map2(j,jj)    / 1.b1, 2.b1, 3.b2, 4.b2 /;
    
parameter stockagg(i,j);

stockagg(i,j) =   sum(map2(jj,jagg(j))$(not sameas(i,jj)),stock(i,j))$(not sameas(i,j))
                + stock(i,j)                                         $(    sameas(i,j));

display stockagg;