加工生产调度(Johnson算法 双机流水作业调度问题)

加工生产调度

题目描述:
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
输入描述:
第一行仅—个数据n(0 < n < 1000),表示产品的数量。
接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。
最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。
输出描述:
第一行一个数据,表示最少的加工时间;
样例输入:
5
3 5 8 7 10
6 2 1 4 9
样例输出:
34
数据范围及提示:
0 < n < 1000
思路:
双机流水作业问题
以样例数据为例:
(A1, A2, A3, A4, A5)=(3, 5, 8, 7, 10)
(B1, B2, B3, B4, B5)=(6, 2, 1, 4, 9)
则(m1, m2, m3, m4, m5)=(3, 2, 1, 4, 9)
排序之后为:(m3, m2, m1, m4, m5)
处理m3,因为m3=B3,所以m3安排在后面(,,,,3);
处理m2,因为m2=B2,所以m2安排在后面(,,,2,3);
处理m1,因为m1=A1,所以m1安排在前面(1,,,2,3);
处理m4,因为m4=B4,所以m4安排在后面(1,,4,2,3);
处理m5,因为m5=B5,所以m5安排在后面(1,5,4,2,3)。
从而得到加工的顺序1,5,4,2,3。计算出最短的加工时间34。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1010;
int n,a[maxn],b[maxn],c[maxn],t[maxn];
struct node//三元组结构
{
    int id;//工作编号
    int ab;//在哪个机器
    int times;//时间
    bool operator < (node tmp)const
    {
        return times<tmp.times;//按时间从小到大排序
    }
}s[maxn];
void johnson()//Johnson算法 生成三元组表s
{
    for(int i=1;i<=n;i++)
    {
        if(a[i]>b[i])
        s[i].ab=2,s[i].times=b[i];
        else
        s[i].ab=1,s[i].times=a[i];
        s[i].id=i;
    }
    sort(s+1,s+n+1);//按times从下到大排序
    int l=0,r=n+1;
    for(int i=1;i<=n;i++)//生成加工顺序
    {
        if(s[i].ab==1)
        c[++l]=s[i].id;
        if(s[i].ab==2)
        c[--r]=s[i].id;
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    for(int i=1;i<=n;i++)
    cin>>b[i];
    johnson();
    for(int i=1;i<=n;i++)////计算最少时间 
    t[i]=t[i-1]+a[c[i]];
    int ans=t[1]+b[c[1]];
    for(int i=2;i<=n;i++)
    ans=max(ans,t[i])+b[c[i]];
    cout<<ans;//答案
    return 0;
}
posted @ 2016-09-17 15:20  抽空的太阳  阅读(702)  评论(0编辑  收藏  举报