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

如何在GAMS中针对集合t的指定子集执行优化(无需修改CSV)

解决GAMS仅优化指定时间子集的方案(无需修改CSV)

嘿,刚好之前做GAMS优化时碰到过类似需求,完全不用动CSV文件,给你两个实用的方案,都是基于原集合t保留完整8760个元素的前提下实现的:

方案1:定义专用子集(推荐,代码更清晰)

这个方法通过创建一个包含目标时间范围的子集,后续所有优化逻辑都基于这个子集执行,可读性和维护性更好:

  1. 首先在原集合t定义后,添加子集t_sub的定义:
Set t       time in hours            / 1 * 8760 /;
Set t_sub(t)  target time subset     / 1*3500, 6500*8760 /;  // 直接指定需要优化的时间范围

这里t_sub是t的子集,会自动关联原集合的序号,完全不影响CSV参数的导入(因为原t还是完整的8760个元素,参数v1(t)依然能正确读取全部8760个值)。

  1. 修改目标函数,将求和范围从t改为t_sub:
eObjFunc.. vZ =e= sum(t_sub, v1(t_sub));
  1. 其他约束如果需要仅作用在目标时间范围上,同样把集合范围替换成t_sub即可。比如如果有约束v2(t) <= v3(t),就改成对应子集上的约束逻辑。

方案2:直接在求和中添加条件过滤(适合临时快速修改)

如果不想额外定义子集,可以直接在sum函数中用条件判断筛选目标时间,代码更紧凑:

修改目标函数为:

eObjFunc.. vZ =e= sum(t$(ord(t)>=1 and ord(t)<=3500 or ord(t)>=6500 and ord(t)<=8760), v1(t));

这里ord(t)返回集合t中元素的序号,通过逻辑判断筛选出需要优化的时间点,同样不需要修改CSV或原集合定义。

注意事项

如果你的模型包含时序相关约束(比如t和t+1的关联约束),需要额外处理子集的边界问题。比如3500和6500之间的时间点不在优化范围内,这时候要确保时序约束不会跨到非目标区间,或者根据需求调整约束逻辑。

内容的提问来源于stack exchange,提问作者sbhn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:45:49