如何在GAMS线性规划模型中实现带条件的vDemand方程拆分?
GAMS线性规划模型中vDemand方程的修改方案
要在保持线性特性的前提下修改vDemand方程,有两种简洁可行的实现方式:
方法一:使用集合序号条件($运算符)
利用GAMS的$条件运算符,基于集合元素的序号判断是否添加第二项,这种方式完全符合线性要求:
Set t "time in hours" /1*8760/; Equation vDemand(t); vDemand(t) .. vDemand(t) =e= p1*(vInternal(t) - pAmbient(t)) + p2*(vInternal(t) - vInternal(t-1))$(ord(t) > 1);
$(ord(t) > 1)表示仅当时间步序号大于1时,才加入p2*(vInternal(t) - vInternal(t-1))项;t=1时该条件不成立,自动排除该项,且所有表达式都是线性的。
方法二:拆分集合分别定义方程
将时间集合拆分为首时段和剩余时段,分别对应两种方程形式,同样保持线性:
Set t "time in hours" /1*8760/; Set t_first(t) "first time period" /1/; Set t_rest(t) "remaining time periods" /2*8760/; Equation vDemand_first(t_first), vDemand_rest(t_rest); vDemand_first(t_first) .. vDemand(t_first) =e= p1*(vInternal(t_first) - pAmbient(t_first)); vDemand_rest(t_rest) .. vDemand(t_rest) =e= p1*(vInternal(t_rest) - pAmbient(t_rest)) + p2*(vInternal(t_rest) - vInternal(t_rest-1));
这种方式通过明确拆分集合,避免了条件判断可能带来的混淆,两个方程均为线性表达式,可被LP求解器直接处理。
注意事项
不要使用基于变量的条件判断(如将决策变量作为条件),这会引入非线性特性导致LP求解器无法处理。上述两种方法均基于集合的固定属性(序号或预定义子集),完全符合线性规划的要求。
内容的提问来源于stack exchange,提问作者sbhn
相关产品推荐
相关产品推荐

