基于映射的GAMS聚合计算批量实现方法问询
批量实现GAMS中基于集合映射的聚合计算
当然可以!你完全不需要手动编写每个聚合元素的计算式,利用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 /;
批量计算解决方案
步骤1:预计算聚合组的基期总和
先计算每个iagg组在2019年的总和,避免重复计算,提升大数据集下的运行效率:
parameter sum_t_base(iagg); sum_t_base(ia) = sum(i$(itoiagg(i,ia)), t(i,"2019"));
步骤2:批量计算tagg的2020年值
利用sum函数结合集合映射itoiagg,自动遍历所有聚合组完成计算:
tagg(ia,"2020") = sum(i$(itoiagg(i,ia)), (t(i,"2020")/t(i,"2019")) * (t(i,"2019")/sum_t_base(ia)));
简化优化(可选)
仔细观察你的计算逻辑可以发现,表达式中的t(i,"2019")可以约掉,简化后逻辑完全等价但更高效:
tagg(ia,"2020") = sum(i$(itoiagg(i,ia)), t(i,"2020")/sum_t_base(ia));
防除以0处理(可选)
如果担心某个聚合组的2019年总和为0(浮点数精度问题),可以添加条件判断避免报错:
tagg(ia,"2020") = sum(i$(itoiagg(i,ia) and sum_t_base(ia) > 1e-6), t(i,"2020")/sum_t_base(ia));
这里用1e-6作为阈值,是因为浮点数直接和0比较容易出现精度误差。
逻辑说明
- 利用
itoiagg(i,ia)的映射关系,GAMS会自动识别每个iagg元素对应的所有i成员。 sum函数会对每个iagg组下的所有i元素执行累加计算,完全替代手动编写每个组的计算式,不管你的数据集规模多大都能适配。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

