AMPL报错‘integrand following max{...} has invalid type’的修正方法咨询
解决GAMS中max{...} integrand类型错误的方法
问题背景
T、P、C为集合,x、z为二进制变量,原代码如下:
Equipa {t in T, p in P}: max{c in C} x[p,t,c] = z[p,t];
运行时触发错误:integrand following max{...} has invalid type
错误原因
GAMS的max操作符要求被运算对象为数值类型,直接引用二进制变量x作为运算项时,语法不符合要求,需通过合理方式将变量转换为可参与max运算的形式。
改写方案
提供两种可行的改写方式,均可解决原错误:
写法一:显式转换变量类型
通过乘以1将二进制变量转为数值类型,让max操作符可正确识别:
Equipa {t in T, p in P}: max{c in C} (x[p,t,c] * 1) = z[p,t];
写法二:用约束组实现等价逻辑
由于x是二进制变量,max{x[p,t,c]}等价于判断是否存在c使得x[p,t,c]=1,可通过两组约束实现相同效果:
Equipa1 {t in T, p in P}: sum{c in C} x[p,t,c] >= z[p,t]; Equipa2 {t in T, p in P, c in C}: z[p,t] >= x[p,t,c];
当任意x[p,t,c]为1时,z[p,t]必须为1;当所有x[p,t,c]为0时,z[p,t]只能为0,完全匹配原逻辑。
内容的提问来源于stack exchange,提问作者Ricardo Figueiredo
相关产品推荐
相关产品推荐

