动态规划-流水调度的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
相关文章推荐
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 动态规划之 最优流水调度问题
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 矩阵链乘法问题(给A1A2A3...An加括号,使之乘法次数最小)动态规划问题C++实现
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 动态规划之最长公共子序列的求解(C++实现)
- 动态规划案例——装配线调度——java实现
- 矩阵链乘法问题(给A1A2A3...An加括号,使之乘法次数最小)动态规划问题C++实现
- 动态规划之滑雪问题c++实现
- 动态规划之矩阵链乘 C++实现
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 动态规划 + 二分搜索 | 最长递增子序列 | Longest Increasing Subsequence | C/C++实现
- 动态规划 | 最大正方形 | Largest Square | C/C++实现
- C++实现矩阵链乘法利用动态规划及运行实例结果
- C++实现矩阵链乘法利用动态规划及运行实例结果
- 0-1背包问题动态规划代码实现(C++实现)
- 动态规划 | 硬币问题 | Coin Changing Problem | C/C++实现
- 算法:C++实现动态规划中的几个典型问题
- C++实现矩阵链乘法利用动态规划及运行实例结果