GAMS二进制变量建模问题:流量为零时设置nrc=1
GAMS二进制变量建模:双流量为0时触发二进制变量置1的逻辑处理
嘿,我来帮你捋清楚这个GAMS建模里的逻辑细节,以及可能存在的坑点~
首先明确你的核心需求:当质量流量m_rc_ts和m_rc_pb同时为0时,强制二进制变量nrc等于1。你参考论坛实现的这组方程,我们来拆解它的数学逻辑:
你当前实现的方程
e_nrc_lo(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =g= (1-nrc(i+1)); e_nrc_up(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =l= m_rcmax*(1-nrc(i+1));
逻辑拆解分析
我们分两种情况看这组方程的约束效果:
- 当
nrc(i+1)=1时:
第一个方程变为m_rc_ts + m_rc_pb >= 0(流量非负的话,这个约束总是成立),第二个方程变为m_rc_ts + m_rc_pb <= 0。结合两个约束,会强制m_rc_ts和m_rc_pb同时为0,这部分是符合需求的反向约束(nrc=1时流量必须为0)。 - 当
nrc(i+1)=0时:
第一个方程变为m_rc_ts + m_rc_pb >= 1,第二个方程变为m_rc_ts + m_rc_pb <= m_rcmax。这时候会强制流量之和至少为1,若你的流量是连续变量(允许小于1的非零值,比如0.5),这组方程会直接禁止这类合法的非零流量,导致模型不可行。
修正方案(适配连续流量场景)
如果你的流量是连续变量,建议把方程里的1替换成一个极小的正数epsilon(比如1e-6,代表流量的最小非零阈值),修正后的方程如下:
* 定义极小值epsilon Scalar epsilon /1e-6/; e_nrc_lo(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =g= epsilon*(1-nrc(i+1)); e_nrc_up(i+1) .. m_rc_ts(i+1)+m_rc_pb(i+1) =l= m_rcmax*(1-nrc(i+1));
修正后的逻辑就完美匹配你的需求了:
- 当流量之和为0时,
epsilon*(1-nrc)必须<=0,而epsilon>0,所以只能1-nrc=0,即nrc=1; - 当
nrc=0时,流量之和必须>=epsilon(保证非零)且<=m_rcmax,允许所有合法的非零流量; - 当
nrc=1时,依然强制流量之和为0。
如果你的流量是整数变量,那原来的方程是可行的,但如果是连续变量,一定要记得替换成epsilon哦~
内容的提问来源于stack exchange,提问作者Help621
相关产品推荐
相关产品推荐

