流水线作业调度问题-动态规划(运用Johnson算法)

article/2025/9/25 18:50:24

问题描述

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

要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。


问题分析

  • 直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。

  • 在一般情况下,机器M2上会有机器空闲作业积压两种情况
    在这里插入图片描述

  • 设全部作业的集合为N={1,2,…,n}。S ⊆ \subseteq N是N的作业子集。

  • 通常,机器M1开始加工S中作业时,机器M2还在加工其它作业,要等时间t后才可利用

  • 将这种情况下完成S中作业所需的最短时间记为T(S, t)

  • 流水作业调度问题的最优值为T(N, 0)


最优子结构性质

 最优子结构性质:问题最优解,是否包含了子问题的最优解。

 调度问题最优子结构性质:设π是所给n个流水作业(N={1,2,…,n})的一个最优调度,最优调度序列是π(1) ,π(2), π(3),…,π(n) ,π是否是调度π(2), π(3),…, π(n)的一个最优调度?若是,最优子结构性质成立。证明如下:
在这里插入图片描述

  1. 把π调度n个作业所需的加工时间分成两部分: a π ( 1 ) a_{π(1)} aπ(1)(1) 和T’。 其中,T’是机器M1和M2加工作业{π(2),…,π(n)}所需的时间。因此,π调度n个流水作业需要的总时间为 a π ( 1 ) a_{π(1)} aπ(1)(1) 和T’
  2. 令作业子集S=N - {π(1)} ,即:S={π(2), π(3),…,π(n)}。
  3. 假设π不是实现加工作业子集S所需时间最短(最优)的调度,设π’是M1和M2加工作业子集S所需时间最短的一个最优调度, 则按π’加工作业子集S的最短时间为 T(S, b π ( 1 ) b_{π(1)} bπ(1) )

在这里插入图片描述

  1. 因此π(1), π’(2),…, π’(n)是完成N ={1,2,…,n}作业 的一个调度,且该调度完成n个作业所需的时间 aπ(1)+T(S,bπ(1))
  2. 由于 π’是加工π(2),…,π(n)的最优调度,则T(S,bπ(1))是最短 时间,则T(S, b π ( 1 ) b_{π(1)} bπ(1))≤ T’,因此, a π ( 1 ) a_{π(1)} aπ(1)+T(S, b π ( 1 ) b_{π(1)} bπ(1)) ≤ a π ( 1 ) a_{π(1)} aπ(1)+T’.
  3. 由此,按照π(1), π’(2),…, π’(n)调度顺序完成n个作业所需的时间,小于按照π(1), π(2) ,…, π(n) 调度完成n个作业所需时间aπ(1)+T’,这与π是N的最优调度矛盾
  4. 因此,π’是完成π(2),…,π(n)的最优调度假设不成立,因此,π是完成π(2),…,π(n)作业的最优调度。即:作业调度问题最优子结构性质成立。

递归计算最优值

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

T(N,0)=min{}

 一般情况下:
在这里插入图片描述

在这里插入图片描述


流水作业调度的Johnson法则

 对于流水作业调度问题,必存在最优调度π ,使得作业π(i)和π(i+1)满足Johnson不等式, 此时称π为满足Johnson法则的调度。
    min{ b π ( i ) b_{π(i)} bπ(i), a π ( i + 1 ) a_{π(i+1)} aπ(i+1)}≥min{ b π ( i + 1 ) b_{π(i+1)} bπ(i+1), a π ( i ) a_{π(i)} aπ(i)} , 1≤i ≤n-1

  • 所有满足Johnson法则的调度均为最优调度,且具有相同的加工时间
  • 从而,将流水作业调度问题转化为求满足Johnson法则的调度问题

分析问题

  • 当min{ a 1 a_1 a1, a 2 a_2 a2,┅, a n a_n an , b 1 b_1 b1, b 2 b_2 b2,┅, b n b_n bn }= a k a_k ak时,则对任何i≠k,都有min{ b k b_k bk, a i a_i ai} ≥ min{ b i b_i bi, a k a_k ak}成立,故此时应将作业k安排在最前面,作为最优调度的第一个执行的作业;
  • 当min{ a 1 a_1 a1, a 2 a_2 a2,┅, a n a_n an , b 1 b_1 b1, b 2 b_2 b2,┅, b n b_n bn }= b k b_k bk时,则对任何i≠k,也都有min{ b i b_i bi, a k a_k ak} ≥ min{ b k b_k bk, a i a_i ai}成立,故此时应将作业k安排在最后面,作为最优调度的最后一个执行的作业。
  • n个作业中首先开工(或最后开工)的作业确定之后,对剩下的n-1个作业采用相同方法可再确定其中的一个作业,应作为n-1个作业中最先或最后执行的作业;反复使用这个方法直到最后只剩一个作业为止,最优调度就确定了 。

计算作业加工顺序的步骤

  1. 将{ a 1 a_1 a1, a 2 a_2 a2,┅, a n a_n an , b 1 b_1 b1, b 2 b_2 b2,┅, b n b_n bn }排成非递减序列;
  2. 依次从序列中抽出最小元素m,如果m = a j a_j aj且作业j还没有排入调度表,则把作业 j 安排在调度表可达的最左边一项空位上(设n个作业的调度表有n项,开始全部为空)。
  3. 如果m = bj且作业j还没有排入调度表,则把作业j安排在调度表可达的最右边一项空位上。
  4. 如果作业j已排在调度表中,则取序列的下一个最小元素m,继续按上述方法调度,直到元素取完为止。
  5. 最后得到的调度表中的作业的顺序就是各作业的加工顺序。

例子

  设 n = 4,
   ( a 1 a_1 a1, a 2 a_2 a2 a 3 a_3 a3, a 4 a_4 a4)=(3,4,8,10)
   ( b 1 b_1 b1, b 2 b_2 b2 b 3 b_3 b3, b 4 b_4 b4)=(6,2,9,15)

 解:
  经排序后为
    ( b 2 b_2 b2 a 1 a_1 a1 a 2 a_2 a2 b 1 b_1 b1 a 3 a_3 a3 b 3 b_3 b3 a 4 a_4 a4 b 4 b_4 b4)=(2,3,4,6,8,9,10,15)

  设σ1,σ2,σ3,σ4是最优调度。
   因为最小数是b2,故置σ4= 2。下一个次小的数是a1,置σ1= 1。接下去是a2,作业2已经被调度。再其次是b1作业1也已经被调度。下一个是a3,置σ2= 3,依次置σ3= 4。


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

  1. N 1 N_1 N1 = { i | a i a_i ai < b i b_i bi}, N 2 N_2 N2 = { i | a i a_i ai b i b_i bi}
  2. N 1 N_1 N1中作业依ai的非减序排序;将 N 2 N_2 N2中作业依 b i b_i bi的非增序排序;
  3. N 1 N_1 N1中作业接 N 2 N_2 N2中作业构成满足Johnson法则的最优调度π。
    在这里插入图片描述
  • 红线左侧满足 a π ( i ) a_{π(i)} aπ(i) b π ( i ) b_{π(i)} bπ(i) a π ( i ) a_{π(i)} aπ(i) a π ( i + 1 ) a_{π(i+1)} aπ(i+1) ,符合johnson不等式: min{ b π ( i ) b_{π(i)} bπ(i), a π ( i + 1 ) a_{π(i+1)} aπ(i+1)}≥min{ b π ( i + 1 ) b_{π(i+1)} bπ(i+1), a π ( i ) a_{π(i)} aπ(i)} ,N1中作业调度顺序最优;
  • 红线右侧满足 b π ( i + 1 ) b_{π(i+1)} bπ(i+1) a π ( i + 1 ) a_{π(i+1)} aπ(i+1) b π ( i + 1 ) b_{π(i+1)} bπ(i+1) b π ( i ) b_{π(i)} bπ(i),符合johnson不等式: min{ b π ( i ) b_{π(i)} bπ(i), a π ( i + 1 ) a_{π(i+1)} aπ(i+1)}≥min{ b π ( i + 1 ) b_{π(i+1)} bπ(i+1), a π ( i ) a_{π(i)} aπ(i)} ,N2中作业调度顺序最优;
  • 中间过渡部分横向比较,左侧 a π ( i ) a_{π(i)} aπ(i) b π ( i ) b_{π(i)} bπ(i),右侧 b π ( i + 1 ) b_{π(i+1)} bπ(i+1) a π ( i + 1 ) a_{π(i+1)} aπ(i+1),符合johnson不等式: min{ b π ( i ) b_{π(i)} bπ(i), a π ( i + 1 ) a_{π(i+1)} aπ(i+1)}≥min{ b π ( i + 1 ) b_{π(i+1)} bπ(i+1), a π ( i ) a_{π(i)} aπ(i)} ,其作业调度顺序最优;
      若 a π ( i ) a_{π(i)} aπ(i) b π ( i + 1 ) b_{π(i+1)} bπ(i+1) , 则 a π ( i ) a_{π(i)} aπ(i) b π ( i + 1 ) b_{π(i+1)} bπ(i+1) a π ( i + 1 ) a_{π(i+1)} aπ(i+1) ,又 a π ( i ) a_{π(i)} aπ(i) b π ( i ) b_{π(i)} bπ(i) , 成立。
      若 a π ( i ) a_{π(i)} aπ(i) b π ( i + 1 ) b_{π(i+1)} bπ(i+1) , 则 b π ( i + 1 ) b_{π(i+1)} bπ(i+1) a π ( i ) a_{π(i)} aπ(i) b π ( i ) b_{π(i)} bπ(i) ,又 b π ( i + 1 ) b_{π(i+1)} bπ(i+1) a π ( i + 1 ) a_{π(i+1)} aπ(i+1) , 成立。

算法复杂度分析

  算法的主要计算时间花在对作业集的排序。因此,在最坏情况下算法所需的计算时间为O(nlogn)。所需的空间为O(n)


作业调度的最短时间计算

两个作业调度

在这里插入图片描述


三个作业调度

在这里插入图片描述


核心代码

 👉 参照上面的计算步骤进行分析,有些许不同。

class Jobtype 
{ 
public:int key, index;  // key保存ai和bi二者较小的值; index保存作业号i    bool job;   ///将满足条件ai<bi的放入N1集合的作业标记为trueint operator <=(Jobtype a) const { return(key<=a.key); } 
};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]; //分别取b[i]和a[i]值较小的作为关键字 d[i].job = a[i]<=b[i]; //将满足a[i]<b[i]的放入N1集合的作业i标记为true d[i].index = i;     //将当前作业号i赋值给index}Sort(d, n);//对数组d按关键字key升序进行排序int j = 0,  k = n-1; //指向数组c的两个指针,j指向最前面,k指向最后面for(int i=0; i<n; i++){  if(d[i].job)c[j++] = d[i].index; //将排过序的数组d,取N1中作业号,放到数组c的前面 elsec[k--] = d[i].index;//将d中属于N2的作业号, 放到数组c的后面,从而实现N1的非减序排序,N2的非增序排序}j = a[c[0]];   //第一个作业a完成的时间k = j+b[c[0]];  //第一个作业a+b完成的时间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;
}



完整代码

  把在M1上工作的时间看做是先行工序时间,M2上的工作时间看成后行工序时间。
  如果某个作业的M1时间>M2时间,它就是后行工序;反之,就是先行工序时间。


#include<stdio.h>
#include<iostream>
#include<algorithm>
#define n 6     //6个作业
using namespace std;int M1[n]={2,7,6,4,6,8};
int M2[n]={5,3,2,7,9,2};
int c[n]={0};    //存放次序,注意:c[m]=k,意思是第m+1个执行的作业是kclass Node{
public:int time;    //时间int index;   //来自第几个作业int position;  //是先行工序还是后行工序};bool cmp(Node a,Node b){return a.time<b.time;
}int main(){Node* node=new Node[n];   //设置n个Node型结构体,盛放n个作业int first=0,end=n-1;int time1=0,time2=0; //分别记录在机器1 和 机器2 上的时间for(int i=0;i<n;i++){  // 数组打底工作node[i].index=i;    //记录一下当前这个node节点放的是哪个作业if(M1[i]>M2[i]){node[i].time=M2[i];node[i].position=2;    //后行工序}else{node[i].time=M1[i];node[i].position=1;    //先行工序}}//虽然把n个作业都赋值到了Node型结构体中,//但是大小交错,没有顺序,//所以需要排序sort(node,node+n,cmp);//排完序后,把原本顺序都乱了,先行、后行工作虽然交错,但都已经从小到大排列了//需要用c数组记录执行顺序,先行工序从前往后放,后行工序从后往前放for(int i=0;i<n;i++){if(node[i].position==1){   //先序c[first]=node[i].index;first++;}if(node[i].position==2){    //后序c[end]=node[i].index;end --;}}time1=M1[c[0]];time2=time1+M2[c[0]];for(int i=1;i<n;i++){time1+=M1[c[i]];time2=time1>time2?time1+M2[c[i]]:time2+M2[c[i]];}cout<<"次序:"<<endl;for(int i=0;i<n;i++){cout<<c[i]+1<<"  ";}cout<<endl;cout<<time2<<endl;return 0;
}

测试样例

输入

数据已经在代码中给出
int M1[n]={2,7,6,4,6,8};
int M2[n]={5,3,2,7,9,2};

输出
次序:
1 4 5 2 6 3
35
在这里插入图片描述


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

相关文章

【随机算法】Johnson-Lindenstrauss Theorem 详细解读

前言 最近经常接触降维, 主要是做图像处理和视频处理的维度实在是比较多, 降维这个可真是真正的技术活儿, 而且在不同情况下降维的选择至关重要, 可以说会影响到最终的结果,今天主要是详细讲解一下其中一种当今的降维准则. Johnson-Lindenstrauss Theorem的问题定义 首先, JL要…

最短路径算法--Dijkstra算法,Bellmanford算法,Floyd算法,Johnson算法

最短路径算法 在交通地图上&#xff0c;两地点之间的路径通常标有长度&#xff0c;我们可以用加权有向来描述地图上的交通网。加权有向图中每条路径都有一个路径权值&#xff0c;大小为该路径上所有边的权值之和。本节将重点讨论顶点之间最短路径问题。在实际问题中&#xff0c…

在有向图中找出所有简单环--Johnson算法

注&#xff1a;本算法和计算图所有结点对最短路径的Johnson算法不同。 目录 综述 代码解析 实例解析 引用 综述 Johnson算法由B. Johnson发表于1975年&#xff0c;用于在一个有向图中寻找所有简单环。时间复杂度上界为O((ne)(c1))&#xff0c;空间复杂度为O(ne)&#xff0…

C#,图论与图算法,寻找加权有向图中所有顶点对之间的最短路径的约翰逊算法(Johnson‘s Algorithm)与源程序

一、最短路径问题 问题是找到给定加权有向图中每对顶点之间的最短路径&#xff0c;权重可能为负。我们已经讨论了这个问题的Floyd-Warshall算法。Floyd-Warshall算法的时间复杂度为Θ&#xff08;V3&#xff09;。利用Johnson算法&#xff0c;我们可以在O&#xff08;V2log VV…

最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

本文内容框架&#xff1a; 1 Dijkstra算法 2 Bellman-Ford算法 3 Floyd-Warshall算法 4 Johnson算算法 5 问题归约 6 小结 常用的最短路径算法有&#xff1a;Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法 最短路径算法可以分为单源点最短路径和全源最短路…

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

1、问题描述&#xff1a; n个作业{1&#xff0c;2&#xff0c;…&#xff0c;n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的…

转: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; 数据平面与控制平…