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. BizTalk开发系列(二十五) SQL Adapter

    SQL Server 是.NET开发的首选数据库.当然开发BizTalk应用程序很多也离不了SQL Server.针对SQL Server的数据操作BizTalk 提供了SQL Adapter作为与数 ...

  2. Transform a BST to greater sum tree

    Given a BST, transform it into greater sum tree where each node contains sum of all nodes greater th ...

  3. mysql root 维护

    修改root密码: mysql -uroot -paaamysql> use mysql;mysql> UPDATE user SET password=password("aa ...

  4. 从.NET和Java之争谈IT这个行业[转]

    一.有些事情难以回头 开篇我得表名自己的立场:.NET JAVA同时使用者,但更加偏爱.NET.原因很简单 1.NET语言更具开放性,从开源协议和规范可以看出; 2.语言更具优势严谨; 3.开发工具V ...

  5. 主动模式下FTP的详细工作过程(转) 挺详细

    主动模式下FTP的详细工作过程   PORT FTP是常用的FTP工作方式,当客户端的连接请求到来时,FTP服务器会利用默认的21端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...

  6. 数据库表结构对比同步mysqldiff

    开发服务器的数据库表结构进行了修改,或者修改过多,为了与线上的数据库结构同步,可以使用mysqldiff工具对线上数据库打补丁. mysqldiff Windows下载地址:http://dev.my ...

  7. 基于VirtualBox的多重载入

    问题描述 这个问题要追溯到中秋之前,也就是写第一周博客的时候,当时我用的还是虚拟机上的ubuntu:当时我的ubuntu不是最新版,所以有提示升级,你懂的,我升了(因为时间有点久,我先去吃了个饭):等 ...

  8. 《Linux内核分析》第四周 扒开系统调用的“三层皮”

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...

  9. WIN2008 R2 安装SQLSERVER2008笔记

    系统升级到SERVER2008R2 有些地方和WIN2003区别很大 这里记下 1.IIS 2008已经自带了不需要再额外找安装包或者系统盘安装 只需要打开服务管理器“角色”中添加”“web服务器(I ...

  10. sublimetext ruby 插件

    写ruby的编辑器推荐  俗话说磨刀不误砍柴工,好的编辑器可以写的更舒服,更快. 完全初学者建议用RubyMine,这个目前估计最强的写Ruby的IDE. 不过我没有使用它,因为它速度太慢了.如果你能 ...