如何不依赖前一状态建模类开关事件?含初始状态场景
类开关场景的无状态依赖建模方案
核心思路
不再依赖前一时刻状态变量switch_var(t-1)递推,而是直接通过开启/关闭事件的时间点与当前时刻的先后关系定义灯泡状态,所有约束均为线性,适配整数规划求解。
情况1:初始状态为关闭(switch_var(0)=0)
定义变量
switch_var(t):t时刻灯泡状态(二元变量,1=开启,0=关闭)open(t):t时刻触发开启事件(二元变量,全局仅一个t取1)close(t):t时刻触发关闭事件(二元变量,全局仅一个t取1)T_open:开启事件发生的时间(整数变量,取值范围0 ≤ T_open ≤ T,T为最大时间节点)T_close:关闭事件发生的时间(整数变量,取值范围0 ≤ T_close ≤ T+1,T_close=T+1表示从未关闭)
约束条件
绑定事件与时间点:
sum_{t=0}^T t * open(t) = T_open sum_{t=0}^T open(t) ≤ 1 sum_{t=0}^T t * close(t) = T_close sum_{t=0}^T close(t) ≤ 1确保开启/关闭事件最多触发一次,且
T_open/T_close准确对应事件时间。开启必须早于关闭(若关闭发生):
T_open ≤ T_close若未触发关闭(
T_close=T+1),此约束自动成立。直接定义
t时刻状态:
当T_open ≤ t < T_close时,switch_var(t)=1,否则为0。线性化约束如下(取M=T+2为足够大的常数):T_open ≤ t + M*(1 - switch_var(t)) T_close ≥ t + 1 - M*switch_var(t)- 当
switch_var(t)=1时,约束强制T_open ≤ t且T_close ≥ t+1,满足开启后、关闭前的状态要求; - 当
switch_var(t)=0时,约束因M足够大自动成立,无需额外处理。
- 当
示例验证
假设最大时间T=9(t=0到9),开启事件在t=4,关闭事件在t=9:
T_open=4,T_close=9- t=0-3:
T_open>t,switch_var(t)=0 - t=4-8:
4≤t<9,switch_var(t)=1 - t=9:
t≥T_close,switch_var(t)=0
结果完全符合预期:0 0 0 1 1 1 1 1 1 0
情况2:初始状态为开启(switch_var(0)=1)
此时无需开启事件,仅需处理关闭逻辑:
定义变量
switch_var(t):t时刻灯泡状态(二元变量,1=开启,0=关闭)close(t):t时刻触发关闭事件(二元变量,全局仅一个t取1)T_close:关闭事件发生的时间(整数变量,取值范围0 ≤ T_close ≤ T+1,T_close=T+1表示从未关闭)
约束条件
绑定关闭事件与时间点:
sum_{t=0}^T t * close(t) = T_close sum_{t=0}^T close(t) ≤ 1直接定义
t时刻状态:
当t < T_close时,switch_var(t)=1,否则为0。线性化约束如下(取M=T+2):T_close ≥ t + 1 - M*switch_var(t)- 当
switch_var(t)=1时,约束强制T_close ≥ t+1,即关闭时间在当前时刻之后; - 当
switch_var(t)=0时,约束强制T_close ≤ t,即关闭时间已过; - 若未触发关闭(
T_close=T+1),所有t<T+1均满足t < T_close,switch_var(t)保持为1。
- 当
方案优势
彻底避免了递推式建模的边界问题(比如t从1开始时无需额外处理初始状态衔接),所有约束均为线性,可直接用于整数规划求解器,逻辑清晰且易维护。
内容的提问来源于stack exchange,提问作者Juan Miguel Dela Cruz
相关产品推荐
相关产品推荐

