概述

流水作业是并行处理技术领域的一项关键技术,它是以专业化为基础,将不同处理对象的同一施工工序交给专业处理部件执行,各处理部件在统一计划安排下,依次在各个作业面上完成指定的操作。
流水作业调度问题是一个非常重要的问题,其直接关系到计算机处理器的工作效率。然而由于牵扯到数据相关、资源相关、控制相关等许多问题,最优流水作业调度问题处理起来非常复杂。已经证明,当机器数(或称工序数)大于等于3时, 流水作业调度问题是一个NP-hard问题(e.g分布式任务调度)。粗糙地说,即该问题至少在目前基本上没有可能找到多项式时间的算法。只有当机器数为2时,该问题可有多项式时间的算法(机器数为1时该问题是平凡的)。

我们先给出流水作业调度的定义:

设有nnn个作业,每一个作业iii均被分解为mmm项任务: Ti1,Ti2,…,Tim\mathrm{T}_{\mathrm{i} 1}, \mathrm{T}_{\mathrm{i} 2}, \ldots, \mathrm{T}_{\mathrm{im}}Ti1​,Ti2​,…,Tim​(1≤i≤n1 \leq i \leq n1≤i≤n,故共有m∗nm * nm∗n个任务), 要把这些任务安排到m台机器上进行加工。 如果任务的安排满足下列3个条件, 则称该安排为流水作业调度:

  1. 每个作业 i 的第 j 项任务Tij (1⩽i⩽n,1⩽j⩽m)(1 \leqslant \mathrm{i} \leqslant \mathrm{n}, 1 \leqslant \mathrm{j} \leqslant \mathrm{m})(1⩽i⩽n,1⩽j⩽m) 只能安排在机器 Pj\mathrm{P}_{\mathrm{j}}Pj​ 上进行加工
  2. 作业 i 的第 j 项任务 Tij(1≤i≤n,2≤j≤m)\mathrm{T}_{\mathrm{ij}}(1 \leq \mathrm{i} \leq \mathrm{n}, 2 \leq \mathrm{j} \leq \mathrm{m})Tij​(1≤i≤n,2≤j≤m) 的开始加工时间均安排在第 j−1\mathrm{j}-1j−1 项任务Tij−1\mathrm{T}_{\mathrm{ij}-1}Tij−1​ 加工完毕之后,任何一个作业的任务必须依次完成,前一项任务完成之后才能开 始着手下一项任务:
  3. 任何一台机器在任何一个时刻最多只能承担一项任务。

最优流水作业调度是指:

设任务τij\tau_{i j}τij​在机器PjP_{j}Pj​上进行加工需要的时间为tijt_{i j}tij​。 如果所有的tij(1⩽i⩽n,1⩽j⩽m)\mathrm{t}_{\mathrm{ij}}(1 \leqslant \mathrm{i} \leqslant \mathrm{n}, 1 \leqslant \mathrm{j} \leqslant \mathrm{m})tij​(1⩽i⩽n,1⩽j⩽m)均已给出, 要找出一种安排任务的方法, 使得完成这 nnn个作业的加工时间为最少。 这个安排称之为最优流水作业调度。

前面已经说过,当m≥3\mathrm{m} \geq 3m≥3时该问题是NP问题,这里我们只给出m=2m = 2m=2时时间复杂度在多项式以内的Johnson算法。

求解流水作业调度问题的Johnson算法具体描述如下:

1、设 a[i]和 b[i] (0≤i<n)(0 \leq i<n)(0≤i<n)分别为作业 i 在两台设备上的处理时间。建立由三元组 (作业
号,处理时间,设备号)组成的三元组表 d。其中,处理时间是指每个作业所包含的两 个任务中时间较少的处理时间。

设 n=4,(a0,a1,a2,a3)=(3,4,8,10)和 (b0,b1,b2,b3)=(6,2,9,15)的作业 0的三元组为 (0,3,0),作业 1的三元组为 (1,2,1)。  如图 (a)所示。 \begin{array}{l} \text { 设 } \mathrm{n}=4,\left(\mathrm{a}_{0}, \mathrm{a}_{1}, \mathrm{a}_{2}, \mathrm{a}_{3}\right)=(3,4,8,10) \text { 和 }\left(\mathrm{b}_{0}, \mathrm{b}_{1}, \mathrm{b}_{2}, \mathrm{b}_{3}\right)=(6,2,9,15) \text { 的作业 } 0 \text { 的三元组为 } \\ (0,3,0), \text { 作业 } 1 \text { 的三元组为 }(1,2,1) \text { 。 } \text { 如图 }(\mathrm{a}) \text { 所示。 } \end{array} 设 n=4,(a0​,a1​,a2​,a3​)=(3,4,8,10) 和 (b0​,b1​,b2​,b3​)=(6,2,9,15) 的作业 0 的三元组为 (0,3,0), 作业 1 的三元组为 (1,2,1) 。  如图 (a) 所示。 ​

(a)三元组表
作业号 处理时间 设备号 0301212803100\begin{array}{|c|c|c|} \hline \text { 作业号 } & \text { 处理时间 } & \text { 设备号 } \\ \hline 0 & 3 & 0 \\ \hline 1 & 2 & 1 \\ \hline 2 & 8 & 0 \\ \hline 3 & 10 & 0 \\ \hline \end{array} 作业号 0123​ 处理时间 32810​ 设备号 0100​​

2、对三元组表按处理时间排序,得到排序后的三元组表 d。如图(b)所示。

(b)按处理时间排序
作业号 处理时间 设备号 1210302803100\begin{array}{|c|c|c|} \hline \text { 作业号 } & \text { 处理时间 } & \text { 设备号 } \\ \hline 1 & 2 & 1 \\ \hline 0 & 3 & 0 \\ \hline 2 & 8 & 0 \\ \hline 3 & 10 & 0 \\ \hline \end{array} 作业号 1023​ 处理时间 23810​ 设备号 1000​​

3、对三元组表的每一项 d[i](0≤i<n),\mathrm{d}[\mathrm{i}](0 \leq \mathrm{i}<n),d[i](0≤i<n), 从左右两端生成最优作业排列 c[j](0≤j<n),c[j]\mathrm{c}[\mathrm{j}](0 \leq \mathrm{j}<n), \mathrm{c}[\mathrm{j}]c[j](0≤j<n),c[j]是作业号。如果 d[i]设备号为 1,则将作业 i 置于 c 的左端末尾,否则置于 c 的右端 末尾。如图©所示,由两端向中间存放。

(c)最优作业排列
(0,2,3,1)

(d)最优调度方案

p138104p269152\begin{array}{|l|l|l|l|l|} \hline \mathrm{p} 1 & 3 & 8 & 10 & 4 \\ \hline \mathrm{p} 2 & 6 & 9 & 15 & 2 \\ \hline \end{array}p1p2​36​89​1015​42​​

例题:

下面是北大PKU POJ 第2751题Saving Endeavour

有2台机器,n件任务,必须先在S1上做,再在S2上做。任务之间先做后做任意。求最早的完工时间。

双机调度问题Johnson算法简析:
(1)把作业按工序加工时间分成两个子集,第一个集合中在S1上做的时间比在S2上少,其它的作业放到第二个集合。先完成第一个集合里面的作业,再完成第二个集合里的作业。

(2)对于第一个集合,其中的作业顺序是按在S1上的时间的不减排列;对于第二个集合,其中的作业顺序是按在S2上的时间的不增排列。

Johnson算法的时间取决于对作业集合的排序,因此,在最怀情况下算法的时间复杂度为0(nlogn )0(\text { nlogn })0( nlogn ),所需的空间复杂度为0(n )0(\text { n })0( n )。

c语言代码如下:

#include <stdio.h>
#include <memory.h>
#include <algorithm>
using namespace std;const int MAXN=10005;struct TNode
{int s1,s2;
}ws[MAXN];int topf,tops;
int n;bool operator<(TNode x,TNode y)
{if (x.s1<x.s2&&y.s1>=y.s2) return true;if (x.s1<x.s2&&y.s1<y.s2) return x.s1<y.s1;if (x.s1>=x.s2&&y.s1>=y.s2) return x.s2>y.s2;return false;
}int max(int x,int y)
{return x>y?x:y;
}void Work()
{sort(ws,ws+n);int i,t1=0,t2=0;for (i=0;i<n;i++){t1+=ws.s1;t2=max(t1,t2)+ws.s2;}printf("%dn",t2);
}void Read()
{int i;while (scanf("%d",&n)&&n){for (i=0;i<n;i++)scanf("%d%d",&ws.s1,&ws.s2);Work();}
}int main()
{Read();return 1;
}

双机流水作业调度问题——Johnson算法相关推荐

  1. 加工生产调度(Johnson算法 双机流水作业调度问题)

    加工生产调度 题目描述: 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工. 某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n ...

  2. poj 2751 双机调度问题Johnson算法(贪心)

    题意: 2台机器,n件任务,每件任务必须先在S1上做,再在S2上做.任务之间先做后做任意.求最早的完工时间. 分析: 这是一个经典问题:2台机器的情况下有多项式算法(Johnson算法),3台或以上的 ...

  3. 【算法设计与分析】流水作业调度问题 动态规划算法与代码实现 超详细

    题目描述 "加工顺序问题"又被称为"批处理作业调度问题". 设有n个工件需要在机器M1和M2上加工,每个工件的加工顺序都是先在M1上加工,然后在M2上加工.t1 ...

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

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

  5. 贪心算法训练(七)——加工生产调度(流水作业调度问题)

    贪心算法训练(七)--加工生产调度(流水作业调度问题) 1. 问题描述 某工厂收到了 n 个产品的订单,这 n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以送到 B 车间.某 ...

  6. 【算法】优先队列的分枝限界算法的流水作业调度问题(C++源码)

    [算法]优先队列的分枝限界算法的流水作业调度问题(C++源码) 一.任务描述 二.步骤描述 三.运行结果截图 四.源代码(C++) 一.任务描述 有一个流水作业调度问题,n=4,a[]={5,10,9 ...

  7. 动态规划作业排程java_动态规划之流水线作业(Johnson算法)

    该题题目为: 设有n个作业要在2台机器M1和M2 组成的流水线上完成加工.每个作业加工的顺序都是现在M1 上加工,然后在M2 上加工,所需时间分别为ai和bi.流水作业调度问题要求求加工完这些作业所需 ...

  8. 算法导论——所有点对最短路径:稀疏图Johnson算法

    2019独角兽企业重金招聘Python工程师标准>>> package org.loda.graph;import org.loda.structure.Stack; import ...

  9. 所有结点对的最短路径问题之Johnson算法

    Johnson算法可以在O(V*V lgV + VE)的时间内找到所有节点对之间的最短路径,对于稀疏图来说,算法的渐进表现要由于重复平方法和FloydWarshall算法,如果图没有权值为负值的环路, ...

  10. 稀疏图Johnson算法

    在前面的文章<所有节点对的最短路径问题>中,我们介绍了用于稀疏图的Johnson算法,由于代码比较长,我们将其单独放在一篇文章之中. Johnson算法的时间复杂度在使用二叉堆作为最小优先 ...

最新文章

  1. 拥有「人类智能」的全球首款有「思想」的机器人,活细胞培养的神经元
  2. turtle文库 ——python
  3. python2基础教程廖雪峰云-Python基础
  4. 如何删除Safari浏览器的扩展程序 大神教你搞定
  5. 12 Useful Tips for Machine Learning (转载)
  6. matlab3dimshow_matlab利用MATLAB嵌套函数表示3D作图
  7. 使用Nexus搭建私有Nuget仓库
  8. processing创意图形代码_2020年外贸B2C店铺的黑色星期五创意营销想法(下)
  9. 【操作系统】 第二章 进程的描述与控制
  10. javascript性能
  11. windows安装解压版mysql
  12. AcWing 859. Kruskal算法求最小生成树(稀疏图)
  13. 同步图计算:GraphLite的安装和使用
  14. 匿名mahony互补滤波代码详解
  15. 全球票房73亿的《海王》,是怎么炼成的!
  16. php 悬浮按钮,Android_Android利用悬浮按钮实现翻页效果,今天给大家分享下自己用悬浮 - phpStudy...
  17. WINCC软件与西门子PLC以太网通讯
  18. Windows版本下安装使用Grafana教程
  19. DynamicBone 飘带飘动风吹动效果
  20. 搭建web服务器访问网页

热门文章

  1. 双线性映射(密码学常用算法)
  2. 模式识别与智能系统类毕业论文文献都有哪些?
  3. log4j配置文件位置详解
  4. 互联网+创新创业大赛项目计划书,个人原创你学会了吗?
  5. zynq操作系统: Linux驱动开发串口篇
  6. 如何在InfoPath2010中转换主数据源
  7. 视频教程-汇编语言程序设计VII-其他
  8. 模拟电子技术基础笔记(2)——半导体基础知识
  9. 图论及其应用(基础知识)(1)(数学建模基础速成)
  10. 软件工程导论复习之总体设计