GAMS 中的映射计算

Calculation with mapping in GAMS

考虑以下数据:

set i    / 1 * 4      /
    tid  / 2019, 2020 /
    iagg / 1 * 2      /;
parameter t(i,tid),tagg(iagg,tid);

t(i,tid) = uniform(0,1);

set itoiagg(i,iagg) /
    1.1
    2.1
    3.2
    4.2
/;

我想对聚合集 (iagg) 进行以下计算:

tagg("1","2020") = (t("1","2020")/t("1","2019")*(t("1","2019")/(t("1","2019")+t("2","2019")))) +
                   (t("2","2020")/t("2","2019")*(t("2","2019")/(t("1","2019")+t("2","2019"))));

在这个简单的例子中,我也可以为第二个 iagg 这样做:

tagg("2","2020") = (t("3","2020")/t("3","2019")*(t("3","2019")/(t("3","2019")+t("4","2019")))) +
                   (t("4","2020")/t("4","2019")*(t("4","2019")/(t("3","2019")+t("4","2019"))));

但是我有一个很大的数据集,那么有没有一种简单的方法可以让我使用循环或类似的方法进行计算?

这个怎么样:

set i    / 1 * 4      /
    tid  / 2019, 2020 /
    iagg / 1 * 2      /;
parameter t(i,tid),tagg(iagg,tid);

t(i,tid) = uniform(0,1);

set itoiagg(iagg,i) /
    1.1
    1.2
    2.3
    2.4
/;

tagg(iagg,tid)$(ord(tid)>1) = sum(itoiagg(iagg,i),  (t(i,tid)/t(i,tid-1)*(t(i,tid-1)/(t(i,tid-1)+t(i,tid-1)))));

旁注:我在作业中翻转了 itoiagg 的索引,因为通常可以按照它们在 GAMS 中控制的顺序来引用索引。如果数据变大,这可能会导致性能差异。