如何在CPLEX中基于tmin和tmax定义时间区间Ti?
在CPLEX中定义区间变量Ti ∈ [tmin, tmax]的实现方法
一、OPL语言实现
假设你已通过如下方式定义tmin和tmax参数:
int tmin = 5; // 示例可用时间 int tmax = 20; // 示例交付时间
方式1:直接在变量定义时指定区间
如果Ti是可选的点区间(即表示时间点,开始等于结束,且变量可能不被激活):
interval Ti optional size 0 in [tmin, tmax];
- 去掉
optional可强制Ti必须存在; - 修改
size值可定义时间段区间(比如size=3表示持续3个单位时间的任务)。
方式2:通过约束显式限定
先定义区间变量,再添加约束:
interval Ti optional size 0; subject to { startOf(Ti) >= tmin; endOf(Ti) <= tmax; // 若需Ti为时间点,添加:startOf(Ti) == endOf(Ti); }
如果是多任务场景(tmin和tmax为数组参数),可定义区间数组:
int n = 10; int tmin[1..n] = [3,5,2,...]; int tmax[1..n] = [18,20,15,...]; interval Ti[1..n] optional size 0 in [tmin[i], tmax[i]];
二、Python API(docplex.cp)实现
先导入库并初始化模型,定义参数:
from docplex.cp.model import CpoModel mdl = CpoModel() tmin = 5 # 可用时间参数 tmax = 20 # 交付时间参数
定义点区间变量(表示时间点)
# start和end都限定在[tmin, tmax],size=0表示开始等于结束 Ti = mdl.interval_var(start=(tmin, tmax), end=(tmin, tmax), size=0, name="Ti")
定义时间段区间变量
如果Ti是持续固定时长的任务,比如持续5个单位时间:
Ti = mdl.interval_var(start=(tmin, None), end=(None, tmax), size=5, name="Ti")
也可以通过显式约束补充限定:
mdl.add(mdl.start_of(Ti) >= tmin) mdl.add(mdl.end_of(Ti) <= tmax)
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

