智能算法(GA、DBO等)求解零等待流水车间调度问题(NWFSP)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附MATLAB代码。

主要参考资料:

[1] 潘全科, 高亮, 李新宇. 流水车间调度及其优化算法[M]. 武汉: 华中科技大学出版社, 2013.

加工对象一旦进入加工就不能中断,直到完成其所有操作,这就是零等待。例如,在钢铁生产的炼钢-连铸生产过程中,为实现热送热装的生产方式,减少钢液在空气中的温降,希望钢液在加工过程中零等待。图1(a)所示为一个3×3的零等待流水车间调度问题甘特图。由于工件加工零等待要求,当第一台机器加工完第一个工件时不能立即加工第二个工件,同理,第一台机器加工完第二个工件时也不能立即加工第三个工件。与图1(b)所示的置换流水车间调度相比,工件2和工件3的开工时间有所滞后。因此,零等待流水车间调度问题不同于一般的置换流水车间调度问题。

图片

图1

这里讨论一下零等待流水车间调度问题(NWFSP)和零空闲流水车间调度问题(NIFSP)的区别:NIFSP主要是针对机器而言,机器一旦加工就不能空闲;NWFSP主要是针对工件而言,工件一旦开始被加工,就不能等待。

01
问题描述

这里主要讨论以最大完工时间为优化目标的零等待流水车间调度问题(no-wait flow-shop scheduling problem, NWFSP),记为Fm|perm, no-wait|Cmax。研究表明,m≥3时,这类调度问题即为NP-Hard 问题。

NWFSP可描述为:n个工件在m台机器上加工,所有工件在各机器上的加工路线均相同。同时约定:某一时刻一个工件只能在一台机器上加工;一台机器在某一时刻只能加工一个工件;同一工件在相邻两道工序之间没有等待时间。每个工件在每,道工序的加工时间已知,问题是如何安排各工件的生产次序,使得调度指标最小。

02
数学模型

(以下内容截自推文开头提到的参考书籍,潘老师的那本书。)

图片

图片

03
加工性能指标计算

最大完成时间(Cmax)是研究零等待流水车间调度问题最常用的加工性能指标。这里只介绍Cmax的一种计算方法:计算相邻工件之间的开工时间差,其时间复杂度为O(nm)。(以下内容截自推文开头提到的参考书籍,潘老师的那本书。)Cmax的其他计算方法也可以在这本书籍里查阅。

图片

图片

图片

04
智能算法(GA、DBO等)编码方法

对于遗传算法(GA),因为其算法本身是离散的,通过选择、交叉、变异产生下一代。因此,一条染色体就代表一种调度方案。即工件的排序即是它的个体编码。例如,10个工件的排序方案,用MATLAB初始化GA的一个个体(一条染色体)就是:

x=randperm(10);

效果如下所示:

图片

但是对于粒子群优化(PSO)、麻雀搜索算法(SSA)、蜣螂优化(DBO)等,它们本身是针对连续优化问题提出的,所以在编码时需要经过进一步的处理。与GA一样,一个调度方案(工件排序)表示一个个体,可以采用SPV规则,将实数编码转成整数编码。例如,10个工件的排序方案,用MATLAB初始化DBO的一个个体(一条染色体)就是:

jobNum=10; % 工件数x=unifrnd(0,1,[1 jobNum]); % 产生10个[0,1]之间随机数os = 1:1:jobNum; % 产生从1到10的数列[~, up_index] = sort(x); % 对x进行降序排序, 得到位置序列x = os(up_index); % 按照位置序列排序工件, 得到一个调度方案

效果如下:

图片

此外,与SPV规则相反,Li等提出最大排序值法(Largest rank value, LRV),也是将连续值映射成离散排列常用的方法之一。如图2所示,LRV将代表种群个体的一组连续值按降序排列生成一组工件排序。(参考文献:[2] LI X, YIN M. An opposition-based differential evolution algorithm for permutation flow shop scheduling based on diversity measure [J]. Advances in Engineering Software, 2013, 55(8): 10-31.)

图片

图2 最大排序值法的表示方法

05
数值实验

这里对DBO求解NWFSP的效果进行简单测试,调度问题算例选用Rec(21个)。最大迭代次数T设置为2000,种群规模NP设为60。下面展示的结果都是算法随机运行一次得到的结果。

首先,以Rec05(20工件×5机器为例),展示DBO随机运行一次的求解结果。图3绘制了种群每代的最优适宜度收敛曲线和平均适宜度收敛曲线:

图片

图3 DBO-NWFSP对于Rec05的收敛曲线

图4绘制了调度结果的甘特图:

图片

图4 DBO-NWFSP对于Rec05的甘特图

其次,以Rec11(20工件×10机器为例),展示DBO随机运行一次的求解结果,如图5和图6所示。

图片

图5 DBO-NWFSP对于Rec11的收敛曲线

图片

图6 DBO-NWFSP对于Rec11的甘特图

最后,以Rec41(75工件×20机器为例),展示DBO随机运行一次的求解结果,如图7和图8所示。

图片

图7 DBO-NWFSP对于Rec41的收敛曲线

图片

图8 DBO-NWFSP对于Rec41的甘特图

06
MATLAB代码

智能算法(GA、PSO、DE、GWO、SSA、DBO等)求解零等待流水车间调度问题(no-wait flow-shop scheduling problem, NWFSP)的MATLAB代码,其中:main.m是主函数,直接运行即可;以算法简称命名的.m算法代码;gantt_chart.m用来绘制甘特图;objective.m是目标函数,即计算Makespan;method.pdf用来说明Makespan的计算方法,代码采用的是计算相邻工件之间开工时间差的方法;Car.xlsx和Rec.xlsx是流水车间调度的两个经典测试集。

输出结果包括Makespan、工件排序、计算时间、最优适宜度收敛曲线、平均适宜度收敛曲线、甘特图。

这里选择了十种算法来求解NWFSP。主要是几种经典算法和几个近几年的高引算法。对应的MATLAB代码链接如下:

遗传算法(GA)求解NWFSP关注公众号,里面有链接
差分进化(DE)求解NWFSP关注公众号,里面有链接
粒子群优化(PSO)求解NWFSP关注公众号,里面有链接
灰狼优化(GWO)求解NWFSP关注公众号,里面有链接
鲸鱼优化算法(WOA)求解NWFSP关注公众号,里面有链接
哈里斯鹰优化(HHO)求解NWFSP关注公众号,里面有链接
麻雀搜索算法(SSA)求解NWFSP关注公众号,里面有链接
非洲秃鹫优化算法(AVOA)求解NWFSP关注公众号,里面有链接
蜣螂优化(DBO)求解NWFSP关注公众号,里面有链接
星鸦优化算法(NOA)求解NWFSP关注公众号,里面有链接
以上十种智能优化算法(GA、DE、PSO、GWO、WOA、HHO、SSA、AVOA、DBO、NOA)求解NWFSP的全家桶关注公众号,里面有链接

可通过下方链接下载代码清单,在里面寻找需要的算法代码,然后去对应的链接获取。清单会同步更新,一旦有新的代码,就可以在清单里找到。清单里面有部分代码是开源获取的。可随时免费下载。

链接:https://pan.baidu.com/s/1SFDMplrL7tiqGZlrpOSGYg

提取码:8023

此外,欢迎添加算法交流群进行交流:912369858

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 50 加载内核3

接上节,在这里,我们把参数放到了栈中保存,大家注意到了,参数入栈的顺序是先从最右边的开始,最后压入的参数最左边的,其实这是某种约定,要不,为什么不先把中间的参数src入栈呢。既然主…

动手学无人驾驶(5):多传感器数据融合

本系列的前4篇文章主要介绍了深度学习技术在无人驾驶环境感知中的应用,包括交通标志识别,图像与点云3D目标检测。关于环境感知部分的介绍本系列暂且告一段落,后续如有需要再进行补充。 现在我们开启新的篇章,在本文中将会介绍无人…

详解两阶段3D目标检测网络PVRCNN:Point-Voxel Feature Set Abstraction for 3D Object Detection

在《动手学无人驾驶(4):基于激光雷达点云数据3D目标检测》一文中介绍了3D目标检测网络PointRCNN。今天介绍该作者新提出的3D检测模型:PVRCNN,论文已收录于CVPR2020。 作者个人主页为:https://sshaoshuai.gi…

一步步编写操作系统 53 任务状态段TSS介绍

操作系统是利用PCB来维护所有任务的,包括进程和线程,但cpu提供的是TSS,linux系统可没用它,因为效率太低。但是还是要了解下TSS才清楚操作系统中某些操作的原因。 本节中所讲的特权级与它有着密不可分的联系,TSS作用不…

动手学无人驾驶(6):基于IMU和GPS数据融合的自车定位

在上一篇博文《动手学无人驾驶(5):多传感器数据融合》介绍了如何使用Radar和LiDAR数据对自行车进行追踪,这是对汽车外界运动物体进行定位。 对于自动驾驶的汽车来说,有时也需要对自身进行更精确的定位,今天…

【Codeforces - 798C】 Mike and gcd problem(思维,贪心)

题干: Mike has a sequence A  [a1, a2, ..., an] of length n. He considers the sequence B  [b1, b2, ..., bn] beautiful if the gcd of all its elements is bigger than 1, i.e. . Mike wants to change his sequence in order to make it beauti…

一步步编写操作系统 48 加载内核1

其实,我们等了这一刻好久好久,即使我不说,大家也有这样的认识,linux内核是用c 语言写的,咱们肯定也要用c语言。其实...说点伤感情的话,今后的工作只是大部分(99%)都要用c语言来写&am…

Coursera自动驾驶课程第1讲:Welcome to the self-driving cars specialization

本专栏为Coursera自动驾驶课程笔记,B站上也有配套课程视频,对自动驾驶技术感兴趣的朋友可以看看。 本讲对应视频: https://www.bilibili.com/video/BV1WE411D74g?p1https://www.bilibili.com/video/BV1WE411D74g?p2https://www.bilibili.…

Coursera自动驾驶课程第2讲:The Requirements for Autonomy

上一讲《Coursera自动驾驶课程第1讲:Welcome to the self-driving cars specialization》对本课程进行了整体概述,同时回顾了自动驾驶汽车的发展历史。 从本讲我们开始进入正式的学习,我们将首先了解到如何划分自动驾驶汽车等级、以及自动驾…

一步步编写操作系统 51 加载内核4

咱们的内容都是连栽的,如果您没看过我之前的文章,本节您是看不懂的。 接上节。 介绍完内核初始化的函数kernel_init后,本节代码部分还差一点点没说啦,下面看代码: …略 179 ;在开启分页后,用gdt新的地址…

Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures

在上一讲《Coursera自动驾驶课程第2讲:The Requirements for Autonomy》中我们了解到了如何划分自动驾驶汽车等级、以及自动驾驶三大模块:感知、决策和执行。 本讲我们将学习新的模块:自动驾驶汽车的硬件和软件架构。 B站视频链接&#xff…

一步步编写操作系统 54 CPL和DPL入门1

我们在工作中,公司都给员工配有员工卡,此员工卡就是员工身份的“标签”,用它来出入公司、食堂就餐等。给公司创造价值的是员工的生产力,不是员工卡,员工卡只是公司人事部门管理员工的一种手段而已。 现在说计算机&…

Coursera自动驾驶课程第4讲:Safety Assurance for Autonomous Vehicles

在上一讲《Coursera自动驾驶课程第3讲:Self-Driving Hardware and Software Architectures》中我们了解了自动驾驶汽车常用的传感器和硬件组件、软件系统。 本讲我们将学习新的模块,也是自动驾驶汽车最重要的模块之一:安全模块。 B站视频链…

【Codeforces - 1000C】Covered Points Count(思维,离散化,差分)

题干: You are given nn segments on a coordinate line; each endpoint of every segment has integer coordinates. Some segments can degenerate to points. Segments can intersect with each other, be nested in each other or even coincide. Your task i…

Coursera自动驾驶课程第5讲:Vehicle Dynamic Modeling

在上一讲《Coursera自动驾驶课程第4讲:Safety Assurance for Autonomous Vehicles》中我们了解了自动驾驶汽车中一个非常重要的模块:安全模块。 本讲我们将学习新的模块:汽车运动学和动力学模块。(这部分可能需要一定的理论力学和…

Java同步锁——lock与synchronized 的区别【转】

在网上看来很多关于同步锁的博文,记录下来方便以后阅读 一、Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面…

Coursera自动驾驶课程第6讲:Vehicle Longitudinal Control

在上一讲《Coursera自动驾驶课程第5讲:Vehicle Dynamic Modeling》中我们了解了汽车运动学和动力学模块。 本讲我们继续学习新的模块:汽车纵向控制。具体地,我们将学习PID控制算法,看看该算法是如何在自动驾驶汽车中应用的。 B站…

Java并发:线程共享变量可见性原理

0、线程安全性:线程安全性包括两个方面,①可见性。②原子性。 0.1、线程之间的通信:线程的通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种共享内存和消息传递。 (1)在共…

Coursera自动驾驶课程第7讲:Vehicle Lateral Control

在上一讲《Coursera自动驾驶课程第6讲:Vehicle Longitudinal Control》中我们了解了如何使用PID算法进行汽车纵向控制。 本讲我们继续学习新的模块:汽车横向控制。具体地,我们将学习三种控制算法:Pure pursuit,Stanle…

Coursera自动驾驶课程第8讲:Basics of 3D Computer Vision

在上一讲《Coursera自动驾驶课程第7讲:Vehicle Lateral Control》中我们了解了如何对汽车进行横向控制。 本课程第一个篇章就暂时告一段落了,接下来我们开始学习新的篇章。 课程第二个篇章是状态估计和定位模块。不过在这里我做了一下调整,我…