对于流水车间调度问题,n个工件在m台设备上加工,已知每个工件每个工序使用的机器和每个工件每个工序所用时间,通过决策每个机器上工件的加工顺序和每个工序的开始时间,使完成所有工序所用时间(makespan)最小。具有下列约束:
- 不同工件的工序之间没有顺序约束。
- 某个工序一旦开始加工就不能中断。
- 每个机器在某一时刻只能加工一个工序。
- 机器不发生故障。
本文使用基于工序的编码方式,重点讲述(precedence operation crossover)POX交叉算子,通过遗传算法对流水车间调度问题进行求解。
基于工序的编码方式
基于工序的编码方式:这种编码方法中,每个工件的工序都用工件序号表示,根据工件需要在色体重出现的次数表示工序。对于一个n个工件在m台机器上加工的调度问题,其染色体由n×m个基因组成,每个工件的序号在染色体中出现m次,从左到右扫描染色体,工件序号第k次出现,表示该工件的第k道工序。这种编码方式具有解码和置换染色体后总能得到可行解的优点。
对于3个工件,每个工件3个工序的调度问题,一条染色体的例子及其对应的解释如下(图中注释为[工件-工序]序列,比如3-2表示3号工件第2道工序:
2 | 1 | 1 | 3 | 1 | 2 | 3 | 3 | 2 |
2-1 | 1-1 | 1-2 | 3-1 | 1-3 | 2-2 | 3-2 | 3-3 | 2-3 |
解码
将染色体看作工序的有序序列,根据工序在该序列上的顺序进行解码。工序的开始时间是该工件紧前工序完工时间和机器紧前工序完工时间中的大值,工序的结束时间是工序的开始时间与工序的加工时间之和。特别的,对于每个工件的第1个工序,由于不存在工件紧前工序,因此开始时间是机器紧前工序完工时间,如果不存在机器紧前工序,那么开始时间为时刻0。工件紧前工序是指该工序所属工件该工序的前1道工序,机器紧前工序是指该工序所用机器该工序的前1道工序。下图展示了各工序的开工时间的判断依据:
POX交叉算子
POX(precedence operation crossover)交叉算子得到的子代总是可行的。染色体p1 和p2 交叉生成两个子代c1 和c2,交叉过程如下:
1)随机划分工件集为两个非空子集J1 和J2;
2)复制p1中属于工件集J1 中工件的工序到c1,复制p2中属于工件集J1 中工件的工序到c2,保留它们的位置;
3)复制p1中属于工件集J2 中工件的工序到c2,复制p2中属于工件集J2 中工件的工序到c1,保留它们的顺序。
该小节内容完,后续内容再更新。