2016-02-20 50 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