Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >作业车间调度JSP与遗传算法GA及其Python/Java/C++实现

作业车间调度JSP与遗传算法GA及其Python/Java/C++实现

作者头像
短短的路走走停停
发布于 2020-02-25 05:15:26
发布于 2020-02-25 05:15:26
5.2K0
举报
文章被收录于专栏:程序猿声程序猿声
大家好呀,好久不见!

最近小编接触了遗传算法(Genetic Algorithm)。关于遗传算法,公众号内已经有多盘技术推文介绍:

【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)

转载 | 遗传算法求解混合流水车间调度问题(附C++代码)

今天小编再为大家带来CSDN上一位大牛@sundial dreams

关于遗传算法在 作业车间调度问题 上的相关内容,希望大家喜欢!

(原文附图)

问题描述

作业车间调度(Job shop scheduling problem, JSP) 是车间调度中最常见的调度类型,是最难的组合优化问题之一,应用领域极其广泛,涉及航母调度,机场飞机调度,港口码头货船调度,汽车加工流水线等,因此对其研究具有重大的现实意义。科学有效的生产调度不但可以提高生产加工过程中工人、设备资源的高效利用,还可缩短生产周期,降低生产成本。

作业车间调度问题描述:

一个加工系统有M台机器,要求加工N个作业,其中,作业i包含工序数为L_i。令,则L为任务集的总工序数。其中,各工序的加工时间已确定,并且每个作业必须按照工序的先后顺序加工。调度的任务是安排所有作业的加工调度排序,约束条件被满足的同时,使性能指标得到优化。作业车间调度需要考虑如下约束:

1.每道工序在指定的机器上加工,且必须在前一道工序加工完成后才能开始加工。

2.某一时刻1台机器只能加工1个作业。

3.每个作业只能在1台机器上加工1次。

4.各作业的工序顺序和加工时间已知,不随加工排序的改变而改变。

问题的数学模型:

令(i,j)表示作业i的第j个工序。S_ij和T_ij分别表示(i,j)的加工起始时刻和加工时间。Z_ijk表示(i,j)是否在第k台机器上加工:如果(i,j)在第k台机器上加工,Z_ijk=1;否则,Z_ijk=0,C_k为第k台机器的完工时间,则问题的数学模型如下:

公式(1)为目标函数,即优化目标,系统中使用总加工时间最短为优化目标。公式(2)表示1个作业只能在加工完成前一道工序后才可以加工后一道工序。公式(3)表示1个作业的第1道工序的起始加工时刻大于或等于0。公式(4)表示在1台机床上不会同时加工1个以上的作业。

遗传算法

随着遗传算法(genetic algorithm (GA))在组合优化问题的广泛应用,许多人开始对遗传算法进行深度研究。已有研究结果表明,遗传算法对求解作业车间调度问题具有较好的效果,因此系统采用遗传算法来解该问题,遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。系统通过模拟生物进化,包括遗传、突变、选择等,来不断地产生新个体,并在算法终止时求得最优个体,即最优解。

遗传算法解决作业车间调度问题基本步骤:

1.初始化一定数量的种群(染色体编码)

2.计算个体适应度(染色体解码)

3.采用锦标赛法选择染色体并交叉产生新个体

4.个体(染色体)变异

5.达到遗传代数终止算法并从中选取适应度最优的个体作为作业车间调度问题的解

流程图如下:

遗传算法所需参数:

1.种群规模:种群中个体的数量,用populationNumber表示

2.染色体长度:个体的染色体的长度,用chromosomeSize表示

3.交叉概率:控制交叉算子的使用频率,用crossProbability表示,并且值为0.95

4.变异概率:控制变异算子的使用频率,用mutationProbability表示,并且值为0.05

5.遗传代数:种群的遗传代数,用于控制遗传算法的终止,用times来表示

遗传算法实现基本步骤及伪代码:

1. 编码及初始化种群

采用工序实数编码来表示染色体,即M台机器,N个工件,每个工件的工序数为process_i,则染色体长度为chromosome=process_1+process_2+...,对染色体编码如下:

chromosome=...,w_i,w_j,w_k,...

其中w_i代表第i个工件编号,而出现的次数代表该工件的第几道工序。例如{0, 1, 2, 1, 2, 0, 0, 1, 2},中0,1,2表示工件的编号,第几次出现就代表第几道工序。然后将每一次随机生成的染色体个体加入到种群集合中。

算法伪代码:

2. 解码及计算适应度

将优化目标定义为总加工时间最短,因此适应度定义为最短加工时间的倒数,设fitness为对应个体的适应度,fulfillTime为最短加工时间,因此

其中fulfillTime的计算方法如下:

首先定义如下变量

然后从左到右遍历个体的染色体序列,其中表示第i个工件的编号,则对应的当前工序为,设为p。当前工件当前工序所使用的机器编号为,设为m。当前工件当前工序对应的加工时间为,设为t。则工件的第p道工序的最晚开始时间为

而第m台机器的加工时间为

工件的第p道工序的结束时间为

最后加工完所有工件的最短加工时间fulfillTime为

从而计算出适应度fitness。

PS.小编觉得解码的过程类似动态规划

伪代码如下:

3. 个体选择算子

个体的选择使用锦标赛法,其基本策略为从整个种群中随机抽取n个个体让它们竞争,选取其中最优的个体。该算子的选择过程如下

伪代码如下:

4. 染色体交叉算子

使用Order Crossover(OX)交叉算子,该算子的交叉步骤如下:

对于一对染色体g1, g2,首先随机产生一个起始位置start和终止位置end,并由从g1的染色体序列从start到end的序列中产生一个子代原型

将g2中不包含在child prototype的其余编码加入到child prototype两侧

上述步骤将产生一个child,交换g1, g2即可产生另一个child

伪代码如下:

5. 染色体变异算子

变异的作用主要是使算法能跳出局部最优解,因此不同的变异方式对算法能否求得全局最优解有很大的影响。使用位置变异法作为变异算子,即从染色体中随机产生两个位置并交换这两个位置的值

伪代码如下:

6. 算法整体伪代码如下:

代码实现

原作者编写了JavaPython,C++三个版本的代码,小编仔细阅读了Java代码,在其中加入一些注释并略作修改,分享给大家。

说明一下输入部分,输入的算例是写死在代码中的,算例如下:

  1. Jop0=[(0,3),(1,2),(2,2)]
  2. Jop1=[(0,2),(2,1),(1,4)]
  3. Jop2=[(1,4),(2,3)]

在这个例子中,作业jop0有3道工序:它的第1道工序上标注有(0,3),其表示第1道工序必须在第0台机器上进行加工,且需要3个单位的加工时间;它的第2道工序上标注有(1,2),其表示第2道工序必须在第1台机器上进行加工,且需要2个单位的加工时间;余下的同理。总的来说,这个实例中共有8道工序。

图中是其中一种可行解。

那么本期内容到这里就差不多结束了。下次再见~

最后祝愿武汉早日度过难关,小编早就想上学了!

武汉加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿声 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
遗传算法求解混合流水车间调度问题(附C++代码)
各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵。于是,今天我们带来了一个神奇的优化算法——遗传算法!
用户1621951
2019/10/18
2K0
转载 | 遗传算法求解混合流水车间调度问题(附C++代码)
各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵。于是,今天我们带来了一个神奇的优化算法——遗传算法!
短短的路走走停停
2019/06/04
1.3K0
转载 | 遗传算法求解混合流水车间调度问题(附C++代码)
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题一
对于流水车间调度问题,n个工件在m台设备上加工,已知每个工件每个工序使用的机器和每个工件每个工序所用时间,通过决策每个机器上工件的加工顺序和每个工序的开始时间,使完成所有工序所用时间(makespan)最小。具有下列约束:
mwangblog
2019/01/23
1.6K0
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题一
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
一道工序一旦开始加工,就不能中断。每台机器一次只能加工一道工序。在初始加工时刻,所有工件和机器都是可用的。
短短的路走走停停
2020/08/06
3.2K0
遗传算法简单实例_遗传算法的特点有哪些
为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值:
全栈程序员站长
2022/11/04
1.4K0
遗传算法简单实例_遗传算法的特点有哪些
遗传算法求解混合流水车间调度问题(HFSP)二:算法实现一
上图中,第1、2行是第1工序的2台设备,第3、4行是第2工序的2台设备,第5、6行是第3工序的两台设备,纵轴代表时间。按照最优序列[ 3 4 6 2 1 5]赋予每个零件优先级,一共用时25.
mwangblog
2018/12/25
2K0
遗传算法求解混合流水车间调度问题(HFSP)二:算法实现一
遗传算法经典实例matlab代码_遗传算法编码方式
遗传算法(Genetic Algorithm,GA)是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法简单、通用,鲁棒性强,适于并行处理。
全栈程序员站长
2022/09/30
1.4K0
遗传算法经典实例matlab代码_遗传算法编码方式
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题二
下面是主程序、交叉算子程序、计算目标函数值程序,全部程序都可以下载(下载全部程序)。
mwangblog
2019/01/23
1.2K0
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题二
遗传算法求解混合流水车间调度问题(HFSP)一:问题介绍
混合流水车间调度问题(Hybrid Flow-shop Scheduling Problem, HFSP)是车间调度中的一类经典问题。混合流水车间调度问题,在一道工序有一台或多台机器,工件的加工需要满足一定的工艺顺序。
mwangblog
2018/12/24
2.4K0
柔性作业车间调度问题(Flexible Job-shop Scheduling Problem, 简称为FJSP)
(Flexible Job-shop Scheduling Problem, 简称为FJSP)
用户1621951
2020/06/01
19.2K1
_作为一个程序员一定要掌握的算法之遗传算法
一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓!”算法吧~,就比如说遗传算法啊
会洗碗的CV工程师
2023/11/18
2790
_作为一个程序员一定要掌握的算法之遗传算法
使用遗传算法解决柔性作业车间调度问题 (pezzella2008genetic)
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.
mwangblog
2019/09/17
1.4K0
使用遗传算法解决柔性作业车间调度问题 (pezzella2008genetic)
遗传算法的基本概念
遗传算法(genetic algorithm, GA)是模拟自然界生物进化机制的一种算法,遵循适者生存、优胜劣汰的法则。
mwangblog
2018/10/18
1.5K0
遗传算法的交叉变异详解
单点交叉又称为简单交叉,它是指在个体编码串中只随机设置一个交叉点,然后在该点相互交换两个配体个体的部分染色体。图1为单点交叉运算的示意图。
里克贝斯
2021/05/21
9.3K0
遗传算法的交叉变异详解
干货|遗传算法解决带时间窗的车辆路径规划问题(附java代码及详细注释)
各位读者大家好,今天小编给大家分享如何用遗传算法求解带时间窗的车辆路径规划问题。算法的主要思想来自于论文:A simple and effective evolutionary algorithm for the vehicle routing problem。在实现用遗传算法解VRPTW的过程中,小编一直在被生成了很多不可行解修复很困难而困扰,而这篇论文中所提出的算法恰好就避免了不可行解的处理,那么究竟是如何实现避免讨论不可行解的呢?接着读完这篇推文就能明白了~
用户1621951
2019/10/23
3.3K18
干货|遗传算法解决带时间窗的车辆路径规划问题(附java代码及详细注释)
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
短短的路走走停停
2020/08/12
1.4K0
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
干货 | 嘿!你和遗传算法的距离也许只差这一文(附C++代码和详细代码注释)
这是数据魔术师的第5篇算法干货文 ▲ 一 什么是遗传算法? 遗传算法(Genetic Algorithm,简称GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任一初始种群(Population)出发,通过随机选择、交叉和变异操作,产生一群更适合环境的个体,使群体进化到搜索空间中越来越好的区域,这样一代一代不断繁衍进化,最后收敛到一群最适应环境的个体(Individual),从
用户1621951
2018/04/19
4K1
干货 | 嘿!你和遗传算法的距离也许只差这一文(附C++代码和详细代码注释)
基于nsga2的多目标柔性车间调度问题matlab[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144856.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/26
6500
【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)
遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
短短的路走走停停
2019/05/14
27.4K2
【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)
干货 | 遗传算法(Genetic Algorithm) (附代码及注释)
本文目录 01遗传算法定义 02生物学术语 03问题导入 04大体实现 05具体细节 06代码实现 字数 6739 字 阅读 预计阅读时间20分钟 01 什么是遗传算法? 1.1 遗传算法的科学定义
用户1621951
2018/06/11
23K0
推荐阅读
遗传算法求解混合流水车间调度问题(附C++代码)
2K0
转载 | 遗传算法求解混合流水车间调度问题(附C++代码)
1.3K0
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题一
1.6K0
种群进化+邻域搜索的混合算法(GA+TS)求解作业车间调度问题(JSP)-算法介绍
3.2K0
遗传算法简单实例_遗传算法的特点有哪些
1.4K0
遗传算法求解混合流水车间调度问题(HFSP)二:算法实现一
2K0
遗传算法经典实例matlab代码_遗传算法编码方式
1.4K0
基于POX交叉的遗传算法求解流水车间调度(J-Shop)问题二
1.2K0
遗传算法求解混合流水车间调度问题(HFSP)一:问题介绍
2.4K0
柔性作业车间调度问题(Flexible Job-shop Scheduling Problem, 简称为FJSP)
19.2K1
_作为一个程序员一定要掌握的算法之遗传算法
2790
使用遗传算法解决柔性作业车间调度问题 (pezzella2008genetic)
1.4K0
遗传算法的基本概念
1.5K0
遗传算法的交叉变异详解
9.3K0
干货|遗传算法解决带时间窗的车辆路径规划问题(附java代码及详细注释)
3.3K18
混合算法(GA+TS)求解作业车间调度问题(JSP)-禁忌搜索部分
1.4K0
干货 | 嘿!你和遗传算法的距离也许只差这一文(附C++代码和详细代码注释)
4K1
基于nsga2的多目标柔性车间调度问题matlab[通俗易懂]
6500
【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)
27.4K2
干货 | 遗传算法(Genetic Algorithm) (附代码及注释)
23K0
相关推荐
遗传算法求解混合流水车间调度问题(附C++代码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文