import math
m = [[2,3,2],[1,1,3]] # 每个作业分别在机器1与机器2的工作时间
x = [] # 初始化最优解
Min = math.inf # 记录最优时长
def Flow(m): # 初始化调度问题
n = len(m[0])
X = [i for i in range(n)]
t1 = 0 # 第一个机器的当前作业完成时间点
t2 = 0 # 第二个机器的当前作业完成时间点
Backtrace(0,m,X,n,t1,t2) # 递归函数
def Backtrace(i,m,X,n,t1,t2):
global Min # 初始化全局变量
if i == n : # 递归到头,更新最优解
if t2 < Min:
global x
Min = t2
x = X
for j in range(i,n): # 在当前情况下,遍历每一个子树分支
X[i],X[j] = X[j],X[i] # 依次与当前位置元素进行交换
t = X[i]
T1 = t1
T2 = t2
T1 += m[0][t]
if T1 > T2: # 比较第二个机器与第二个机器的结束时间,用于计算当前作业在第二个机器的结束时间点
T2 = T1 + m[1][t]
else:
T2 += m[1][t]
if T2 < Min: # 若已经超过Min,则不必再往下计算(进行剪枝)
Backtrace(i+1,m,X[:],n,T1,T2) # 传入的数组,必须为克隆后的数组X[:]
X[i],X[j] = X[j],X[i] # 恢复到初始状态
Flow(m)
print('最优调度下,流水线结束时间:',Min)
print('调度顺序:',x)
输出:
最优调度下,流水线结束时间: 8
调度顺序: [0, 2, 1]