You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google ORTools中为时间序列的开始时间设置区间归属约束?

解决方案

要实现startTime必须属于某一个给定时域范围的约束,不能直接对BoundedLinearExpression使用AddExactlyOne,得通过布尔决策变量+指示约束的方式转换逻辑,具体步骤如下:

1. 预处理时间数据

先把所有班次的时域范围整理成数值型区间列表(比如你给出的(0-34500,40000-65000…)),同时将startTime转换成对应的数值型决策变量(比如start_time_val,单位与时域范围保持一致)。

2. 创建布尔决策变量

为每个时域范围创建一个二进制变量in_range[i],用来标记startTime是否落在第i个区间内:

  • in_range[i] = 1:表示startTime属于第i个时域范围
  • in_range[i] = 0:表示不属于

3. 添加指示约束关联布尔变量与区间

针对每个时域范围,添加指示约束:当in_range[i]为1时,强制start_time_val落在对应的区间内;如果in_range[i]为0,则该约束不生效(若需要严格互斥,也可添加反向约束)。

4. 添加“恰好属于一个范围”的约束

通过对布尔变量求和等于1,实现AddExactlyOne的等价逻辑;如果只要求“至少属于一个”,则求和大于等于1即可。

代码示例(以Gurobi为例)

import gurobipy as gp
from gurobipy import GRB

# 整理好的时域范围列表(每个元素是(区间起始值, 区间结束值))
time_ranges = [(0, 34500), (40000, 65000), (0, 34500), (40000, 65000), (0, 34500), (40000, 65000)]

# 创建模型
model = gp.Model("time_range_constraint")

# 定义startTime对应的数值变量(根据实际需求调整上下界)
start_time_val = model.addVar(lb=0, ub=100000, name="start_time_val")

# 创建布尔变量数组,每个元素对应一个时域范围
in_range = model.addVars(len(time_ranges), vtype=GRB.BINARY, name="in_range")

# 为每个时域范围添加指示约束
for idx, (range_start, range_end) in enumerate(time_ranges):
    # 当in_range[idx]为1时,start_time_val必须≥区间起始值
    model.addGenConstrIndicator(in_range[idx], True, start_time_val >= range_start)
    # 当in_range[idx]为1时,start_time_val必须≤区间结束值
    model.addGenConstrIndicator(in_range[idx], True, start_time_val <= range_end)
    
    # 可选:如果需要严格互斥(即startTime不能同时属于多个范围),添加反向约束
    # model.addGenConstrIndicator(in_range[idx], False, start_time_val < range_start)
    # model.addGenConstrIndicator(in_range[idx], False, start_time_val > range_end)

# 添加约束:startTime必须恰好属于一个时域范围
model.addConstr(gp.quicksum(in_range) == 1, name="exactly_one_selected_range")

# 后续可添加目标函数或其他约束
# model.setObjective(...)

# 求解模型
model.optimize()

关键说明

  • AddExactlyOne要求参数是布尔变量(ILiteral类型,即0/1变量),而startTime < iteratedRange.start是线性表达式,无法直接传入,因此必须通过布尔变量将“是否在区间内”的逻辑转换为离散变量。
  • 如果使用其他求解器(如CPLEX),也有类似的指示约束API(比如CPLEX的addIndicator),逻辑完全一致。

内容的提问来源于stack exchange,提问作者Hakan Cunier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:22:42