如何在GAMS方程定义中结合变量实现条件语句(优化问题)
GAMS非线性优化中实现条件逻辑的正确方法
针对你需要实现的“当PV发电量大于需求时计算出口量,否则出口量为0;需求大于发电量时计算进口量,否则进口量为0”的逻辑,以下是两种可行的解决方案:
方案一:二进制变量+大M法(线性化处理,适用于MIP求解器)
因为Demand(t)是优化变量,无法用预处理阶段的$条件判断,所以引入二进制变量标记状态,配合大M值实现逻辑约束:
- 补充变量定义:
Positive Variables Demand(t), Energy_Exported(t), Energy_Imported(t); Binary Variable y(t); // y(t)=1表示PV发电量≥需求,y(t)=0表示需求≥PV发电量
- 定义大M参数(取足够大的值,比如PV_Generation(t)的最大值与Demand(t)最大可能值之和):
Parameter M / 1000 /; // 根据实际场景调整数值
- 添加出口逻辑约束:
// 当y(t)=1时,PV_Generation(t)-Demand(t)等于Energy_Exported(t);y(t)=0时,Energy_Exported(t)必须为0 PV_Generation(t) - Demand(t) =l= Energy_Exported(t) + M*(1 - y(t)); PV_Generation(t) - Demand(t) =g= Energy_Exported(t) - M*(1 - y(t)); Energy_Exported(t) =l= M*y(t);
- 添加进口逻辑约束:
// 当y(t)=0时,Demand(t)-PV_Generation(t)等于Energy_Imported(t);y(t)=1时,Energy_Imported(t)必须为0 Demand(t) - PV_Generation(t) =l= Energy_Imported(t) + M*y(t); Demand(t) - PV_Generation(t) =g= Energy_Imported(t) - M*y(t); Energy_Imported(t) =l= M*(1 - y(t));
方案二:互补约束(适用于支持非线性互补的求解器)
如果使用CONOPT、KNITRO等支持互补约束的求解器,可以不用二进制变量,直接通过互补条件实现逻辑:
Positive Variables Demand(t), Energy_Exported(t), Energy_Imported(t); // 出口量约束:要么Energy_Exported(t)=PV_Generation(t)-Demand(t)(当PV发电量≥需求),要么Energy_Exported(t)=0(当PV发电量<需求) Energy_Exported(t) =g= PV_Generation(t) - Demand(t); Energy_Exported(t) =g= 0; Energy_Exported(t) * (PV_Generation(t) - Demand(t) - Energy_Exported(t)) =e= 0; // 进口量约束:要么Energy_Imported(t)=Demand(t)-PV_Generation(t)(当需求≥PV发电量),要么Energy_Imported(t)=0(当需求<PV发电量) Energy_Imported(t) =g= Demand(t) - PV_Generation(t); Energy_Imported(t) =g= 0; Energy_Imported(t) * (Demand(t) - PV_Generation(t) - Energy_Imported(t)) =e= 0;
你之前写法的问题说明
- 直接用
Energy_Exported(t)$[Energy_Exported(t)<0] =0无效:GAMS的$条件是预处理阶段执行的,此时优化变量Demand(t)和Energy_Exported(t)的值尚未确定,无法触发条件判断。 - 单独写
Energy_Imported(t) =g= Demand(t)-PV_Generation(t)得到无界解:这个约束只限制了进口量不能小于需求与发电量的差值,但没有限制Demand(t)的上限,也没有关联“只有当需求大于发电量时才允许进口”的逻辑,求解器会无限增大Demand(t)和Energy_Imported(t)导致无界。
内容的提问来源于stack exchange,提问作者Liliana Nowakowska
相关产品推荐
相关产品推荐

