一、前言
利用数学规划建立和解决生产计划调度问题,已经是运筹学成熟应用领域之一。各种书籍、案例、最佳实践不胜枚举。
大部分数学规划方法在建立生产计划和调度模型时,假设以某个自然的时间间隔为建模时间单位,例如小时、日、天、周或者班次等。在建模时间单位内统计可用工时、初始库存和原料等,再优化每个时间单位内的加工种类和数量、工时分配、人员安排等。如果有一定次序关系,例如工序或者BOM等,次序隐含在以建模时间单位为最小单元的计划中。用到的设备和模具的产能是否满足一般是以累积工时的方式进行判断,也就是我们所说的“标量加和”,而不是“矢量加和“。这种建模思路比较适合件小量大场合。
二、案例场景
本文中的二个案例,也是生产计划和调度常见的二个场景。一个涉及到产线切换,一个涉及到多模式装配计划。为了方便理解,案例进行了简化,但保留了现实问题中的特点和重点。具体如下
(一)案例一:生产切换
场景:
(1) 二条产线 L1, L2,产能为 L1:24, L2:24
(2) 四种产品:A1, A2, B1, B2, 需求量:A1: 14, A2: 10, B1:12, B2: 12
(3) 四种产品切换的成本是
A1 |
A2 |
B1 |
B2 |
|
A1 |
0 |
1 |
4 |
4 |
A2 |
1 |
0 |
4 |
4 |
B1 |
4 |
4 |
0 |
1 |
B2 |
4 |
4 |
1 |
0 |
(4)初始条件:上个班次最后的加工状态是 L1:A1, L2:A2
目标:
如何分配产品到产线上,在完成需求量的同时,切换成本最小
(二)案例二:装配计划
场景:
(1)多个客户装配订单:O1,O2,O3,O4
(2)每个订单有三道工序 [1,2,3],处理时间不同。
工序1 |
工序2 |
工序3 |
|
O1 |
10 |
20 |
30 |
O2 |
40 |
30 |
20 |
O3 |
20 |
20 |
30 |
O4 |
40 |
40 |
30 |
(3)加工资源有 R1, R2,模具有M1,M2
(4)每道工序需要的加工资源和模具也不相同。这个范例假设每道工序都需要配备一台资源和一个模具才能开始加工。
(5)每道工序的资源和模具允许存在多种选择。例如对于加工资源
工序 |
资源 |
可选? |
|
O1 |
1 |
R1 |
Y |
O1 |
1 |
R2 |
Y |
O1 |
2 |
R1 |
Y |
O1 |
2 |
R2 |
N |
(完整数据请参考后续代码) |
O1 的工序1既可以选择R1,也可以选择R2,但O1的工序2只能选择R1,不能选择R2,以此类推。模具的选择也类似。
目标:
优化目标是完成全部订单的时间最短,这样可以最大化利用全部资源和模具。
三、建模思路
以上二个案例如果沿用传统的数学规划建模方式,那么可能需要
(1)对计划周期进行离散化,确定建模时间单位。例如以10分钟、20分钟、60分钟等作为时间单位,将所有时长变成建模时间单位的整倍数。
(2)在每个建模时间单位上,判断每个设备或者模具的占用率,确保不超过100%
(3)每道工序或者加工需要确保在多个建模时间单位上连续加工,一般不允许出现中间有中断。
(4)加工次序将变成如何找到适合某道工序的时间起始位置。
但离散化带来的负面影响也是非常明显,会造成:
(1)决策变量急剧增加,而且时间单位选择不当会造成优化结果不准确。在生产计划调度建模中,时间往往是最大的敌人。
(2)同时需要引入大量辅助变量,来判断生产的连续性,不重叠性,产生切换与否等情况。
(3)优化难度增加,严重影响优化效率。
对于此类问题,本文范例中引入了“虚拟时段”(slot)的概念。就是将计划周期上设置很多虚拟时段,这些虚拟时段有几个特点:
(1)每个时段内只能容纳单个任务。这个单个任务可以是一道工序,或者一次产品加工,或者一次资源分配
(2)每个时段的起讫时间是可变的,各不相同,但不重叠,也不必连续。
(3)时段的主要作用是为了给各种任务指定合理的次序。
(4)虚拟时段的数量需要涵盖可能发生的总任务数量。例如案例一中,每条产线最多加工4种产品,因此虚拟时段数量为4;