问题描述:

N个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。
流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。

算法分析:

M1作业是连续作业的主要是看M2 ,M2要么空闲,要么作业积压。

因此得到一个贪心的性质:让(a,b)中a比较小的尽可能先执行,(a,b)中b比较小的尽可能后执行!

Johnson贪心算法,步骤如下:

(1)将所有作业按M1,M2的时间分为两组,a[i]<=b[i]的为N1,a[i]>=b[i]为N2

(2)N1按a[n]的递增排序,N2的作业按b[n]的递减排序

(3)按顺序先执行N1 ,再执行N2 的作业,得到的就是耗时最少的最优调度。

代码展示:

#include <iostream>
#include <algorithm>//用于下面的排序函数sort()库函数的调用
using namespace std;
class JOB
{
public:
 int key,index;
 bool job;
};
int cmp(JOB a,JOB b)
{
 return a.key<b.key;
}
//算法的最主要的部分
int fun(int n,int a[],int b[],int c[])
{
 int i,j,k;
 JOB *d =new JOB[n];//开辟一个空间大小为n的JOB,即有n个的JOB对象
 for(i=0;i<n;i++)
 {
  if(a[i]<b[i])
   {
    d[i].key = a[i];
    d[i].job = true;
   }
  else
   {
    d[i].key = b[i];
    d[i].job = false;
  }
 d[i].index = i;
 }
sort(d,n+d,cmp);//对n个对象按key的大小进行排序
j=0;
k=n-1;
//下面的for()对上面对key进行排好的序再按job为真的key升排序,job
//为假降序排列,分别将它们的最先排的次序存到c[]数组中。
for(i=0;i<n;i++)
 {
 if(d[i].job == true)c[j++]=d[i].index ;
 else c[k--]=d[i].index ;
 }
j=a[c[0]];
k=j+b[c[0]];
//下面这个for()就是将最短的时间输出
for(i=1;i<n;i++)
{
  j=j+a[c[i]];
  k= j<k ? k+b[c[i]] : j+b[c[i]];
 //前一个作业的时间与前一个作业的第一个时间和第二个作业的时间相
  //比,k为那个较大的
 }
 delete d;
 return k;
}
//如下是主函数主要是用例的输入和函数调用
int main()
{
 int i,m,n,a[100],b[100],c[100];
cin>>m;
while(m--)
{
 cin>>n;
 for(i=0;i<n;i++)cin>>a[i]>>b[i];
 cout<<fun(n,a,b,c)<<endl;
 }
 return 0;
}

流水作业调度 johnson法则相关推荐

  1. 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!

    一:题目 n个作业{1,2,-,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi.流水作业调度 ...

  2. python 流水作业调度_流水作业调度问题

    1.问题描述: n个作业{1,2,-,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi.流水作 ...

  3. 流水作业调度(动态规划)

    题目: n个作业{1,2,-,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi 例如这个例子: ...

  4. LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)

    解析 和国王游戏一样的做法 容易写出cmp函数的依据: min(u.a,v.b)<min(u.b,v.a) 但是这个题的比较函数有一个取min的操作 这个东西会有一个问题:不满足不可比性的传递性 ...

  5. python 流水作业调度,流水作业调度完整代码

    <流水作业调度完整代码>由会员分享,可在线阅读,更多相关<流水作业调度完整代码(3页珍藏版)>请在人人文库网上搜索. 1.流水作业调度.cpp : 定义控制台应用程序的入口点. ...

  6. Johnson法则简要证明

    参考资料: Johnson法则证明 题解 P1248 [加工生产调度] 问题背景 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A A A, B B B 两个车间加工,并且必须 ...

  7. Johnson法则证明

    Johnson法则证明 在这里先不务正业两句,当我和同机房的某位神犇努力钻研证明过程的时候,非常 气愤为什么编书者如此不负责任的只摆几个看不懂的式子,但是当我们抠懂了之后 书上写的真好 不务正业到此结 ...

  8. python【数据结构与算法】流水线作业调度Johnson启发式算法

    import math import cmath import sys import string import heapq import bisect from queue import Queue ...

  9. 基础算法 —— 调度问题 —— 流水调度问题

    [概述] 流水调度问题的表达为:有n 个作业在两台机器 M1.M2 组成的流水线上进行加工,每个作业 i 都必须花费 ai 在 M1 上行加工,然后再花费 bi 在 M2 上加工,确定 n 个作业的加 ...

  10. 分支限界,流水作业问题 批处理作业调度

    为什么80%的码农都做不了架构师?>>>    最优流水调度问题 问题描述: 设有n个作业,每一个作业i均被分解为m项任务: Ti1, Ti2, ┅ , Tim(1≤i≤n,故共有n ...

最新文章

  1. cuda cudnn pytorch版本对应关系
  2. [网络流24题] 最长k可重区间集
  3. C++里如何使用功能键(F1、F2·····)进行操纵?
  4. 认识星座、八大行星的观察
  5. while循环中指针会自动释放吗_C++】C++常见面试题汇总_持续更新中...
  6. 雷神开机logo更改_黑武士再度来袭 雷神第三代911黑武士游戏台式机评测
  7. JAVA day18,19 单列集合Collection:List(ArrayList,LinkedList,Vector)、Queue(Deque)、Set(HashSet,TreeSet),比较器
  8. 紧急!Log4j2 再再爆雷:刚升级,又连爆 “核弹级” 远程数据泄露 ! v2.17.0 横空出世。。。...
  9. 拓端tecdat|在Python中使用LSTM和PyTorch进行时间序列预测
  10. FastReport使用一——简介
  11. 启示录:新加坡纬壹科技城成功建设经验
  12. 网站建设教程:新手如何自己建网站?
  13. 用友u8怎么导出凭证_用友U8V10.1ERP怎么生成期间损益结转凭证的图文操作教程
  14. 2020腾讯广告算法大赛——算法小白的复盘
  15. 《一个广告人的自白》读书笔记
  16. 关于前几天的招聘,我说几点
  17. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇
  18. 多元统计分析笔记二——多元分布
  19. 分享一种高效伪随机数生成算法
  20. Vmware Ubuntu虚拟机磁盘扩容(非常简单)

热门文章

  1. 记录几种敏捷开发应用的工具
  2. 关于坑爹的QQ互联成为开发者的坑
  3. 傅里叶变换概念及公式推导
  4. CRC16-Modbus—MATLAB
  5. html在线生成字体,手写字体在线生成
  6. 反激变压器结构设计学习笔记(进阶)
  7. 使用linux宝塔面板安装 魔方IDC管理系统 免费
  8. Egg.js -- 及案列介绍
  9. Leetcode---1818绝对差值和
  10. 安装MySQL5.5.28步骤