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

动态规划-流水调度的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[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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值