流水线作业调度问题c语言,流水线作业调度问题

题目:

感觉有些 , 还要思考的地方 , 留下了 ,以后看。。。。

Description

N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。

流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。

Input

输入包括若干测试用例,每个用例输入格式为:

第1行 一个整数代表任务数n,当为0时表示结束,或者输入到文件结束(EOF)

第2行至第n+1行每行2个整数,代表任务在M1,M2上所需要的时间

Output

输出一个整数,代表执行n个任务的最短时间

Sample Input

Original

Transformed

1

1 2

0

Sample Output

Original

Transformed

3

#include

#include

struct node

{

int m1,m2;

};

struct node time[2][20000];

int cmp1(const void *p1,const void *p2)

{

return ( (*(struct node *)p1).m1>(*(struct node *)p2).m1? 1:-1);

}

int cmp2(const void *p1,const void *p2)

{

return ( (*(struct node *)p1).m2>(*(struct node *)p2).m2? -1:1 );

}

int main()

{

int n,i,a,b,q,p,time1,time2;

while(scanf("%d",&n)!=EOF&&n)

{

q=p=0;

time1=time2=0;

for(i=1;i<=n;i++)

{

scanf("%d%d",&a,&b);

if(b>=a)

{

time[0][q].m1=a;

time[0][q++].m2=b;

}

else{

time[1][p].m1=a;

time[1][p++].m2=b;

}

}

qsort(time[0],q,sizeof(time[0][0]),cmp1);//m1 降序

qsort(time[1],p,sizeof(time[1][0]),cmp2);//m2 升序

for(i=0;i

{

time1+=time[0][i].m1;

if(time2

time2=time1;

time2+=time[0][i].m2;

}

for(i=0;i

{

time1+=time[1][i].m1;

if(time2

time2=time1;

time2+=time[1][i].m2;

}

printf("%d\n",time2);

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 业的加工顺序可以任意排列,但每个作业必须按照m1加工,再在m2加工的顺序进加工。求完成这n个作业的最短时间。 解题思路: 这是一道经典的流水作业调度问题,可以使用贪心算法来解决。首将所有作业按照bi从小到大排序,然后依次将作业加入流水线中。对于每个作业i,将其加入流水线后,要计算出当前流水线上的作业完成所时间,即当前时间加上m1m2加工时间之和。然后将当前时间更新为该时间,继续加入下一个作业。最终,流水线上所有作业完成的时间即为所求的最短时间。 代码实现: 假设作业加工时间存储在两个组a和b中,长度为n。代码如下: ### 回答2: 流水作业是一种生产计划方式,将生产过程分为多个步骤,每个步骤都可以由不同的机器或工人完成。在流水作业中,每个步骤完成的时间要被精细地计算和分配。对于这个问题,我们可以使用流水线作业调度算法来帮助我们完成这个任务。 在这个问题中,有n个作业要被加工,每个作业要在两台机器m1m2上完成加工。我们可以将这个问题简化为一个流水线作业调度问题。在这个问题中,我们要考虑以下两个因素:时间和资源。 首,我们要明确每个作业m1m2上完成加工要的时间,即ai和bi。使用这个信息,我们可以计算出每个作业要完成的总时间ti=ai+bi。接下来,我们要考虑每个作业可以使用的资源。由于每个作业m1加工,再在m2加工,因此我们要确保m1m2上的资源被充分利用,并且每个作业m1m2上的加工时间不会重叠。 为了处理这个问题,我们可以使用几种算法。其中最常用的是贪心算法。在贪心算法中,我们按照某种顺序对作业排序,然后尽可能完成加工时间短的作业。这样,我们就可以保证每个作业都会在最短的时间内得到处理,并且能够充分利用m1m2上的资源。另外,我们还可以使用动态规划算法和线性规划算法来处理这个问题。在动态规划算法中,我们将问题分解成多个子问题,然后将所有子问题的解组合起来得到最优解。在线性规划算法中,我们使用线性模型和线性规划器来计算最优解。 综上所述,流水线作业调度是一个非常重要的生产计划技术,可以帮助我们合理利用资源,缩短生产时间,提高生产效率。无论是在工业生产还是其他领域,都有广泛的应用。 ### 回答3: 流水作业是指将整个生产过程分成若干个环节,在不同的工作站上进加工,从而提高生产效率。在流水作业中,每个加工环节完成的时间可以不同,可以根据实际情况进调整。 本题中,我们要将n个作业流水线加工完成。每个作业m1加工,然后在m2加工m1m2加工每个作业时间分别为ai和bi,其中1≤i≤n。 假设我们用一个组T来记录在流水线加工n个作业的最短时间,其中T[i]表示前i个作业流水线加工的最短时间。因为每个作业都必须m1加工,再在m2加工,所以T[i] = max(T[i-1]+a[i], T[i-1]+a[i]+b[i]),其中i≥2,T[1]=a[1]+b[1]。 解释一下上述式子的含义:在加工第i个作业时,有两种情况,分别是在m1加工完后直接切换到m2加工下一个作业,或者等待m2空闲后再加工下一个作业。因此 T[i] 的值要取这两种情况中的较大值,即 T[i] = max(T[i-1]+a[i], T[i-1]+a[i]+b[i])。同时,T[1]=a[1]+b[1],因为第一个作业加工完之后要切换到m2加工下一个作业,所以要加上b[1]的时间。 最终,T[n]即为n个作业流水线加工的最短时间,也就是流水作业的完整时间要注意的一点是,上述方法只能求出最短时间,但不能求出具体的加工顺序。若要求出具体的加工顺序,可以使用动态规划或贪心等算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值