标签:
在上一篇博客中我们讨论了车间调度问题的编码,具体说就是根据工件的个数和每个工件的工序数来生成12122这样的数字排列,具体的说一个工件包含多少道工序,那么这个工件的编号就出现多少次。从12122中我们可以看出总共有两个工件1和2,工件1下面有两道工序,工件2下面有三道工序,所以1出现了2次,2出现了3次。
此外,我们还提到了种群的概念,种群就是指随机生成多个工件号排列的集合,集合中排列的个数就是种群的大小。大家思考一下如何编程实现初始种群的生成,大家看一下下面的python代码:
1 def InitPopulation(ps, I): 2 gene = [j for j in xrange(I.n) for t in I[j]] 3 population = [] 4 for i in xrange(ps): 5 shuffle(gene) 6 population.append([j for j in gene]) 7 return population
第1行我们定义了一个生成初始种群的函数,叫作InitPopulation,这个函数接收两个参数,ps 和 I。ps是个整型变量,它的值表示种群的大小,I是个list, 里面存放的是每个工件下每道工序使用的机器号和在该机器上加工的时间。我们还是用上一篇博客的那一个两个工件,两台机器的例子来说明
I=[[(3,1),(2,2)],[(5,2),(1,1)]]。
I 下面又分别有两个list, 它们是I[0]=[(3,1),(2,2)] 和I[1]=[(5,2),(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。
标签:
原文地址:http://www.cnblogs.com/zhaogeatdlnu/p/5673014.html