主要思想
问题描述:
n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。
目标:确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。
题目类型:动态规划
算法描述:
流水作业调度问题的Johnson算法:
(1) 令 N1={i|ai<bi},N2={i|ai>=bi}
(2)将N1 中作业依t[i,1]的非减序排列;将N2中作业依t[i,2]的非增序排列;
代码
#include
#include<string.h>
#include
#include<stdlib.h>
#define N 100
using namespace std;
struct node {
int time;//执行时间
int index;//作业序号
bool group;//1代表第一个机器,0代表第二个机器
};
bool cmp(node a,node b)
{//升序排序
return a.time<b.time;
}
int main()
{
int i,j,k,n;
int a[N]={0},b[N]={0};
int best[N];//最优调度序列
node c[N];
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
cin>>b[i];
}
for(i=0;i<n;i++) { //n个作业中,每个作业的最小加工时间
c[i].time=a[i]>b[i]?b[i]:a[i];
c[i].index=i;
c[i].group=a[i]<=b[i];
}
sort(c,c+n,cmp);//按照c[]中作业时间增序排序
j=0,k=n-1;
for(i=0;i<n;i++) {
if(c[i].group) { //第一组,从i=0开始放入到best[]中
best[j++]=c[i].index;
}
else {
best[k--]=c[i].index;
}
}
j=a[best[0]];//最优调度序列下的消耗总时间
k=j+b[best[0]];
for(i=1;i<n;i++) {
j+=a[best[i]];
k=j<k?(k+b[best[i]]):j+b[best[i]];//消耗总时间的最大值
}
cout<<k<<endl;
for(i=0;i<n;i++) {
cout<<best[i]+1<<" ";
}
cout<<endl;
return 0;
system("pause");
}
参考链接有:
https://blog.csdn.net/hlk_1135/article/details/53872064
https://blog.csdn.net/qq_40875849/article/details/83053466