回溯法:批处理作业调度

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

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

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

t机器1机器2
作业121
作业231
作业323

假设今天只有作业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)

转载注明出处。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值