首页 > 解决方案 > 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));

但是,如果 set i等于 set 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 中是否有一种简单的方法可以做到这一点?

标签: mappinggams-math

解决方案


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

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;

推荐阅读