前两篇文章中,我们介绍了FJSP问题,并梳理了一遍HA算法。这一篇文章对小编实现的(很乱很烂的)代码进行简单解读。
往期回顾:
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
代码下载请关注公众号,后台回复【FJSPHA】即可,不包括【】
代码框架
![](https://oscimg.oschina.net/oscnet/077d5214-c849-4eab-90f8-e4da00f713d1.png)
代码分为5个包,第一部分Data为用到的各类结构,第二部分GA为GA部分+第一个TS,第三部分主函数,第四、五部分是两个TS。
算例放置在input文件夹中,这里准备了Mk系列算例,Kacem系列算例和论文中的简单算例test.txt。
Main
算例输入:
![](https://oscimg.oschina.net/oscnet/39e020c3-d548-422d-a28b-89915e78a72a.png)
Main中还有一个输出为CSV的函数,需要一个jar包,已经放在下载链接里了,不需要的同学也可以删除。
![](https://oscimg.oschina.net/oscnet/a746a972-2bf2-41de-b643-5e16667a46b0.png)
Data
一堆乱七八糟的结构。这里简单讲一下Solution类和Graph类。
Solution类中包含多个print函数,比较重要的包括绘制甘特图以及check解是否合法。
![](https://oscimg.oschina.net/oscnet/f8c84b8d-65e0-4c9f-9c0d-a68790d921ee.png)
operationMatrix是解的主题,存放某个工件的某道工序的开始、结束时间,所在加工机器。
![](https://oscimg.oschina.net/oscnet/461e6a0d-8c70-4bbc-b2e2-e2fe827f9c34.png)
Graph类表示析取图。nodeList是每台机器上的node。其中起始点、终止点我单独提取出来设置了两个类。Graph中还包含了获取critical path的DFS和update starting time & end time的Bellman算法。
![](https://oscimg.oschina.net/oscnet/27a402e6-3ee4-4572-b6fc-f97d5d4dae63.png)
GA
MyHybridAlgorithm类是GA的主函数。小编在实现的时候进行了多种测试,比如迭代的noImprove次数达到limit时进行扰动:
![](https://oscimg.oschina.net/oscnet/a789d4c9-bc30-4cb1-a480-5cd2d44efdae.png)
选择哪种Tabu:
![](https://oscimg.oschina.net/oscnet/abd7b985-b64a-48d3-9026-b1f9d2847582.png)
读者在阅读的时候请自己注意。
算法相关的参数我都做了初始化,请自行查找修改:
![](https://oscimg.oschina.net/oscnet/c6b59a66-c898-48af-b093-ae2ed5112d28.png)
交叉、变异等操作包含在ChromosomeOperation类中,计算适应度的函数在CaculateFitness类中,TabuSearch1类是基于编码的tabu,这里都不多展示了。
NeighbourSearch
这个包包含的是基于析取图的tabu。NeighbourAlgorithms类相当于Main,包含解转化为图的函数:
![](https://oscimg.oschina.net/oscnet/d5480401-079e-441f-a377-053d633ea621.png)
TabuSearch2类为tabu主函数。NeighbourGraph类存放析取图邻域搜索产生的解。
DeleteNeighbourGraph类为析取图中暂时去掉某个点后的情况,PM、PJ、SM、SJ代表precede、succeed、machine、job四条边对应的点,deleteNode为删去的点。
![](https://oscimg.oschina.net/oscnet/cd0e8f5d-b55f-4b47-91ec-d93a163bfb80.png)
其中还有findLandR位置的二分查找函数,insert时的估值函数:
![](https://oscimg.oschina.net/oscnet/f7a2e941-0e55-4260-a5b9-a3b611d85130.png)
![](https://oscimg.oschina.net/oscnet/01b48a51-dc65-4a52-894a-e0d8bc6ec53d.png)
NeighbourSearch2
这个包为第三个基于甘特图的tabu。
RTS类为tabu的主函数。解通过:ArrayList> 的形式表示。
replan函数中包含了在甘特图上进行swap操作后更新解的方法,有详细注释: 郑州哪个医院看男科好http://www.zztjnk.com/
郑州哪个医院男科专业http://www.ytsgnk.com/
![](https://oscimg.oschina.net/oscnet/e14e63ae-c240-47c4-bcf7-9c3f3202e7e5.png)
总结
到这里已经大致梳理了一遍代码,但其中还有很多细节没有讲到,包括很多东西实现的不好,欢迎随时和我交流。
由于是自己研究时写的代码,其中很多东西会比较乱,但是代码中做了很多注解,仔细阅读应该能看得懂的!
下载的压缩包里包括我学习过程中看过的大部分文献,包括主要参考的文献,大家可以进一步阅读研究。