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. classmethod一个用处是创建可选类构造器

    Definition and Introduction通常来说, descriptor 是一种绑定着特殊行为属性的对象, 在访问它时行为被descriptor协议定义的方法所重载.这些方法是__get ...

  2. CNUOJ 2104 Day6-例3

    http://privateoj.cnuschool.org.cn/oj/home/problem.htm?problemID=2104 题的网址 没什么好解释的,用DFS= = 最开始记着把f数组下 ...

  3. copy module

    需求,当有一个实例a,我们需要一个新的实例b,b同a拥有相同的属性. 当我们使用a=b的模式的时候是一个赋值的过程.a和b指向同一个实例.b的任何操作都同a一样. 在这个使用需要使用copy模块.根据 ...

  4. java跳出外部循环

    java跳出外部循环两种方法 //用flag标识 boolean flag = true; for(int i=0;i<10&&flag;i++){ for(int j=0;j& ...

  5. Android实现推送方式解决方案

    当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息. 要获取服务器上不定时更新的信息,一般来说有两种方法: 第一 ...

  6. C输入输出函数与缓冲区

    #转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...

  7. android:layout_gravity 和 android:gravity 的区别

    gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思. android:layout_gravity 和 android:gravity 的区别 从名字上可以看到,android:gr ...

  8. Android studio -VSN 使用笔记

    1.Android studio 安装 中文组官网:http://www.android-studio.org/ 常见问题参考: 分支冲突合并 http://blog.csdn.net/tearsmo ...

  9. LeetCode Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  10. SQL Nexus

    在前面的SQLdiag系列中有提到SQLNexus,当时我们用SQLNexus查看了Perfmon Summary(性能计数器).ReadTrace Reports(跟踪文件)两项报表.SQLNexu ...