遗传算法在JobShop中的应用研究(part1: 绪论)
1. 什么是JobShop问题
- Job,中文翻译成工件。一个工件又由若干道工序加工完成。
- resource, 资源。在本文的车间调度中资源指的是机器,每道工序要在某个特定机器上加工。
- Constraint, 约束。在车间调度中约束主要有以下两种:
- 同一个工件包含的工序有先后顺序。
- 每个机器不能同时处理两道工序,因此这台机器上完成工序时要串行,不能并行。
- Objective,目标。JobShop问题的一个常见目标是使所有工件完成的总时间最小,这个总时间英语叫做Makespan。
一个JobShop问题可以用一个表格来刻画,例如下面的表格:
θ(1,1) | θ(1,2) | θ(2,1) | θ(2,2) | |
r (i,j) | 1 | 2 | 2 | 1 |
D (i,j) | 3 | 2 | 5 | 1 |
θ表示工序,例如, θ(1,1)就表示第1个工件的第1道工序。
r (i,j)表示机器编号,例如,r(1,1)=1,表示第一个工件的第一道工序的加工机器号为1。
D (i,j) 表示加工时间,例如,D(1,1)=3,表示第一个工件的第一道工序的加工需要3个单位的时间。
JobShop问题的一个解可以用一个加权有向无环图来表示,请看下面的一个有向无环图:
这个加权有向无环图就代表上述JobShop问题的一个解,我们可以看到每个工序作为图中的一个节点出现,权重就是这个节点对应的加工时间。工序之间的先后顺序用箭头表示,在这里需要注意的是:除了同一个工件下面的工序之间有先后顺序外,同一台机器上加工的工序也要串行。另外,我们增加了两个虚节点,分别为 θI 和 θF,表示开始和结束。从θI有箭头指向每个工件的第一道工序,从每个工件的最后一道工序出发用箭头指向 θF。虚节点的加工时间为0。
一个有向无环图中有若干条从θI到θF的路径,在这些路径中我们找出那条路径上所有节点的权重相加最大的那一条,这个最大的权重和就是这个解对应的makespan,即所有工件加工完毕所需的时间。
注意:所有工件都完成的总时间(Makespan)不是3+2+5+1=11,而是上面那个有向完全图中所有能从开始节点到达结束节点的全体路径中那条所需时间最长的路径花费的时间,即7.下面是另外两个有向图,即另外两个解的例子:
2. 遗传算法与JobShop
遗传算法是一种随机搜索算法,它主要分为六大功能模块:编码、交叉、变异、解码、评价、选择。整个算法的流程如下:
编码:
我们利用工件号的排列来表示工序的先后顺序,例如:1212这个排列中第一个1代表第一个工件的第一道工序,第二个1代表第一个工件的第二道工序,第一个2代表第二个工件的第一道工序,第二个2代表第2个工件的第二道工序。可见,1212这个排列可以完全体现出上面的有向无环图中体现的节点先后顺序。
需要说明的是一个有向无环图可能对应多个工件号的排列方式,例如,1212,2121,1221,2112都对应上面的有向无环图。
在遗传算法中首先做的就是编码,即随机生成若干个工件号的排列,这些个随机生成的排列构成的集合被称为种群,每个排列被称为染色体。
如图所示,种群大小为4,该种群中包含4条染色体,分别为2211,1212,1122,2121。请思考为什么1111为非法染色体?
遗传算法在JobShop中的应用研究(part1: 绪论)的更多相关文章
- 遗传算法在JobShop中的应用研究(part 5:解码)
解码操作是整个遗传算法最重要的一步,在这步里面我们利用配置文件中的信息将染色体解码成一个有向无环图. 在介绍解码操作之前我们先来看一下配置文件,在part1绪论中我们已经介绍了一个车间调度问题的基本信 ...
- 遗传算法在JobShop中的应用研究(part4:变异)
下面,我们以车间调度为例来谈谈遗传算法中的另一个重要操作变异.变异操作通常发生在交叉操作之后,它的操作对象是交叉得到的新染色体.在本文中我们通过随机交换染色体的两个位置上的值来得到变异后的染色体,变异 ...
- 遗传算法在JobShop中的应用研究(part3:交叉)
2.交叉 交叉是遗传算法中的一个重要操作,它的目的是从两条染色体中各自取出一部分来组合成一条新的染色体这里,在车间调度中一种常见的交叉方法叫Generalized Order Crossover方法( ...
- 遗传算法在JobShop中的应用研究(part 7:整体流程)
""" pop是种群,种群中的每个个体的形式是,(makespan, 染色体)""" pop = [(ComputeStartTimes(g ...
- 遗传算法在JobShop中的应用研究(part 6:结果显示)
def FormatSolution(s, C, I): T = [0 for j in xrange(I.n)] S = [[0 for t in I[j]] for j in xrange(I.n ...
- 遗传算法在JobShop中的应用研究(part 2:编码)
编码 在上一篇博客中我们讨论了车间调度问题的编码,具体说就是根据工件的个数和每个工件的工序数来生成12122这样的数字排列,具体的说一个工件包含多少道工序,那么这个工件的编号就出现多少次.从12122 ...
- (转)RRU交织冗余在LTE-R组网中的应用研究
RRU交织冗余在LTE-R组网中的应用研究 王 芳1,2 庞萌萌1,2 (1.北京全路通信信号研究设计院集团有限公司,北京 100070; 2.北京市高速铁路运行控制系统工程技术研究中心,北京 100 ...
- Pywinauto在Windows Twain Driver自动化测试中的应用研究
摘 要: 以Python为基础,结合对Twain Driver测试工具的具体需求,将Pywinauto引入到Twain Driver的自动化测试中.介绍了Pywinauto的基本概念,通过测试用例说 ...
- 遗传算法中几种不同选择算子及Python实现
前言 本文对遗传算法中的几种选择策略进行了总结, 其中包括: Proportionate Roulette Wheel Selection Linear Ranking Selection Expon ...
随机推荐
- IOS第18天(7,CAKeyframeAnimation-图标抖动)
*** #import "HMViewController.h" #define angle2radian(x) ((x) / 180.0 * M_PI) @interface H ...
- 我自己的Javascript 库,封装了一些常用函数 Kingwell.js
我自己的Javascript 库,封装了一些常用函数 Kingwell.js 博客分类: Javascript javascript 库javascript库 现在Javascript库海量,流行的 ...
- java变量和方法的覆盖和隐藏(翻译自Java Tutorials)
隐藏变量 在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问.但是,父类的同名变量可以通过super访问.一般来说,不推荐隐 ...
- MyArrayAdapter 比较标准的写法
; i < mString.size(); i++) { insert(mString.get(i), i); } } notifyDataSetChanged(); LogUtils.LOGD ...
- smarty模板原理和增删改查例题
Smarty模板:(前后端分离)原理:核心是一个类,先修改配置文件,在使用的时候引入配置文件即可,(init.inc.php)$smarty->assign("ceshi", ...
- 通过 Chrome Workspace 调试本地项目(修改样式时及时保存)
打开 DevTools 开发者工具[F12]中的 Sources 面板,在面板左侧右键选择「Add folder to workspace」,选择添加的文件夹. 添加好后,右键一个文件,选择「Map ...
- Python高级特性(1):Iterators、Generators和itertools(参考)
对数学家来说,Python这门语言有着很多吸引他们的地方.举几个例子:对于tuple.lists以及sets等容器的支持,使用与传统数学类 似的符号标记方式,还有列表推导式这样与数学中集合推导式和集的 ...
- C/C++相对论——C++中为什么要使用异常(跳转语句会造成对象没有被析构)
C++中为什么要使用异常? 很多人也许知道C++中的异常机制,很多人也许不知道.很多人知道C中常用的assert,也知道在编译时候指定NODEBUG来忽略它. 对于C语言,使用正常的if-else即是 ...
- LNMP-Linux下Nginx+MySQL+PHP+phpMyAdmin+eAcelerator一键安装包
LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat.Debian/Ubuntu VPS(VDS)或独立主机安装LNMP(Nginx.MySQL.PHP.phpMyA ...
- ORA-01436: 用户数据中的CONNECT BY 循环
起始地 目的地 距离(公里)A B 1000A C 1100A ...