如何在GAMS中为表格每行求和设置上限并解决相关报错?
解决GAMS方程中的集合控制冲突问题
这是个很典型的GAMS集合索引错误,我来帮你快速理清问题并修复:
错误原因分析
你的方程maxime(a)已经在集合a上做了索引(意味着这个方程会为每个a的元素生成对应的约束),但在求和表达式sum(a, y(a,b))里又把a作为求和的遍历集合——这就导致同一个集合a被两次当作"控制集合"使用,GAMS无法区分哪个a是当前方程对应的元素,哪个是求和时要遍历的变量,因此抛出了"Set is under control already"和"Uncontrolled set entered as constant"的报错。
修正后的代码
你需要把求和的集合改成b,因为你的需求是对每个a对应的所有b的y值求和,正确的方程写法如下:
equations maxime(a), ...; maxime(a).. sum(b, y(a,b)) =l= pam1(a);
逻辑说明
maxime(a):表示为集合a中的每个元素(a1、a2、a3)分别生成一条约束sum(b, y(a,b)):对当前a对应的所有b元素(b1、b2、b3)的y(a,b)值求和- 最终效果就是:a1行的y值之和≤12,a2行的y值之和≤13,a3行的y值之和≤14,完全符合你的需求。
小提示
在GAMS中,方程的索引集合和求和的遍历集合绝对不能重复,否则必然会出现这类控制集合冲突的错误,写代码时一定要注意区分这两种集合的作用~
内容的提问来源于stack exchange,提问作者django_moose
相关产品推荐
相关产品推荐

