笔记 / Timefold Solver / 领域模型建模
01 / 02 / 05

时间建模模式

状态
持续整理
来源
Obsidian
创建
2026/05/14
公开整理
2026/07/31

30 秒速览#

Timefold 中时间不一定都是规划变量。时间可以是固定事实、普通变量、时间粒度变量,也可以由链式顺序推导成影子变量。

时间类型选择#

Java 类型适合场景
DayOfWeek + LocalTime无具体日期的周内排班
LocalDate只关心日期
LocalDateTime单时区且不考虑 DST
OffsetDateTime涉及时区或夏令时
避免 java.util.Date慢且容易出错

三种主要模式#

模式核心适用场景
Timeslot实体选择固定时间槽课程表、固定班次
TimeGrain实体选择时间粒度起点会议、粗粒度起止时间
Chained Through Time顺序决定开始时间车辆路径、连续生产、任务队列

Timeslot 模式#

适合所有任务时长相同,或可以统一膨胀成相同时间槽的场景。

优点:

  • 简单。
  • 约束容易写。
  • demo 友好。

缺点:

  • 不适合大量不同持续时间的连续任务。

TimeGrain 模式#

把时间切成粒度,例如 15 分钟、半天、一天。实体选择开始粒度,结束时间由持续粒度推导。

风险:

  • 粒度越细,候选值越多。
  • 窗口越长,搜索空间越大。
  • 1 分钟粒度 + 长周期通常不适合直接求解。

Chained Through Time 模式#

适合任务一个接一个执行,后一个任务的开始时间由前一个任务结束时间推导。

生产排程常见:

产线 -> 任务A -> 任务B -> 任务C
text

任务B.startTime = 任务A.endTime + 换型/等待时间

这种模式重点优化顺序,而不是直接搜索每个任务的时间。

生产排程建议#

  • 固定班次选择:Timeslot。
  • 粗排计划:TimeGrain。
  • 产线连续生产、换型、前后顺序强相关:Chained Through Time。
  • 只需要给人一个周任务包、不关心周内顺序:Time Bucket。

易错点#

  • 用分钟级 TimeGrain 处理长周期大规模任务,搜索空间会爆。
  • 明明顺序决定时间,却把开始时间直接做成变量,约束会复杂很多。
  • 只用影子时间保证物理正确,忘记用软约束惩罚换型和延期。

关联笔记#