如何为单个集合使用双索引?及GAMS多索引集合计算实现
解决GAMS中单个集合双索引的家庭计算问题
我来帮你搞定这个针对家庭和个人双索引的计算需求!核心思路是针对每个家庭,定位第一个成员并提取其G值,再计算其他成员H值的总和乘以3,最后把两部分相加。下面是具体的实现步骤和代码:
完整代码示例
首先,我们补全你提供的定义并添加计算逻辑:
param n := 3; // 对应示例里最多3个个人 param f := 2; // 对应示例里2个家庭 set N, default{1..n}; // 个人集合 set F, default{1..f}; // 家庭集合 set E, within F cross N; // 示例数据 set E:= 1 1 1 2 1 3 2 1 2 2 ; param G := 1 1 3 1 2 4 1 3 5 2 1 6 2 2 7; param H:= 1 1 10 1 2 2 1 3 8 2 1 3 2 2 9; // 定义存储每个家庭计算结果的参数 param Result{F}; // 核心计算逻辑 loop(f$card(E(f,*)), // 跳过没有成员的家庭(可选,避免空集合报错) scalar firstMember; // 获取当前家庭的第一个成员(个人索引最小的那个) firstMember = min(n$(E(f,n)), n); // 计算:第一个成员的G值 + 3*其他成员H值的总和 Result(f) = G(f, firstMember) + 3*sum(n$(E(f,n) and n ne firstMember), H(f,n)); ); // 输出结果查看 display Result;
代码解释
- 定位第一个成员:
min(n$(E(f,n)))会筛选出当前家庭f下所有存在的个人索引,然后取最小值,也就是你说的“第一个成员”。 - 分部分计算:
G(f, firstMember)直接提取第一个成员的G值;sum(n$(E(f,n) and n ne firstMember), H(f,n))计算当前家庭中除第一个成员外所有个人的H值总和,再乘以3;
- 容错处理:
loop(f$card(E(f,*)))中的card(E(f,*))会检查家庭f是否有成员,避免空集合导致的计算错误。
运行结果
执行这段代码后,Result参数会输出:
- Result(1) = 3 + 3*(2+8) = 33
- Result(2) = 6 + 3*9 = 33
完全符合你要求的计算逻辑!
内容的提问来源于stack exchange,提问作者user11009316
相关产品推荐
相关产品推荐

