最优流水作业调度问题

摘要

本文给出了双机流水作业调度的Johnson算法,并结合POJ上的一道题目详述了该算法的具体编程实现和应用。

关键词: 双机流水作业调度 Johnson算法

正文

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

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

设有 n 个作业,每一个作业 i 均被分解为 m 项任务: Ti1,Ti2,… ,Tim(1≤i≤n,故共有n×m个任务), 要把这些任务安排到m台机器上进行加工。 如果任务的安排满足下列3个条件, 则称该安排为流水作业调度:

1. 每个作业 i 的第 j 项任务Tij (1≤i≤n,1≤j≤m) 只能安排在机器Pj上进行加工; 2. 作业 i 的第 j 项任务Tij(1≤i≤n,2≤j≤m)的开始加工时间均安排在第j−1项任务

Ti,j−1加工完毕之后,任何一个作业的任务必须依次完成,前一项任务完成之后才能开始着手下一项任务;

3. 任何一台机器在任何一个时刻最多只能承担一项任务。 最优流水作业调度是指:

设任务Tij在机器Pj上进行加工需要的时间为tij。 如果所有的tij (1≤i≤n,1≤j≤m)均已给出, 要找出一种安排任务的方法, 使得完成这 n 个作业的加工时间为最少。 这个安排称之为最优流水作业调度。

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

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

1) 设a[i]和b i (0≤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)所示。

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

3) 对三元组表的每一项d[i](0≤i

是作业号。如果d[i]设备号为1,则将作业 i 置于 c 的左端末尾,否则置于 c 的右端末尾。如图(c)所示,由两端向中间存放。 a) 三元组表

b) 按处理时间排序

c) 最优作业排列 (0,2,3,1) d) 最优调度方案

该算法是如此经典以至于ACM界已经有该算法的题目,下面是北大PKU POJ 第2751题Saving Endeavour(我校的BOJ上也有,不过是从POJ上照搬过来的):

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

双机调度问题Johnson算法简析:

1) 把作业按工序加工时间分成两个子集,第一个集合中在S1上做的时间比在S2上少,其

它的作业放到第二个集合。先完成第一个集合里面的作业,再完成第二个集合里的作业。 2) 对于第一个集合,其中的作业顺序是按在S1上的时间的不减排列;对于第二个集合,

其中的作业顺序是按在S2上的时间的不增排列。

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

c语言代码如下: #include #include #include using namespace std;

const int MAXN=10005;

struct TNode {

int s1,s2; }ws[MAXN];

int topf,tops; int n;

bool operator

if (x.s1=y.s2) return true; 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

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

scanf("%d%d",&ws.s1,&ws.s2); Work(); } }

int main() {

Read(); return 1; }

c语言流水调度作业,最优流水作业调度问题:流水作业调度问题相关推荐

  1. c语言流水调度作业,最简C语言流水灯程序,给初学者看下,高手请绕行。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 你好!请教一个问题. 在下面的程序中,while(1)这个循环,注释掉和没注释掉板子上的led的动作是一样的.请问一下会是哪里出问题呢? #include ...

  2. 第四课 实战go语言改造php仿优酷-Redis改造优化接口

    第四课 实战go语言改造php仿优酷-Redis改造优化接口 tags: Beego 慕课网 categories: redis 文章目录 第四课 实战go语言改造php仿优酷-Redis改造优化接口 ...

  3. 第五课 实战go语言改造php仿优酷-RabbitMQ改造项目

    第五课 实战go语言改造php仿优酷-RabbitMQ改造项目 tags: Beego 慕课网 categories: RabbitMQ 五种工作模式 文章目录 第五课 实战go语言改造php仿优酷- ...

  4. JAVA语言与C++相比优劣势分析

    JAVA语言与C++相比优劣势分析 对于JAVA语言以及C++的定义我们在这里不再叙述,接下来我们直接分析 JAVA和C++相比其中的优劣势: 优势: 1.Java比C,C++简单,学起来比C\C++ ...

  5. 华为js面试题_华为C语言面试题最优思路及答案分享

    原标题:华为C语言面试题最优思路及答案分享 华为校招15道C语言面试题分享 用预处理指令#define 声明一个常数, 用以表明1年中有多少秒 (忽略闰年问题) 一 题 #defineSECONDS_ ...

  6. c语言流水灯程序 16,16个发光二极管流水灯程序

    文件: 流水灯16.rar 大小: 32KB 下载:16个发光二极管流水灯程序 作者:流水落花 ORG 0100H LOOP0: MOV A, #0FEH MOV P2, #0FEH MOV R2, ...

  7. 用keil编写C语言流水灯程序,简述关于Keil、STM32 用C++编写流水灯程序

    通常来说,在单片机上编程,要么汇编,要么C语言,而用C++++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil.STM32,用C++编写流水灯程序的一些内容 ...

  8. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解

    用C语言编写的单片机流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. ? 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组 ...

  9. c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...

    基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...

  10. java、.net、php等语言开发商城系统优劣势

    在电商飞速发展的今天,主流的网上商城系统开发语言包括:java..net.php.jsp三种,详细如下: java开发语言 java程序语言是一种通用性很强的技术语言,拥有高度的专业性.高效性.安全性 ...

最新文章

  1. java中如何把时间封装成类,java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象?...
  2. ansible之playbook
  3. cocos2d-x中的curl
  4. 代码雨代码源复制_超火!黑客帝国代码雨
  5. 网页优化中,网站页面结构该注意什么?
  6. lmdb简介——结合MVCC的B+树嵌入式数据库
  7. SearchScore
  8. 2015 提高组 跳石头--二分答案
  9. LNMP一键安装包在安装完成后的一些安全设置
  10. 网站禁止复制类型的属性
  11. 3d max插件的基本知识和安装方法
  12. win8 性能测试软件,win8系统优化软件评测
  13. 重启打印机(打印机任务无法取消时)
  14. 开发小游戏之(案例——装备选择)
  15. 84 岁 iOS 女程序员,不得不服!
  16. 棋牌游戏软件选哪家?诺博富棋牌游戏厅
  17. nisp学习-1.1信息安全与网络空间安全
  18. Redis配置文件redis.conf内容完整版
  19. 仅仅有人物没背景的图片怎么弄_纯干货//只会画人物不会画背景?这3种方法教你快速画背景!...
  20. 【汇编与接口】ADA转换器

热门文章

  1. 【06】上海各个区的经纬度
  2. vivo x9s支持html,vivo X9s屏幕材质_vivo X9s屏幕分辨率-太平洋IT百科
  3. IOS平台开发实战培训
  4. mysql 如何对集合进行遍历
  5. swift 打开第三方应用_Swift常用第三方
  6. Android的SharedPreferences和SQLite
  7. 数字油画的起源与绘制过程
  8. @所有人 尊贵的所有微信用户,现邀您开通VIP会员等级功能!
  9. Datax下载、安装、定时同步配置
  10. Qt 串口调试软件自动发送数据