zoukankan      html  css  js  c++  java
  • 流水作业调度问题———Johnson算法

    问题描述:

    N个作业1,2,…,n要在由2台机器A和B组成的流水线上完成加工。每个作业加工的顺序都是先在A上加工,然后在B上加工。A和B加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器A上开始加工,到最后一个作业在机器B上加工完成所需的时间最少。求这个最少的时间。

    大概思路:求一个加工顺序使得加工时间最短,就是让机器空闲时间最短,当A开始工作便会一直运作,关键是B会等待A,很明显A加工第一个作业时B得等待,同理B加工最后一个作业A得等待

    Johnson算法

    此算法是一种贪心策略:把在A机器上加工最快的作业先加工,把B机器上加工最快的作业放在最后

    具体实现:

    (M_i=min{a_i,b_i })
    将数组M由小到大排序,然后从第一个开始处理,若(M_i=a_i)则按顺序排在作业加工顺序的前面,若(M_i=b_i)则按顺序排在后面
    最后排出来的顺序就是最优解


    算法证明

    (S={ J_1,J_2,J_3····J_n })为待加工作业排序,
    (T(S,t))为A开始加工S中作业,B需t时刻后才能加工A加工完的作业,这种情况下加工完S中作业所需最小的时间
    (T(S,t)=min { a_i+T ( S- { J_i }, b_i+max{t-a_i,0} ) }), (J_iin S)
    假设最佳方案是先加工(J_i),然后加工(J_j),则有
    (T(S,t)=a_i+T(S- {J_i} , b_i+max {t-a_i,0 })=a_i+a_j+ T(S-{J_i,J_j },b_i+bj+T_{ij}))
    (T_{ij}=b_j+max {b_i+max { t-a_i,0 }-a_j,0},0} = b_i+b_j-a_i-a_j+max{t,a_i,a_i+a_j-b_i})
    (J_i)(J_j)调换顺序则:
    (T'(S,t)=a_i+a_j+T(S-{J_i,J_j}, T_{ji}))
    (T_{ji}=b_i+b_j-a_i-a_j+max{t,a_j,a_i+a_j-b_j})
    所以(T(S,t)<=T'(S,t)),所以有
    (max{t,a_i,a_i+a_j-b_i} <= max{t,a_j,a_i+a_j-b_j})
    (a_i+a_j+max{-b_i,-a_j}<=a_i+a_j+max{-b_j,-a_i})
    (其实2步转化我不太清楚,只是意会了一下,如有理解的麻烦告诉我,感谢)

    (min{b_j,a_i}<= min{b_i,a_j})
    也就是说(J_i)(J_j)之前加工最优得满足上式条件,
    (a_i<=b_i,a_j)或者 (b_j<=b_i,a_j)
    即在A机器上加工时间短的任务优先,而在B机器上加工时间短的排在后面,与具体实现的步骤相符

  • 相关阅读:
    Raid卡在Write back 与Write through 时的性能差异
    mysql 的outfile以及infile 语法简单备份恢复表
    @SneakyThrows
    java中的mmap实现--转
    以ATT&CK为例构建网络安全知识图
    横向移动攻击点与识别
    Tomcat开启JMX监控
    mysql serverTimezone
    自增还是UUID?数据库主键的类型选择,为啥不能用uuid做MySQL的主键?
    数据库:查询结果中增加数据库不存在的字段的方法
  • 原文地址:https://www.cnblogs.com/hh--boke/p/15339870.html
Copyright © 2011-2022 走看看