0018算法笔记——【动态规划】流水作业调度问题与Johnson法则

article/2025/9/25 20:13:10

     1、问题描述:    

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

     直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。在一般情况下,机器M2上会有机器空闲和作业积压2种情况。设全部作业的集合为N={1,2,…,n}。S是N的作业子集。在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。将这种情况下完成S中作业所需的最短时间记为T(S,t)。流水作业调度问题的最优值为T(N,0)。    

     设π是所给n个流水作业的一个最优调度,它所需的加工时间为 aπ(1)+T’。其中T’是在机器M2的等待时间为bπ(1)时,安排作业π(2),…,π(n)所需的时间。

      记S=N-{π(1)},则有T’=T(S,bπ(1))。

      证明:事实上,由T的定义知T’>=T(S,bπ(1))。若T’>T(S,bπ(1)),设π’是作业集S在机器M2的等待时间为bπ(1)情况下的一个最优调度。则π(1)π'(2),…,π'(n)是N的一个调度,且该调度所需的时间为aπ(1)+T(S,bπ(1))<aπ(1)+T’。这与π是N的最优调度矛盾。故T’<=T(S,bπ(1))。从而T’=T(S,bπ(1))。这就证明了流水作业调度问题具有最优子结构的性质。

     由流水作业调度问题的最优子结构性质可知:

    

     从公式(1)可以看出,该问题类似一个排列问题,求N个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。将问题规模缩小。公式(2)说明一般情况下,对作业集S进行调度,在M2机器上的等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t-ai,0}。

     3、动态规划法求解思路

     假设有一组作业需要在M1和M2 两台机器上进行流水作业,他们在M1和M2上的作业时间如下表:

     问题是如何安排他们的加工顺序,使得,到最后一个作业在机器M2上加工完成所需要的时间最少。也就是所有作业在两台机器全部加工完成所需的时间最少。
     思路如下:考虑如果只有一个作业的情况,肯定所需时间就是它自身需要在M1和M2 上的加工时间总和;如果有两个作业就要考虑在两种不同的加工顺序下选取最优的一种作为候选,三个作业的时会出现三种组合情况(0,(1,2)); (1,(0,2)); (2,(0,1)),拿第一种为例,它表示先加工作业0,然后再按照作业1和作业2的优化顺序加工;将三种的作业时间计算出来,取最小值,即为三个作业的优化结果,同理可对更多的作业进行排序优化。具体做法是,用类似矩阵连乘的办法,自底向上将所有能的情况计算出来,并产生一个表,供后面的计算查用,减少重复计算的工作量。

     对于j1 作业M2 的等待时间为b0,实际上在M2加工j0作业的同时,M1 并行加工j1,实际它需要等待b1-a0时间。

      2+4+(5-4)+2=9

     J0J1两个作业的加工顺序,可以看出,先加工J0J1,所用时间最短为9,将其填入表中,依此类推,即可得出最优解。

     a4+a0+a2+a1+a3+[(b4+b0+b1+b2)-(a0+a1+a2+a3)]+b3

     =1+2+3+4+6+[(7+5+2+3)-(2+4+3+6)]+1

     =16+[17-15]+1=19

     选其中加工时间短的作为候选方案;在具体计算时非最优子集不必考虑,这样可以减少计算次数。

     4、流水作业调度的Johnson法则

     设是作业集S在机器M2的等待时间为t时的任一最优调度。若在这个调度中,安排在最前面的两个作业分别是i 和j ,即π(1)=I,π(2)=j。则有动态规划递归式可得

     其中


     如果作业i和j满足min{bi,aj} ≥min{bj,ai},则称作业i和j满足Johnson不等式。如果作业i和j 不满足Johnson不等式,则交换作业i和j满足Johnson不等式。

     证明 :在作业集S中,对于机器M2 的等待时间为t的调度π,交换作业i和j 的加工顺序,得到作业集S 的另一个调度π’,它所需的加工时间为


     当作业i和j 满足Johnson 不等式 min{bi,aj} ≥min{bj,ai}时,有

从而


由此可得


因此,对任意t 有

从而,tij≤tji,由此可见,换句话说,当作业i 和j不满足Johnson 不等式时,交换它们的加工顺序后,作业i和j满足Johnson 不等式,且不增加加工时间。由此可知,对于流水作业调度问题,必存在最优调度π,使得作业π(i)和π(i+1)满足Johnson 不等式:


这样的调度π称为满足Johnson 法则的调度。进一步还可以证明,调度满足Johnson 法则当且仅当对任意i<j 有:


     由此可知,任意两个满足Johnson 法则的调度具有相同的加工时间,从而所有满足Johnson 法则的调度均为最优调度。

    5、流水作业调度问题Johnson算法

    从上面的分析可知,流水作业调度问题一定存在满足Johnson法则的最优调度,且容易由下面的算法确定:

    流水作业调度问题的Johnson算法:

    (1)令N1={i|ai<bi},N2={i|ai>=bi};

    (2)将N1中作业按ai的非减序排序;将N2中作业按bi的非增序排序;

    (3)N1中作业接N2中作业构成满足Johnson法则的最优调度。   

    Johnson算法中分类及排序的作用(验证不等式)设数组c[]为排序后的作业排列,排序结果如下:

 

     红线左侧满足 a[c[i]]<=b[c[i]] 和 a[c[i]]<=a[c[i+1]] 符合johnson 不等式,min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序最优;
     红线右侧满足 b[c[i]]<=a[c[i]] 和 b[c[i]]>=b[c[i+1]] 符合johnson 不等式,min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序最优;

     中间过渡部分横向比较,左侧a[c[i]]< b[c[i]] 右侧b[c[i+1]]<=a[c[i+1] ]满足min(b[c[i]],a[c[i+1]])>=min(b[c[i+1]],a[c[i]])其调度顺序也最优;

     程序具体代码如下:

//3d9 动态规划 流水作业调度问题
#include "stdafx.h"
#include <iostream> 
using namespace std; const int N = 5;class Jobtype
{public:int operator <=(Jobtype a) const{return(key<=a.key);}int key,index;bool job;
};int FlowShop(int n,int a[],int b[],int c[]);
void BubbleSort(Jobtype *d,int n);//本例采用冒泡排序int main()
{int a[] = {2,4,3,6,1};int b[] = {5,2,3,1,7};int c[N];int minTime =  FlowShop(N,a,b,c);cout<<"作业在机器1上的运行时间为:"<<endl;for(int i=0; i<N; i++){cout<<a[i]<<" ";}cout<<endl;cout<<"作业在机器2上的运行时间为:"<<endl;for(int i=0; i<N; i++){cout<<b[i]<<" ";}cout<<endl;cout<<"完成作业的最短时间为:"<<minTime<<endl;cout<<"编号从0开始,作业调度的顺序为:"<<endl;for(int i=0; i<N; i++){cout<<c[i]<<" ";}cout<<endl;return 0;
}int FlowShop(int n,int a[],int b[],int c[])
{Jobtype *d = new Jobtype[n];for(int i=0; i<n; i++){d[i].key = a[i]>b[i]?b[i]:a[i];//按Johnson法则分别取对应的b[i]或a[i]值作为关键字d[i].job = a[i]<=b[i];//给符合条件a[i]<b[i]的放入到N1子集标记为trued[i].index = i;}BubbleSort(d,n);//对数组d按关键字升序进行排序int j = 0,k = n-1;for(int i=0; i<n; i++){if(d[i].job){c[j++] = d[i].index;//将排过序的数组d,取其中作业序号属于N1的从前面进入}else{c[k--] = d[i].index;//属于N2的从后面进入,从而实现N1的非减序排序,N2的非增序排序}}j = a[c[0]];k = j+b[c[0]];for(int i=1; i<n; i++){j += a[c[i]];//M1在执行c[i]作业的同时,M2在执行c[i-1]号作业,最短执行时间取决于M1与M2谁后执行完k = j<k?k+b[c[i]]:j+b[c[i]];//计算最优加工时间}delete d;return k;
}//冒泡排序
void BubbleSort(Jobtype *d,int n)
{int i,j,flag; Jobtype temp;for(i=0;i<n;i++){  flag = 0;  for(j=n-1;j>i;j--){  //如果前一个数大于后一个数,则交换  if(d[j]<=d[j-1]){  temp = d[j];  d[j] = d[j-1];  d[j-1] = temp;  flag = 1;  }  }  //如果本次排序没有进行一次交换,则break,减少了执行之间。  if(flag == 0){  break;  }  }
}

运行结果如下:


http://chatgpt.dhexx.cn/article/YyFXmLlg.shtml

相关文章

转:johnson算法的现实意义

Johnson算法是一种用于解决边数与节点数之间关系为O(n^2)的带权图的最短路径问题的算法。它是一种结合了Dijkstra算法和Bellman-Ford算法的技术&#xff0c;通过使用一个负权重的环检测器来消除负权重的影响。这种算法的时间复杂度为O(n^2m log n)。 Johnson算法是一种用于解决…

软件定义网络SDN基础实验:MiniNet常用命令、创建网络拓扑、OpenFlow流表操作

此实验基于《软件定义网络实验1-5》&#xff0c;主要内容为&#xff1a; MiniNet常用命令如何创建网络拓扑OpenFlow流表操作 00x1 搭建SDN环境 SDN 环境配置&#xff1a;Mininet Ryu 1. 测试环境是否搭建成功 启动Ryu&#xff0c;进入 /ryu/app&#xff0c;启动一个交换机…

软件定义网络基础(SDN②)

一.传统网络设备 1.传统设备控制平面和数据平面 2.数据平面的任务 在传统网络中&#xff0c;数据平面是指实际传输和处理数据的部分。它包括网络设备&#xff08;如交换机和路由器&#xff09;&#xff0c;它们通过将数据包从一个接口转发到另一个接口来实现数据传输。数据平面…

软件定义网络SDN

一、为什么使用软件定义网络 传统网络及其设备只可配置&#xff0c;不可编程。网络的分布式控制与管理架构带来的制约&#xff0c;网络的部署、配置与管理需要落到每台设备上去手工完成&#xff0c;每个设备下都紧耦合了三个平面&#xff08;管理平面、控制平面、数据平面&…

软件定义网络技术现状分析

作者&#xff1a;郭春梅&#xff0c;启明星辰资深研究员&#xff0c;研究方向为云计算、虚拟化、SDN技术及安全 转载自&#xff1a;https://mp.weixin.qq.com/s?__bizMzAxNzExNjQ5NA&mid211287920&idx1&snd49893e9187e6055e79db8bb37e44408&scene1&fromg…

SDN软件定义网络相关概念

总结 软件定义网络&#xff0c;已经逐渐成为云计算所依赖的重要技术支一&#xff0c;软件定义网络作为一种新型的网络架构&#xff0c;把网络控制平面和数据平面进行分离&#xff0c;其中控制平面拥有网络全局视图&#xff0c;集中控制网络资源&#xff0c;数据平面只转发数据…

软件定义网络基础(SDN④)

一&#xff1a;SDN控制平面 一个或多个SDN控制器组成&#xff0c;是网络的大脑。 对底层网络交换设备进行集中管理&#xff0c;状态监测、转发决策以及处理和调 度数据平面的流量&#xff1b;通过北向接口向上层应用开放多个层次的可编程能力。 1.典型的SDN控制器体系架构 SDN控…

软件定义网络(SDN)工作原理

传统网络分布式控制架构: 管理平面: 管理设备&#xff08;SNMP&#xff09; 主要包括设备管理系统和业务管理系统&#xff0c;设备管理系统负责网络拓扑、设备接口、设备特性的管理&#xff0c;同时可以给设备下发配置脚本。业务管理系统用于对业务进行管理&#xff0c;比如业务…

认识软件定义网络(SDN)(一)

一、SDN体系结构简介 在传统IP网络中&#xff0c;网络设备内部同时集成了控制逻辑和数据逻辑&#xff0c;控制平面需要实现各种类型的网络协议和功能&#xff0c;为数据平面构造和配置路由转发表&#xff0c;而数据平面则根据路由转发表实现数据包的转发。一般来说&#xff0c…

SDN(Software Defined Network) 软件定义网络学习

SDN&#xff08;Software Defined Network&#xff09; 软件定义网络学习 SDN是啥&#xff1f; 简单来说就是软件定义网络&#xff01;其旨在对现有的网络架构进行重构&#xff0c;使得我们能够像安装软件一样对网络进行修改&#xff0c;加快部署&#xff0c;提高网络可编程能…

软件定义网络 Software Defined Network (一)概述

软件定义网络 Software Defined Network 本文将从以下3个问题对SDN进行阐述 1、为什么要有SDN&#xff1f; 伴随云计算、移动互联网和物联网的蓬勃兴起&#xff0c;应用与业务日益多元&#xff0c;而且快速且多变。网络系统的亚健康问题逐渐明显起来。传统网络工程的弊端日益…

浅谈软件定义网络(SDN)技术研究现状和发展趋势

浅谈软件定义网络(SDN)技术研究现状和发展趋势 友情全文PDF链接&#xff1a;浅谈软件定义网络(SDN)技术研究现状和发展趋势.pdf-网络基础文档类资源-CSDN下载 长久以来&#xff0c;硬件在网络世界中保持着至高无上的地位。直到2008年斯坦福大学的学者提出 OpenFlow[1]&#xf…

软件定义的网络(中)

SDN的出现打破了传统网络设备制造商独立而封闭的控制面结构体系&#xff0c;将改变网络设备形态和网络运营商的工作模式&#xff0c;对网络的应用和发展将产生直接影响。 从技术层面和应用层面来看&#xff0c;SDN的特点主要体现在以下几个方面&#xff1a; 数据平面与控制平…

软件定义网络(PART 3)

软件定义网络PART 3 数据平面SDN数据平面传统网络数据平面传统网络数据平面的特点SDN数据平面SDN数据平面的特点OpenFlow Switch通用转发模型通用可编程转发模型 OpenFlow 概述OpenFlow架构三个组成部分OpenFlow主要版本及特性单流表到多级流表的架构 Open Flow 流表什么是流表…

软件定义网络SDN----新型网络体系结构

1.传统路由器 传统路由器的功能&#xff1a; 为主机间的通信提供转发服务路由选择 路由器之间的传送信息&#xff1a; 主机间的分组路由信息 SDN这种新型网络体系结构的核心思想&#xff1a;把网络的控制层面和数据层面分离&#xff0c;而让控制层面利用软件来控制数据层面…

软件定义网络SDN(计算机网络-网络层)

目录 软件定义网络SDN 数据平面和控制平面 SDN 最重要的三个特征 控制平面与数据平面分离 SDN 的数据平面 软件定义网络SDN SDN的本质特点是控制平面和数据平面的分离以及网络的可编程性&#xff0c;从而实现了网络流量的灵活控制&#xff0c;方便用户管理和配置网络以及部…

软件定义的网络(下)

我们在这里对这两种SDN实现方案分别做个简单描述。 &#xff08;1&#xff09;以网络为中心的SDN 以网络为中心的SDN的技术核心是OpenFlow协议&#xff0c;OpenFlow技术最早由斯坦福大学于2008年提出&#xff0c;它是一种通信协议&#xff0c;用来提供对网络设备诸如交换机和…

【计算机网络详解】——软件定义网络SDN(学习笔记)

目录 &#x1f552; 1. 概念&#x1f552; 2. OpenFlow 协议 &#x1f552; 1. 概念 软件定义网络&#xff08;Software Defined Network&#xff0c;SDN&#xff09;的概念最早由斯坦福大学的Nick McKeown教授于2009年提出。SDN最初只是学术界讨论的一种新型网络体系结构。SD…

软件定义的网络(上)

数据中心作为IT资源的集中地&#xff0c;是数据计算、网络传输、存储的中心&#xff0c;为企业和用户的业务需求提供IT支持。 网络作为提供数据交换的模块&#xff0c;是数据中心中最为核心的基础设施之一&#xff0c;并直接关系到数据中心的性能、规模、可扩展性和管理性。随着…