您的位置:首页 > 编程语言 > C语言/C++

动态规划-流水调度的C++实现

2018-10-30 10:50 56 查看

动态规划-流水调度的C++实现

主要思想

问题描述:
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
={0},b
={0};
int best
;//最优调度序列
node c
;
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://www.geek-share.com/detail/2693668364.html
https://blog.csdn.net/qq_40875849/article/details/83053466

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: