双机流水作业调度问题的Johnson算法


求解流水作业调度问题的Johnson算法具体描述如下:
(1) 设a[i]和b[i](0<=i<n)分别为作业i在两台设备上的处理时间。建立由三元组(作业号,处理时间,设备号)组成的三元组表d。其中,处理时间是指每个作业所包含的两个任务中时间较少的处理时间。
设n=4,(a0,a1,a2,a3)=(3,4,8,10)和(b0,b1,b2,b3)=(6,2,9,15)的作业0的三元组为(0,3,0),作业1的三元组为(1,2,1)……如图(a)所示。
(2) 对三元组表按处理时间排序,得到排序后的三元组表d。如图(b)所示。
(3) 对三元组表的每一项d(i)(0<=i<n),从左右两端生成最优作业排列c[j](0<=j<n),c[j]是作业号。如果d[i]设备号为1,则将作业i置于c的左端末尾,否则置于c的右端末尾。如图(c)所示,由两端想中间存放。


作业号 处理时间 设备号
0 0       3       0
1 1       2       1
2 2       8       0
3 3       10      0
(a)三元组表

作业号 处理时间 设备号
0 1       2       1
1 0       3       0
2 2       8       0
3 3       10      0
(b)按处理时间排序


(0, 2, 3, 1)
(c)最优作业排列


P1 3 8 10 4
P2 6 9 15 2
(d)最优调度方案


程序是流水作业调度的Johnson算法。
Johnson算法

#include<iostream>
#include<algorithm>
using namespace std;

struct Triplet{        //三元组结构
    int operator<(const Triplet & b)const {return t <b.t;}
    int jobNo,t,ab;       //jobNo为作业,体委处理时间,ab为设备号
};

void FlowShop(int n,int *a,int*b,int*c)
{
Triplet d[n];
for(int i=0;i<n;i++) //算法步骤(1),生成三元组表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,d+n);//算法步骤(2),排序
int left=0,right=n-1;
for(int i=0;i<n;i++) //算法步骤(3),生成最优解
    if (d[i].ab==0) c[left++]=d[i].jobNo;
    else c[right--]=d[i].jobNo;
}

int main()
{
    int a[4]={3,4,8,10};
    int b[4]={6,2,9,15};
    int c[4];
    FlowShop(4,a,b,c);
    for(int i=0;i<4;++i)
      cout<<c[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值