1. 编码

在上一篇博客中我们讨论了车间调度问题的编码,具体说就是根据工件的个数和每个工件的工序数来生成12122这样的数字排列,具体的说一个工件包含多少道工序,那么这个工件的编号就出现多少次。从12122中我们可以看出总共有两个工件1和2,工件1下面有两道工序,工件2下面有三道工序,所以1出现了2次,2出现了3次。

此外,我们还提到了种群的概念,种群就是指随机生成多个工件号排列的集合,集合中排列的个数就是种群的大小。大家思考一下如何编程实现初始种群的生成,大家看一下下面的python代码:

 def InitPopulation(ps, I):
gene = [j for j in xrange(I.n) for t in I[j]]
population = []
for i in xrange(ps):
shuffle(gene)
population.append([j for j in gene])
return population

第1行我们定义了一个生成初始种群的函数,叫作InitPopulation,这个函数接收两个参数,ps 和 I。ps是个整型变量,它的值表示种群的大小,I是个list, 里面存放的是每个工件下每道工序使用的机器号和在该机器上加工的时间。我们还是用上一篇博客的那一个两个工件,两台机器的例子来说明

aaarticlea/png;base64,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" alt="" />

I=[[(1,3),(2,2)],[(2,5),(1,1)]]。

I 下面又分别有两个list, 它们是I[0]=[(1,3),(2,2)] 和I[1]=[(2,5),(1,1)]。

I.n 表示 工件的个数,这里 I.n=2。

I.m 表示 机器的个数,这里I.m=2。

第2行 gene表示染色体模版,所有的染色体通过这个模版产生。就上面这个I而言,第二行执行完后gene的结果是1122,即按工件号由小到大排列,每个工件号出现的次数与这个工件包含的工序数相同。

第3行 定义一个空list命名为population

4,5,6 行 for循环,生成ps个染色体,存放在population中,最后返回population。具体做法是利用python的shuffle函数来随机打乱gene的顺序来制造染色体(第5行),比如第一次shuffle(1122)后的结果可能是1212,第二次的结果是shuffle(1122)的结果可能是2211,这样经过ps次shuffle操作就可以生成ps个染色体存到population中(第6行)。

第7行 返回种群population。

总结:大家请思考一下染色体与有向无环图的对应关系,尤其要注意的是一个有向无环图可以对应多条染色体,但一条染色体只能对应一个有向无环图这个特点。

遗传算法在JobShop中的应用研究(part 2:编码)的更多相关文章

  1. 遗传算法在JobShop中的应用研究(part1: 绪论)

    1. 什么是JobShop问题 Job,中文翻译成工件.一个工件又由若干道工序加工完成. resource, 资源.在本文的车间调度中资源指的是机器,每道工序要在某个特定机器上加工. Constrai ...

  2. 遗传算法在JobShop中的应用研究(part 5:解码)

    解码操作是整个遗传算法最重要的一步,在这步里面我们利用配置文件中的信息将染色体解码成一个有向无环图. 在介绍解码操作之前我们先来看一下配置文件,在part1绪论中我们已经介绍了一个车间调度问题的基本信 ...

  3. 遗传算法在JobShop中的应用研究(part4:变异)

    下面,我们以车间调度为例来谈谈遗传算法中的另一个重要操作变异.变异操作通常发生在交叉操作之后,它的操作对象是交叉得到的新染色体.在本文中我们通过随机交换染色体的两个位置上的值来得到变异后的染色体,变异 ...

  4. 遗传算法在JobShop中的应用研究(part3:交叉)

    2.交叉 交叉是遗传算法中的一个重要操作,它的目的是从两条染色体中各自取出一部分来组合成一条新的染色体这里,在车间调度中一种常见的交叉方法叫Generalized Order Crossover方法( ...

  5. 遗传算法在JobShop中的应用研究(part 7:整体流程)

    """ pop是种群,种群中的每个个体的形式是,(makespan, 染色体)""" pop = [(ComputeStartTimes(g ...

  6. 遗传算法在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 ...

  7. (转)RRU交织冗余在LTE-R组网中的应用研究

    RRU交织冗余在LTE-R组网中的应用研究 王 芳1,2 庞萌萌1,2 (1.北京全路通信信号研究设计院集团有限公司,北京 100070; 2.北京市高速铁路运行控制系统工程技术研究中心,北京 100 ...

  8. Python中的字符串与字符编码

    本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章. ...

  9. 广告系统中weak-and算法原理及编码验证

    wand(weak and)算法基本思路 一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应 该,主要 ...

随机推荐

  1. Choose Concurrency-Friendly Data Structures

    What is a high-performance data structure? To answer that question, we're used to applying normal co ...

  2. LeetCode | Single Number II【转】

    题目:Given an array of integers, every element appears three times except for one. Find that single on ...

  3. ss与udp转发的释疑

    转载: http://shadowsocks.info/shadowsocks-udp/ VPS购买地址 udp是什么:UDP 是User Datagram Protocol的简称, 中文名是用户数据 ...

  4. win commands

    wmic process where name="explorer.exe" delete 我想你问得应该是运行命令吧!我查了,没有,你自己参考一下:Windows常用命令集 wi ...

  5. [troubleshoot][archlinux][X] GPU HANG

    前言:如下内容已经是在hang完大概半个多月后了,当时想写,一直没过来写,写blog果然也是已经花费时间的事情. 最近一直在休假,电脑的使用频率也不多.后来还是为了生活,不情愿的去开始上班了,上班的第 ...

  6. entity.Student@150f3932, entity.Student@1a740c6b 没有实体中的数据

    public class AppServerAction extends BaseAction {    /**     *      */ /**      * 初始化 “我的产品”列表 JSP页面 ...

  7. linux查看是否被入侵

    一.检查系统日志 lastb命令检查系统错误登陆日志,统计IP重试次数 二.检查系统用户 1.cat /etc/passwd查看是否有异常的系统用户 2.grep “0” /etc/passwd查看是 ...

  8. OC-数组排序-NSSortDescriptor使用

    OC-数组排序-NSSortDescriptor使用 在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArr ...

  9. VS2015/2013/2012 IIS Express Debug Classic ASP

    参考资料: https://msdn.microsoft.com/en-us/library/ms241740(v=vs.100).aspx When you attach to an ASP Web ...

  10. 实现easyui datagrid在没有数据时显示相关提示内容

    本示例实现easyui datagrid加载/查询数据时,如果没有相关记录,则在datagrid中显示没有相关记录的提示信息,效果如下图所示 本实例要实现如下图所示的效果: 本示例easyui版本为1 ...