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. IOS第15天(3,事件处理,手势处理)

    7> 手势识别    使用UIImageView原因:之前既能看见图片,又能监听点击的只有UIButton,学了手势,我们的UIImageView也可以.    * tap(代理:左边不能点,右 ...

  2. 【iCore3 双核心板】例程四:USART通信实验——通过命令控制LED

    实验指导书及代码包下载: http://pan.baidu.com/s/1pJxluWF iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  3. 如何在Rails中执行Get/Post/Put请求

    require 'open-uri' require 'json' require 'net/http' class CoupleController < ApplicationControll ...

  4. 随手记一次利用开源zxing生成带嵌入logo的二维码图片

    之前就在项目里面用过zxing生成二维码,最近另一个项目同样需要用到二维码,故重新在学了学利用zxing生成二维码 接下来先做准备工作了,因为我是用vs2013上开发的,故选择了.net4.5版本的z ...

  5. LeetCode House Robber

    原题链接在这里:https://leetcode.com/problems/house-robber/ 题目: You are a professional robber planning to ro ...

  6. Python开发【第三章】:Python编码转换

    一.字符编码与转码 1.bytes和str 之前有学过关于bytes和str之间的转换,详细资料->bytes和str(第四字符串) 2.为什么要进行编码和转码 由于每个国家电脑的字符编码格式不 ...

  7. IEnumerable和IEnumerator

    概述 IEnumerable和IEnumerator接口存在的意义:用来实现迭代的功能! public interface IEnumerable { IEnumerator GetEnumerato ...

  8. SEO之HTML优化:让你的网站HTML代码更符合SEO规范

    摘要HTML优化是网站内部优化的重点,可能对SEO新手来说,容易忽略.符合搜索引擎习惯的HTML代码是极利于SEO的,可以让你的网站获得更好的搜索引擎排名.如何制作一个标准的HTML网页,如何做HTM ...

  9. 两种方法解决tomcat的 Failed to initialize end point associated with ProtocolHandler ["http-apr-8080"]

    出现这种原因主要是8080端口被占用了. 解决1: 打开任务管理器看看里面有没有javaw的线程,把它关了再重新启动tomcat看看. 解决2: 修改tomcat /conf /server.xml ...

  10. synchronized同步块和volatile同步变量

    Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量.这两种机制的提出都是为了实现代码线程的安全性.其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而 ...