GAMS EMP双层模型Dualvar域匹配错误及目标函数修改求助
解决GAMS EMP双层模型中对偶变量域不匹配问题
问题核心
你遇到的dualVAR pair has different domains错误,根源在于对偶变量Lamda的域引用方式与定义不一致,或是筛选目标对偶变量时集合关系处理不当。以下是针对性的修正方案:
步骤1:确保子集集合定义正确
首先,将Inv1_N定义为集合i的子集(而非独立集合),这样GAMS才能识别它与Lamda(i)的域关联:
Set i /1*33/; Set Inv1_N(i) /3,22,25/; // 明确Inv1_N是i的子集 Variable Prof; Variable Lamda(i);
步骤2:修正上层目标函数写法
选择以下两种正确写法之一,既能筛选出Inv1_N中的对偶变量,又能保证域匹配:
写法一:用子集直接索引
ULPObj.. Prof =e= sum((DG_Inv1, b), MC(DG_Inv1, b) * Pg(DG_Inv1, b)) - sum((Inv1_N, DG_Inv1, b), Lamda(Inv1_N) * Pg(DG_Inv1, b));
因为Inv1_N是i的子集,Lamda(Inv1_N)本质上还是引用Lamda(i)的子集元素,域与原变量完全一致,不会触发EMP的域检查错误。
写法二:用$条件筛选
ULPObj.. Prof =e= sum((DG_Inv1, b), MC(DG_Inv1, b) * Pg(DG_Inv1, b)) - sum((i, DG_Inv1, b)$Inv1_N(i), Lamda(i) * Pg(DG_Inv1, b));
通过$Inv1_N(i)直接判断当前i是否在目标子集内,同样能保证Lamda(i)的域与定义一致。
步骤3:保留原dualvar命令
无需修改%emp.info%中的dualvar命令,保持原写法即可:
$onecho > "%emp.info%" bilevel X min Z * Equations dualvar Lamda P_Balance $offecho
错误原因说明
之前的尝试中,如果Inv1_N是独立集合(而非i的子集),那么Lamda(Inv1_N)会被视为域与Lamda(i)不同的变量,触发EMP的域匹配检查错误。将其定义为子集后,GAMS会识别两者的包含关系,避免该问题。
内容的提问来源于stack exchange,提问作者Y_H
相关产品推荐
相关产品推荐

