0

遺伝的アルゴリズムを使用して Job Shop Scheduling の問題を解決したいのですが、コードは Python で記述します。

現在、個人を のリストとして提示しています[job, operation, machine, operation]。たとえば、1 つの染色体の例を次に示します。

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]]
4

1 に答える 1

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 規則に従っていることに注意してください。sortjobNone

于 2016-02-20T07:07:50.183 に答える