回溯法:批处理作业调度

很久以前,在一家工厂里有两个机器。

假设机器1用来处理数据,机器2用来输出。所有的作业都是必须要先经过机器1,再经过机器2.

这个工厂今天接到了3批作业。

t 机器1 机器2
作业1 2 1
作业2 3 1
作业3 2 3

假设今天只有作业1,那么在t=0时,机器1开始运作,到t=2时,再将作业丢进机器2,到t=3时,作业结束,此时作业1的完成时间是t=3.

现在,我们将3个作业一同丢入机器,3个作业的排列顺序一共有6种。以次序(1,2,3)为例。
回溯法:批处理作业调度_第1张图片
f1,f2,f3相加是结束时间的总和,我们称之为完成时间和。批处理作业调度的目的是为了求最小的完成时间和。

通过构建解空间树和剪枝即可处理该问题。

下面是代码部分:

def traceback(depth):
    global t, n, now_arrange, best_arrange, now_time, best_time, f1, f2, included
    if depth >= n:
        if now_time < best_time:                 # 记录最优时间和最优安排
            best_time = now_time
            for i in range(0, n):
                best_arrange[i] = now_arrange[i]
    else:
        for i in range(0, n):
            if included[i] == 0:
                f1 += t[i][0]
                last_f2 = f2
                if f1 < f2:              # 机器1完成当前作业的任务1时,机器2还没有完成上一作业的任务2,
                    f2 = f2 + t[i][1]    # 此时当前作业的任务2要从上一作业的任务2的结束时间开始算。
                else:                    # 机器1完成当前作业的任务1,机器2已经就绪
                    f2 = f1 + t[i][1]

                if f2 + now_time > best_time:        # 剪枝函数
                    f1 -= t[i][0]
                    f2 = last_f2
                    continue

                included[i] = 1
                now_arrange[depth] = i
                now_time += f2

                traceback(depth+1)

                now_time -= f2
                f1 -= t[i][0]
                f2 = last_f2
                included[i] = 0


if __name__ == '__main__':
    t = [                                          # 时间表
        [2, 1],
        [3, 1],
        [2, 3]
    ]
    n = 3                                          # 工作数量
    now_arrange = [0, 0, 0]                        # 当前遍历情况的工作安排
    best_arrange = [0, 0, 0]                       # 最优工作安排
    now_time = 0                                   # 当前遍历时间
    best_time = 1000                               # 最优时间
    f1 = 0                                         # 机器1完成工作时间
    f2 = 0                                         # 机器2完成工作时间
    included = [0, 0, 0]                           # 记录当前枝条已走过哪些点
    traceback(0)
    print(best_time)
    print(best_arrange)

转载注明出处。

你可能感兴趣的:(回溯法,python,算法)