2016-02-20 2 views
0

Je veux résoudre le problème de planification de Job Shop en utilisant l'algorithme génétique et le code sera écrit en Python. Je présente actuellement l'individu comme une liste de [job, operation, machine, operation]. Par exemple, voici par exemple d'un chromosome:Python: Ordre des éléments partiels dans la liste pour l'algorithme génétique

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

La liste doit satisfaire la contrainte de priorité de fonctionnement pour chaque emploi, par exemple l'ordre d'un emploi 1 dans la liste est

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

En d'autres termes , Je dois faire la commande pour le travail 1 (index 0, index 2, et index 7) seulement pendant que les autres travaux restent dans leur position. Le résultat correct sera:

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

Ma tentative à ce jour:

Déterminer/filtre toutes les lignes contenant l'emploi 1:

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

sortie

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

@ 0k J'essaie: 1. de déterminer/filtrer toutes les lignes contenant le travail 1, c'est-à-dire >>> [row [:] [:] pour row dans les jobs si row [0] == 1] [[1 , 1, 1, 4], [1, 2, 2, 3], [1, 3, 3, 2]] – user2090593

Répondre

0

La méthode la plus simple consiste à créer une liste temporaire des travaux avec le numéro de travail souhaité et à trier cette liste temporaire. Ensuite, vous devez remplacer les éléments d'origine par ceux qui ont été triés, et pour ce faire correctement, vous devez garder une trace de leurs positions dans la liste des tâches.

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)  

sortie

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

Notez que sortjob modifie la liste que vous passez, tout comme la méthode list.sort fait, et conformément à la convention Python pour de telles fonctions sortjob renvoie None.

+0

Merci beaucoup. Ma leçon de python n'a pas couvert enumerate, zip encore. J'apprendrai beaucoup. Merci @PM 2Ring – user2090593