基于Google OR Tools的多机器作业车间调度(含换型时间)实现问询
多机器柔性作业车间+换型时间扩展提示
核心变量扩展
- 保留柔性作业车间的核心变量:
- 每个工序
(job_id, task_id)的机器选择布尔变量selected[job_id][task_id][machine_id],标记该工序是否在指定机器上加工。 - 每个工序在选定机器上的开始时间
start[job_id][task_id]、结束时间end[job_id][task_id]。
- 每个工序
- 新增换型相关辅助变量:对每台机器
m,定义该机器上任意两个工序i和j(来自不同作业)的排序布尔变量before[m][i][j],标记工序i是否在工序j之前在机器m上加工。
换型时间约束实现
参考单机器示例的换型逻辑,将其扩展到多机器场景:
- 对每台机器
m,遍历所有可能在该机器上加工的工序对(i, j)(i和j属于不同作业):- 当
before[m][i][j]为真时,工序j的开始时间必须 ≥ 工序i的结束时间 + 换型时间(从换型字典中按i所属作业、j所属作业获取对应值)。 - 用SAT蕴含约束实现:
model.AddImplication(before[m][i][j], start[j] >= end[i] + setup_time[i_job][j_job])。
- 当
- 补充机器上的工序互斥约束:对同一机器
m上的任意两个工序i和j,必须满足before[m][i][j] XOR before[m][j][i],确保同一机器上的工序有明确先后顺序。
关联机器选择与时间约束
- 对每个工序
(job, task),只有当selected[job][task][m]为真时,该工序的时间变量才与机器m的调度逻辑关联:- 约束
end[job][task] == start[job][task] + processing_time[job][task][m]仅在selected[job][task][m]为真时生效,用model.Add(end[job][task] == start[job][task] + processing_time[job][task][m]).OnlyEnforceIf(selected[job][task][m])实现。
- 约束
- 同一作业的工序时序约束:确保同一作业的前序工序结束后,后续工序才能开始,该逻辑与原柔性示例一致,无需修改。
数据结构调整
- 将换型时间字典扩展为适配多机器的结构:如果换型时间与机器无关,可保留
setup_time[prev_job][curr_job];如果不同机器换型时间不同,需调整为setup_time[machine][prev_job][curr_job],确保能正确获取对应机器上的换型时长。
目标函数与求解
- 目标仍为最小化最大完工时间,和原示例一致:
model.Minimize(max_end_time),其中max_end_time是所有工序结束时间的最大值。 - 求解器调用逻辑可复用原柔性示例的代码,无需大幅修改。
内容的提问来源于stack exchange,提问作者Martin Stimpfl
相关产品推荐
相关产品推荐

