本博文参考以下论文:
Pezzella F, Morganti G, Ciaschetti G. A genetic algorithm for the flexible job-shop scheduling problem[J]. Computers & Operations Research, 2008, 35(10): 3202-3212.
本博文所有图片均为该论文截图。
在GitHub上查看本文的代码:
https://github.com/mwanggh/FJSSP_GA
使用sequencing list representation方法进行编码,例如下面的调度
被编码为
初始化需要为每个工序分配一个机器,并且需要确定工序之间的顺序。
这里使用了两个分配方法:
我们先来看分配方法1:
看看一下面的例子:
我们有4台机器,3个工件,3个工件分别有3个、3个和2个工序。首先我们从中选出全局最小加工时间,它是工件2工序2在机器3上的处理时间,为1;将机器3分配给工件2工序2;在处理时间表中,将机器3其他工序的处理时间增加1. 接着寻找全局最小处理时间……重复此步骤,直至所有工序都被分配机器。
事实上,已经被分配机器的工序不会被再次选中,因此,每为一个工序分配了机器,我们就可以将该工序从加工时间表上删除。
接下来我们看看分配方法2:在加工时间表中,随机交换工件和机器的顺序,按照”从上到下“的规则,为每个工序分配加工时间(假设为t)最少的机器,在每次分配机器后,为该机器其他工序的加工时间增加t。下面是一个例子:
如图所示,随机交换后工件的顺序是3-1-2,机器的顺序是4-1-3-2. 按照“从上到下”的顺序,为每个工序分配加工时间最少的机器,因此为工件3工序1分配机器3(加工时间为3),并为机器3的其他工序加工时间增加3. 接下来为工件3工序2分配机器……
同样的,已经被分配机器的工序不会被再次选中,因此,每为一个工序分配了机器,我们就可以将该工序从加工时间表上删除。
这里使用了3个确定工序顺序的方法:
以最大剩余加工时间顺序为例,在按照分配规则1分配机器后(上文 Table 3),工件1、2和3的剩余加工时间分别为13(4+4+5),7(1+4+2)和6(3+3),其中具有最大剩余加工时间的工件为工件1,因此,先处理机器1的工序1;之后3个工件的剩余最大加工时间为9(4+5),7(1+4+2)和6(3+3),其中具有最大剩余加工时间的工件为工件2,因此,之后处理机器2的工序1……最后,调度为:
本文的目标函数值为最大完工时间(makespan),将其作为适应度值,适应度值越小,个体越优秀。
本文介绍了3中选择方法,但是最终证明Binary Tournament最有效:
对于表示机器分配情况的基因,交叉算子从所有工序中选择一个工序子集,交换两个父代个体中的这两个工序子集中工序的机器分配基因。
对于表示工序排序情况的基因,使用POX交叉:
p_2p2中其他工件的工序复制到子代个体c_1c1中,保持这些工序的顺序。
对于表示机器分配情况的基因,本文使用了两种变异算子:
对于表示工序排序情况的基因,使用PPS变异:
PPS变异只有变异后个体更优的情况下才会执行。
需要注意的是,具有最低工作量的机器不一定能处理具有最高工作量机器能处理的工序;一个工序在移动时需要满足工序之间的顺序约束。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有