很久以前,在一家工厂里有两个机器。
假设机器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)为例。
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)
转载注明出处。