• 0x07算法设计与分析复习(二):算法设计策略-动态规划法5


    参考书籍:算法设计与分析——C++语言描述(第二版)

    算法设计策略-动态规划法

    流水作业调度

    问题描述

    假定处理一个作业需要执行若干项不同类型的任务,每一类任务只能在某一台设备上执行。设一条流水线上有n个作业J={J0,J1,,Jn1}和m台设备P={P1,P2,,Pm}。每个作业需依次执行m个任务,其中第j(1jm)个任务只能在第j台设备上执行。所谓依次执行,是指对任意作业,在第j-1项任务完成之前,第j项任务不能开始处理。且每台设备任何时刻只能处理一项任务。设第i个作业的第j项任务Tij所需的时间为tji(1jm,0i<n)。如何将这n×m个任务分配给m台设备,使得这n个作业都能顺利完成,这就是流水线作业调度(flow shop schedule)

    对于流水线上的作业调度,有两种基本的方式,一种是非抢先调度(nonpreemptive schedule),它要求在一台设备上处理一项任务,必须等到该任务处理完毕才能处理另一项任务。另一种是抢先调度(preemptive schedule),它允许暂时中断当前任务,转而先处理其他任务,随后再接着处理被暂时中断的任务。

    作业i的完成时间fi(S)是指再调度方案S下,该作业的所有任务都已完成的时间。一种调度方案S的完成时间F(S)是指所有作业都完成的时间:

    F(s)=max0i<n{fi(S)}

    平均流动时间(mean flow time)MFT(S)定义为:
    MFT(S)=1ni=0n1fi(S)

    一组给定的作业的最优完成时间F(S)的最小值。

    OFT表示非抢先调度最优完成时间

    POMT:表示抢先调度最优完成时间

    OMFT:表示非抢先调度最优平均完成时间

    POMFT:表示抢先调度最优平均完成时间

    对于m>2,要得到具有OFT和POFT的调度方案是困难的,要得到具有OMFT的调度方案也是困难的。

    下面只讨论当m=2时获得OFT的调度方案的算法,这就是双机流水作业调度问题。为方便,用ai表示t1ibi表示t2i,两者分别为作业i再第一台设备和第二台设备上的处理时间。作为对比,批处理作业调度问题是求使得所有作业的完成时间之和FT(S)=n1i=0fi(S)最小的调度方案。(务必不要将两者弄混)

    双机流水作业调度描述为:设有n个作业的集合{0,1,2,,n1},每个作业都有两项任务要求再两台设备P1P2组成的流水线上完成加工。每个作业的加工顺序总是先再P1上加工,然后P2加工。P1P2加工作业i所需的时间分别为aibi。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在设备P1上开始加工,到最后一个作业在P2上加工完成所需的时间最少,即求使F(S)有最小值的调度方案。

    动态规划法求解

    设全部作业的集合为N={0,1,,n1}。设σ={σ(0),σ(1),,σ(k1)}是k个作业的一种调度方案,f1f2分别是在设备P1P2上,按该调度方案处理k个作业的时间。在P1完成前k个作业的处理后,设备P2还需用t=f2f1时间去处理完前k的作业中没有完成处理的作业,即在t时间之前,设备P2不能开始处理以后的作业。设这些剩余额作业组成的作业集为S,SN是N的作业子集。令g(S,t)为假定设备P2直到t时间后才可使用的情况下,使用设备P1P2处理S中作业的最优调度方案所需的最短时间。那么流水作业调度问题的最优值为g(N,0)

    定理:流水作业调度问题具有最优子结构的性质

    由流水作业调度问题的最优子结构性质可知:

    g(N,0)=min0i<n{ai+g(N{i},bi)}

    上式推广到一般情况,对任意作业子集S和作业i有:
    g(S,t)=ai+g(S{i},t),t=bi+max{tai,0}

    t=bi+max{tai,0}是因为任务bimax{ai,t}之前不能在设备P2上处理,因此,当作业i处理完毕时,有f2f1=bi+max{ai,t}ai=bi+max{tai,0}t决定了集合S{i}中的作业在P2上可以开始处理的时间。

    Johnson不等式

    设R是关于作业集合S的任一调度方案。假定设备P2在t时间之后可使用,令i和j是在方案R下最先处理的两个作业。根据最优子结构性质有:

    g(S,t)=ai+g(S{i},bi+max{tai,0})=ai+aj+g(S{i,j},tij)

    式中
    tij=bj+max{bi+max{tai,0}aj,0}=bj+biaj+max{max{tai,0},ajbi}=bj+biaj+max{tai,ajbi,0}=bj+biajai+max{t,ai+ajbi,ai}

    如果在调度方案的作业排序中,上述作业i和j满足min{bi,aj}min{bj,ai},则称作业i和j满足Johson不等式

    交换作业i和j大的次序,得到另一种调度方案R,设其完成时间为g(S,t),则有:

    g(S,t)=ai+aj+g(S{i,j},tji)

    式中,tij=bj+biajai+max{t,ai+ajbj,aj}

    假定i和j满足Johnson不等式,则有:

    max{bi,aj}max{bj,ai}ai+aj+max{bi,aj}ai+aj+max{bj,ai}max{ai+ajbi,ai}max{ai+ajbj,aj}max{t,ai+ajbi,ai}max{t,ai+ajbj,aj}

    所以如果两个作业i和j不满足Johnson不等式,可交换它们的处理次序使之满足,这样就不会增加完成时间。

    因此,存在一个最优作业调度,使得对于任意相邻的两个作业i和j,作业i先于j处理,都有min{bi,aj}min{bj,ai}。进一步可知,一个调度方案σ是最优的当且仅当对任意i<j,有

    min{bσ(i),aσ(j)}min{bσ(j),aσ(i)}

    根据以上的讨论,可以设计下列作业排序方法。这样做能得到最优调度方案:

    1. 如果min{a0,a1,,an1,b0,b1,,bn1}ai,则ai应是最优排列的第一个作业;
    2. 如果min{a0,a1,,an1,b0,b1,,bn1}bj,则bj应是最优排列的最后一个作业;
    3. 继续1和2的做法,直到完成所有作业的排序。

    Johnson算法

    求解流水作业调度问题的Johnson算法具体描述如下。

    1. 设a[i]和b[i](0i<n) 分别为作业i在两台设备上的处理时间。建立由三元组(作业号,处理时间,设备号)组成的三元组表d。其中,处理时间是指每个作业所包含的两个任务中时间较少的处理时间。
    2. 对三元组表按处理时间排序,得到排序后的三元组表d。
    3. 对三元组表的每一项d[i](0i<n),从左右两端生成最优作业排列c[j](0j<n),c[j]是作业号。如果d[i]的设备号为1,则将作业i置于c的左端末尾,否则置于c的右端末尾。
    //Johnson算法
    struct Triplet{
        //三元组结构
        int operator <(Triplet b)const {return t<b.t;}
        int jobNo,t,ab;//jobNo为作业号,t为处理时间,ab为设备号
    };
    
    void FlowShop(int n,int *a,int *b,int *c)
    {
        Triplet d[mSize]={{0,0,0}};
        for(int i=0;i<n;i++){
            //算法步骤一,生成三元组表d
            if(a[i]<b[i]){
                d[i].jobNo=i;
                d[i].ab=0;
                d[i].t=a[i];
            } else {
                d[i].jobNo=i;
                d[i].ab=1;
                d[i].t=b[i];
            }
        }
        Sort(d,n);//算法步骤二,任意排序算法
        int left=0,right=n-1;
        for(i=0;i<n;i++){
            //算法步骤三,生成最优解
            if(d[i].ab==0)
                c[left++]=d[i].jobNo;
            else
                c[right--]=d[i].jobNo;
        }
    }

    Johnson算法的时间取决于对作业集的排序,因此最坏情况下算法的时间复杂度为O(nlogn),所需空间复杂度为O(n)

  • 相关阅读:
    Linux 安装oracle客户端
    测试杂感:Bug Bash
    常用Eclipse插件在线安装地址
    [转]Source Insight使用小技巧小结
    cygwin安装
    Jmeter常见问题
    对测试人员或开发人员来说相互沟通有多重要?
    QTP基础学习(二)启动与设置
    什么是基准测试?
    推荐几款热门的网站测试工具
  • 原文地址:https://www.cnblogs.com/born2run/p/9581369.html
Copyright © 2020-2023  润新知