0

我想使用遗传算法解决作业车间调度问题,代码将用 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]]
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会修改您传递给它的列表,就像方法所做的那样,并与此类函数的Pythonlist.sort约定保持一致。sortjobNone

于 2016-02-20T07:07:50.183 回答