You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为单个集合使用双索引?及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;

代码解释

  1. 定位第一个成员:min(n$(E(f,n))) 会筛选出当前家庭f下所有存在的个人索引,然后取最小值,也就是你说的“第一个成员”。
  2. 分部分计算:
    • G(f, firstMember) 直接提取第一个成员的G值;
    • sum(n$(E(f,n) and n ne firstMember), H(f,n)) 计算当前家庭中除第一个成员外所有个人的H值总和,再乘以3;
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:03:20