2016-02-20 53 views
0

我想用遗传算法解决Job Shop调度问题,代码将用Python编写。Python:为遗传算法排序列表中的部分元素

当前,我将个人列为[job, operation, machine, operation]。例如,我这里是一个染色体:

jobs = [ [1,3,3,2], [3,3,1,3], [1,1,1,4], [2,2,1,4], [2,3,3,4], [3,1,3,3], [2,1,2,1], [1,2,2,3], [3,2,2,2] ] 

列表必须满足操作优先约束每一项工作,例如,在列表中选择正确顺序作业1

[1,1,1,4], [1,2,2,3], [1,3,3,2] 

换句话说,只有在其他工作保持在其职位上时,我必须订购工作1(索引0,索引2和索引7)。正确的结果将是:

jobs = [ [1,1,1,4], [3,3,1,3], [1,2,2,3], [2,2,1,4], [2,3,3,4], [3,1,3,3], [2,1,2,1], [1,3,3,2], [3,2,2,2] ] 

我迄今为止尝试:

确定/过滤器中的所有行包含作业1:

[row[:][:] for row in jobs if row[0]==1] 

输出

[[1, 1, 1, 4], [1, 2, 2, 3], [1, 3, 3, 2]] 
+0

@ 0k我试着:1.确定/过滤包含作业1的所有行,即>>> [行[:] [:]作业中的行如果行[0] == 1] [[1 ,1,1,4],[1,2,2,3],[1,3,3,2]] – user2090593

回答

0

这样做的直接方法是使用所需的作业编号制作临时工作清单,并对该临时清单进行排序。然后,您需要用已排序的项目替换原始项目,并且要正确执行此操作,您需要跟踪他们在作业列表中的位置。

j0 = [[1,3,3,2], [3,3,1,3], [1,1,1,4], [2,2,1,4], [2,3,3,4], 
    [3,1,3,3], [2,1,2,1], [1,2,2,3], [3,2,2,2]] 
print(j0) 

j1 = [[1,1,1,4], [3,3,1,3], [1,2,2,3], [2,2,1,4], [2,3,3,4], 
    [3,1,3,3], [2,1,2,1], [1,3,3,2], [3,2,2,2]] 
print(j1) 

def sortjob(alljobs, jobnum): 
    #get jobs with this jobnum 
    indices = [] 
    jobs = [] 
    for i, v in enumerate(alljobs): 
     if v[0] == jobnum: 
      indices.append(i) 
      jobs.append(v) 

    jobs.sort() 
    #put the sorted jobs back into the correct locations 
    for i, v in zip(indices, jobs): 
     alljobs[i] = v 

sortjob(j0, 1) 
print(j0)  

输出

[[1, 3, 3, 2], [3, 3, 1, 3], [1, 1, 1, 4], [2, 2, 1, 4], [2, 3, 3, 4], [3, 1, 3, 3], [2, 1, 2, 1], [1, 2, 2, 3], [3, 2, 2, 2]] 
[[1, 1, 1, 4], [3, 3, 1, 3], [1, 2, 2, 3], [2, 2, 1, 4], [2, 3, 3, 4], [3, 1, 3, 3], [2, 1, 2, 1], [1, 3, 3, 2], [3, 2, 2, 2]] 
[[1, 1, 1, 4], [3, 3, 1, 3], [1, 2, 2, 3], [2, 2, 1, 4], [2, 3, 3, 4], [3, 1, 3, 3], [2, 1, 2, 1], [1, 3, 3, 2], [3, 2, 2, 2]] 

注意sortjob修改了你通过它,就像list.sort方法不对列表,并使用Python惯例等功能sortjob返回None保持。

+0

非常感谢。我的python课程还没有涉及枚举,尚未压缩。我会学到很多。谢谢@PM 2Ring – user2090593