小黑算法成长日记22:批处理最优调度顺序(回溯法)

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]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值