重排程策略与优化方法同等重要
一次出色的优化运行在第一次干扰面前就失效了。让生产排程保持可信的,是那个决定何时重新生成、重建什么、冻结什么的策略。三种排程模式让这一策略具体化。
早上 07:00,生产排程完美无瑕。干净的生产顺序、均衡的设备、整周读起来像一次顺畅的运行。早上 09:00,一台设备停机。到了中午,贴在墙上的生产排程与现在任何人都会构建的生产排程已经是两份不同的文档,没有人能确切说出它们何时、因何分道扬镳。
算法尽了它的职责,它构建的生产排程是好的。失败的是「应对」:当工厂不再配合时,没有人决定生产排程应当发生什么。当一份生产排程被打破时,谁来决定重建什么,又是否有人主动做出这个决定?
随工具而来的默认做法:重跑,然后接受返回的一切
在完全没有排程算法的工厂里,一周计划在电子表格中构建,一次干扰意味着规划团队手工重建它,没有快速的方法看出这次停机在下游造成了什么。这是一个真实的问题,也许正是你遇到的问题。
陷阱并不会随排程工具的到来而消失;它改变了形态。新的默认变成:再次运行算法,接受它返回的任何结果。算法没有问题。出问题的是反复变动。一个小的输入变化产生一次大的生产排程变化,生产排程不断变动,车间不再把它当作承诺。
这很重要,因为一份生产排程的功能就是成为人们可以依其工作的东西。一份每次有变动就跟着变动的生产排程,会停止履行这一功能;班组不再相信它上面的时间,它变成又一份文档。瓶颈不是优化质量,而是不受治理的重新生成:重建生产排程而不是调整它,且没有人在这两者之间做出决定。
反直觉的主张:重新生成策略才是瓶颈
这篇文章主张,区分可信生产排程与无用生产排程的,不是优化方法,而是重新生成策略。如果生产排程在第一次干扰时就被丢弃,一次出色的优化运行就一文不值。让生产排程保持可信的,是决定何时重新生成、重建什么、冻结什么的策略。
重排程作为一个独立问题已被研究数十年,它自己的决策层叠加在优化器之上;2003 年《Journal of Scheduling》的一篇框架论文就已勾勒出这一领域。
策略有三个杠杆
何时重新生成:触发器。 文献区分事件驱动、周期性与混合触发策略。「策略」是这一层的常用名称,虽然各来源的说法并不一致。对计划员来说,要点更简单:当生产排程被打破,第一个问题就是这次变更是否值得一次重跑。
重建什么:触及范围。 光谱从「重建一切」延伸到「只推迟受影响的」。完整重排程把生产排程当作可丢弃的,构建一份全新的;部分重排程保留某些部分,修订其余部分。两者都是经过研究的选择,且都有一席之地。
冻结什么:锚点。 保持固定的东西决定了优化器还能改进什么。完整重建可以重新排列生产顺序,找到换线次数更低的安排;保持顺序固定,则设备分配与时间安排成为仅有的自由度。冻结是「一切都可以变动」与「什么都不变动」之间的杠杆。
这三个杠杆叠加在任何优化器、任何工具之上。算法回答的是「给定重建,什么是最好的生产排程?」策略先回答那个更重要的问题:「给定干扰,重建本身应当是什么?」
坦诚的权衡
这里为策略辩护,而不是为冻结辩护。另一面是:
- 冻结会牺牲一点最优性。 保持生产排程的一部分固定,留给优化器可用的自由度就更少。
- 更多重新生成并不自动更好。 哪种策略胜出取决于工厂实际面对的干扰模式,因此这个选择值得有意做出,而不是默认行事。
- 有些干扰根本不应触发重新生成。 已经录入保守转移时间或现实工作日历的计划员,已经给了生产排程吸收小幅扰动的空间,无需重跑。
- 反复变动有时是有意的业务选择,而不是意外。
工厂可能对同一次干扰反应过度而得到反复变动,也可能反应不足而保留一份过时的生产排程。正是这种张力,让这个决定值得提前做出。
三种模式,三种重新生成姿态
在 Schantt 中,三种排程模式就是三种重新生成姿态——策略的产品化表达,而不是对干扰的分类:
Auto 模式:重建整份生产排程。 算法重新决定生产顺序、设备分配与时间安排,并从零构建生产排程。这是面向范围广、事先已知的变更的姿态,此时顺序自由度是可以接受的。
Semi-Auto 模式:保持生产顺序。 生产顺序保持不变,与计划员录入的完全一致;算法在其内部重新优化设备分配与时间安排。Semi-Auto 不只是推迟受影响的作业并把其余工作后推:它围绕被冻结的顺序重新优化。这就是冻结杠杆的具体化。
Manual 模式:手工编写生产排程。 从零编写时,计划员逐行写下生产排程。Schantt 校验工艺路线、设备兼容性、位置规则与工作日历约束,不运行任何优化。生产排程保持所编写的原样。这是极端的冻结情形。
| 模式 | 姿态 | 算法可以更改什么 | 保持冻结什么 |
|---|---|---|---|
| Auto | 重建整份生产排程 | 生产顺序、设备分配、时间安排 | 无;从零构建 |
| Semi-Auto | 保持生产顺序 | 设备分配与时间安排 | 生产顺序 |
| Manual | 手工编写生产排程 | 无;不运行优化 | 按编写原样的生产排程 |
一次干扰究竟如何进入生产排程?以被建模的产能形式,由计划员录入。一个停机时间窗——无论针对一台设备还是整个工厂——都在排程之前从工作产能中扣除,于是重跑让工作绕过它。一个工作日历例外,例如假日或加班日期,覆盖该日期的工作日历。工作流始终由计划员触发:计划员录入变更,计划员重跑,计划员选择模式。工具绝不会静默重排。在 Auto 与 Semi-Auto 模式下,每次重跑都优化到单一目标:最小化总生产时间。
在下次干扰之前写下策略
这些都不需要一本策略手册。它只需要提前决定几个情形下的做法:
- 对于范围广、事先已知的变更——计划性停产或假日周——重建整份生产排程。选择 Auto 模式。
- 对于局部干扰,若车间已按某个顺序设定好要运行,就让顺序保持不变,围绕它重新优化。选择 Semi-Auto 模式。
- 在生产排程必须从头到尾反映一项已承诺的决定时,自己编写它。当一次干扰只需要一次有针对性的手工修正时,也选择 Manual 模式:任何生产排程都可以在其中重新打开,无论它由哪种模式创建,而更新只应用计划员更改或删除的那些行,其余一切保持原样。
在一周受干扰的过程中,生产排程会被反复重新生成;关键在于每一次重新生成都是选择,而不是条件反射。所以把策略写下来:何时重新生成、重建什么、冻结什么。然后让工具执行这些选择。
下次干扰毋庸置疑
只有应对方式存在疑问。优化器会尽它的本分;策略决定一次重跑可以触及生产排程的多少。具备不同重新生成姿态的软件,做的比产出生产排程更多:它让工厂掌控生产排程如何演变。这正是生产排程在与工厂接触后依然存续、依然值得信任的方式。