最优流水作业调度问题
- 格式:docx
- 大小:20.39 KB
- 文档页数:4
0018算法笔记——【动态规划】流水作业调度问题与Johnson 法则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个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
流水作业调度问题描述:N个作业{1,2, ..... ,n}要在由两台机器M1和M2组成的流水线上完成加工。
每个作业加工的顺序都是先在M1上加工,然后在M2上加工。
M1和M2加工作业i所需的时间分别为ai和bi , 1 < i < n。
流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。
可以假定任何任务一旦开始加工,就不允许被中断,直到该任务被完成,即非优先调度。
输入:输入包含若干个用例, 第一行为一个正整数K(1<=K<=1000), 表示用例个数, 接下来K 个用例,每个用例第一个为作业数N(1<=N<=1000),接下来N行,每行两个非负整数,分别表示在第一台机器和第二台机器上加工时间。
输出:每个用例用一行输出采用最优调度所用的总时间,即从第一台机器开始到第二台机器结束的时间。
样例输入:145 612 24 148 7样例输出:33假定直接按顺序进行完成,则机器1 可以不用考虑,因为作业1 完成后就可以完成作业2,直到作业n,需要的时间为所有作业在机器1上的时间总和。
但是,机器2 上完成的时间呢?机器2上完成的时间显示除了作业在机器2上完成的时间总和, 还要加上等待时间, 即要求先在机器1 上完成后,才能在机器2 上开始。
例如5 612 2两个作业,顺序如下:按顺序,则在机器1 上进行作业1 需要5小时,后进行作业2, 需要12小时,和为17 小时;机器2 上,作业1 只能从第5 小时开始,第11 小时完成,等待了5 小时,等到作业2 在机器1 上完成后(已经是第17时),再完成2小时,共19小时。
机器2的等待时间总计为11 小时。
逆序,在机器1上进行作业2需要12小时,后进行作业1 需要5小时,和为17小时,和前面一样;机器2上,作业2完成后开始,等待了12小时,然后再等3小时开始作业1的6小时, 共计21小时,共等待了15小时。
一、 问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
二、 算法分析n 个作业{1,2,…,n}要在由2台机器1M 和2M 组成的流水线上完成加工。
每个作业加工的顺序都是先在1M 上加工,然后在2M 上加工。
1M 和2M 加工作业i 所需要的时间分别为t[i,1]和t[i,2], n i ≤≤1.流水作业调度问题要求确定这n 个作业的最优加工顺序,使得从第一个作业在机器1M 上开始加工,到最后一个作业在机器2M 上加工完成所需的时间最少。
从直观上我们可以看到,一个最优调度应使机器1M 没有空闲时间,且机器2M 的空闲时间是最少。
在一般情况下,机器2M 上会有机器空闲和作业积压两种情况。
设全部作业的集合为},....,2,1{n N =。
N S ⊆是N 的作业子集。
在一般情况下,机器1M 开始加工S 中作业时,机器2M 还在加工其他作业,要等时间t 后才能利用。
将这种情况下完成S 中作业所需的最短时间计为),(t S T 。
流水作业调度问题的最优解为)0,(N T 。
1. 证明流水作业调度问题具有最优子结构设a 是所给n 个流水作业的一个最优调度,它所需要的加工时间为']1),1([T a t +。
其中,'T 是在机器2M 的等待时间为]2),1([a t 时,安排作业)(),......,3(),2(n a a a 所需的时间。
记)}1({a N S -=,则我们可以得到])2),1([,('a t S T T =。
事实上,有T 的定义可知])2),1([,('a t S T T ≥.若])2),1([,('a t S T T >,设'a 是作业集S 在机器2M 的等待时间为]2),1([a t 情况下的一个最优调度。
3.1 简述流水线技术的特点。
(1) 流水线把一个处理过程分解为若干个子过程,每个子过程由一个专门的功能部件来实现。
因此,流水线实际上是把一个大的处理功能部件分解为多个独立的功能部件,并依靠它们的并行工作来提高吞吐率。
(2) 流水线中各段的时间应尽可能相等,否则将引起流水线堵塞和断流。
(3) 流水线每一个功能部件的前面都要有一个缓冲寄存器,称为流水寄存器。
(4) 流水技术适合于大量重复的时序过程,只有在输入端不断地提供任务,才能充分发挥流水线的效率。
(5) 流水线需要有通过时间和排空时间。
在这两个时间段中,流水线都不是满负荷工作。
3.2 解决流水线瓶颈问题有哪两种常用方法?答:细分瓶颈段与重复设置瓶颈段 3.3 有一条指令流水线如下所示:(1)求连续输入10条指令的情况下,该流水线的实际吞吐率和效率。
(2)该流水线的瓶颈在哪一段?请采用两种不同的措施消除此瓶颈。
对于你所给出的两种新的流水线,连续输入10条指令时,其实际吞吐率和效率各是多少?解:(1)2200(ns)2009200)10050(50t )1n (t T maxm1i i pipeline =⨯++++=∆-+∆=∑=)(ns 2201T nTP 1pipeline-==45.45%1154400TP mtTP E m1i i≈=⋅=∆⋅=∑= (2)瓶颈在3、4段。
⏹ 变成八级流水线(细分)850(ns)509850t 1)(n t T maxm1i i pipeline =⨯+⨯=∆-+∆=∑=)(ns 851T nTP 1pipeline-== 58.82%17108400TP mtiTP E m1i ≈=⋅=∆⋅=∑= ⏹ 重复设置部件)(ns 851T nTP 1pipeline-==58.82%1710885010400E ≈=⨯⨯=3.4 有一个流水线由4段组成,其中每当流过第三段时,总要在该段循环一次,然后才能流到第4段。
改进迭代贪婪算法求解可重入流水车间调度问题可重入流水车间调度问题(reentrant flow shop scheduling problem)是指在多工序流水车间中,存在可重入现象的调度问题。
在车间中,每个作业需要按照一定的工序顺序加工,而每个工序都有不同的机器可以完成。
不同于一般流水车间问题,可重入流水车间问题允许同一作业在同一工序上重复进行,增加了调度的复杂性和难度。
迭代贪婪算法是一种常用于解决可重入流水车间调度问题的启发式算法。
它的基本思想是通过多次迭代,每次选择当前局部最优的决策来逐步优化最终调度结果。
然而,传统的迭代贪婪算法存在着一些不足之处,例如容易陷入局部最优解、收敛速度较慢等。
因此,本文将针对这些不足之处进行改进,以求更好地解决可重入流水车间调度问题。
一、改进之处在改进迭代贪婪算法求解可重入流水车间调度问题时,我们可以从以下几个方面进行改进:1. 变异操作策略的引入:传统的迭代贪婪算法只考虑选择当前局部最优解进行迭代更新,但这种策略存在着局限性。
我们可以引入变异操作策略,即在每次迭代中,按照一定概率引入一定程度的随机性,以避免陷入局部最优解。
通过引入变异操作,可以增强算法的全局搜索能力,提高算法的质量和效率。
2. 邻域搜索的扩展:邻域搜索是迭代贪婪算法中的关键步骤。
传统的迭代贪婪算法仅仅根据局部最优解进行邻域搜索,但这种策略可能无法充分探索搜索空间。
我们可以考虑扩展邻域搜索的范围,在搜索过程中引入一定程度的随机性,以增加解空间的探索度。
通过扩展邻域搜索的范围,可以更全面地搜索潜在解,提高算法的全局搜索能力。
3. 优化目标函数的定义:目标函数的定义直接关系到算法求解可重入流水车间调度问题的效果。
传统的迭代贪婪算法通常采用简单的目标函数,例如最小化总加工时间或最大化作业的完工时间。
然而,这样的目标函数并不能充分考虑到车间效率与资源利用率等因素。
我们可以重新定义目标函数,结合车间实际情况和约束条件,以综合考虑多个指标,从而求得更合理、更优的调度结果。
典型车间调度问题的分析与研究车间调度问题是制造业中常见的一种问题,在生产管理中起着至关重要的作用。
此问题的核心是如何合理地安排各个车间的生产任务和设备利用率,以达到优化生产效率、缩短生产周期并降低生产成本的目的。
本文旨在从多个方面介绍车间调度问题的分析与研究。
一、问题描述和分类车间调度问题主要涉及下列问题:1. 单机调度问题该问题是考虑一个单一机器或单一设备的调度问题。
其目标是找到一种机器的调度方案,以使得所有的工作任务在规定的期间内完成,同时,最大限度地利用该机器的生产能力。
单机调度问题通常指能够独立完成的作业。
该问题是考虑由多个机器或设备构成的制造系统的调度问题。
通常情况下,多机调度问题是被分成原始、车间和制造流水线的三个不同的问题进行研究,以应对各自的特点。
3. 制造流水线调度问题生产流水线通常由许多具有不同功能的机器或工作站组成。
优化流水线生产效率的调度问题,在一定程度上依赖于流水线的布局和排列顺序。
通过对每个工作站的工序进行优化,可以达到减少生产周期和提高生产效率的目的。
4. 调度与规划问题此问题是在给定的资源限制下,设计制造系统的调度策略。
制造过程的规划和调度策略在许多情况下都是并存的,因为它们需要相互配合以实现最佳生产效率。
二、常用的调度算法为了解决车间调度问题,通常需要使用一些数学模型和算法进行优化。
下面介绍一些常见的调度算法:1. 遗传算法遗传算法是一种进化算法,通过建立基因编码对调度方案进行进化,以最大限度地优化计划和排程。
该算法通常用于求解复杂的车间调度问题。
2. 蚁群算法蚁群算法是一种模拟蚂蚁走路搜索食物的算法。
该算法是用来优化复杂问题的一种有效的方式。
在车间调度问题中,它被认为是一种有效的算法,因为它具有收敛快、精度高、适应性强等特点。
3. 模拟退火算法模拟退火算法是一种优化算法,通过在较难达到的目标函数中寻找全局最优解,达到优化的效果。
该算法不容易陷入局部最优解,因此在多机调度问题和车间调度问题中得到了广泛的应用。
作业车间调度问题是指如何合理地安排工件在不同工序间的加工顺序,以达到最优的生产效率和成本控制。
针对这一主题,我将从几种常见的模型出发,深入探讨作业车间调度问题,旨在为您提供一篇有价值的文章。
一、传统作业车间调度模型1.1 单机调度模型在单机调度模型中,工件依次经过一个加工机器的加工过程。
我们需要考虑如何安排加工顺序、加工时间等因素,以最大程度地减少工件的等待时间和加工时间,提高生产效率。
1.2 流水车间调度模型流水车间调度模型是指在多台加工机器之间,工件按照特定的加工顺序依次进行加工。
我们需要考虑如何合理安排工件的加工顺序,以减少生产中的瓶颈和待机时间,提高整个流水线的生产效率。
1.3 作业车间调度的经典排序问题这种模型主要关注如何将待加工的工件按照特定的规则进行排序,以便在加工过程中最大程度地降低总加工时间和成本。
以上是传统作业车间调度问题的一些经典模型,它们都是针对不同的生产场景和加工流程所提出的解决方案。
接下来,我将对每种模型进行更深入的探讨,以便更好地理解作业车间调度问题。
二、作业车间调度问题的多种解决方法2.1 基于启发式算法的调度方法启发式算法是一种基于经验和规则的算法,它能够快速、高效地求解作业车间调度问题。
常见的启发式算法包括遗传算法、模拟退火算法等,它们能够在短时间内找到较优的解,并且适用于各种不同规模和复杂度的生产场景。
2.2 基于数学规划的调度方法数学规划方法是指利用数学建模和优化理论,对作业车间调度问题进行严格的数学求解。
通过建立数学模型,我们可以利用线性规划、整数规划等方法,对作业车间调度问题进行最优化求解,得到最优的生产调度方案。
2.3 基于仿真的调度方法仿真方法是指利用计算机模拟生产场景,通过模拟实际的生产过程,找到最优的调度方案。
通过仿真,我们可以更加真实地模拟生产现场的情况,找到最优的生产调度策略,提高生产效率和降低成本。
以上是作业车间调度问题的多种解决方法,它们都能够根据不同的生产场景和需求,找到最优的调度方案。
车间作业调度(JSSP)技术问题简明综述l 引言生产调度是CIMS 研究领域生产管理的核心内容和关键技术,车间作业调度问题(JSSP)是最困难的约束组合优化问题和典型的NP 难问题,其特点是没有一个有效的算法能在多项式时间内求出其最优解. 现代经济日益强化的竞争趋势和不断变化的用户需求要求生产者要重新估价生产制造策略,如更短的产品生产周期和零库存系统等,而JSSP 生产环境最适宜满足现有经济和用户的需求. 利用有限的资源满足被加工任务的各种约束,并确定工件在相关设备上的加工顺序和时间,以保证所选择的性能指标最优,能够潜在地提高企业的经济效益,JSSP 具有很多实际应用背景,开发有效而精确的调度算法是调度和优化领域重要的课题.研究JSSP 问题最初主要采用最优化方法,但计算规模不可能很大,且实用性差.近年来,基于生物学、物理学、人工智能、神经网络、计算机技术及仿真技术的迅速发展,为调度问题的研究开辟了新的思路. 本文根据JSSP 问题的大量文献,对研究理论与方法进行系统的分类并介绍这一领域的最新进展,讨论进一步的研究方向.2 JSSP 问题的一般框架2.1 问题描述JSSP 问题可描述为:m 台机器(用集合()m j j M M 1==表示)加n 个工件(用集合|()ni i J J 1== 表示),每个工件包含由多道工序组成的一个工序集合. 工件有预先确定的加工顺序,每道工序的加工时间t 在给定的时间每个机器只能加工一个工件,并且每个工件只能由一台机器处理. 不同工件的加工顺序无限制,工序不允许中断;要求在可行调度中确定每个工序的开始时间ij s 使总完工时间max C 最小,即(){}M M J J t s C C j i ij ij ∈∈∀+==,:max min )min(max *max 求解满足以上条件的工件加工顺序即构成JSSP 调度问题.流水作业调度问题(FSSP)是JSSP 问题的特殊形式(即所有工件有相同的加工工序). 此外目标函数可选取等待时间、流程时间和延期时间的平均值或者最大值等,或多个目标组合形成的多目标问题.2.2 JSSP 的模型表示2.2.1 整数规划(IP)模型整数规划模型由Baker 提出,需要考虑两类约束:工件工序的前后约束和工序的非堵塞约束. 用jk t 和 jk c 分别表示工件 j 在机器k 上的加工时间和完工时间.如果机器h 上的工件加工工序先于机器K (用k h J J <表示),则有关系式jh jk jk c t c ≥-;反之,如果h k J J <,有jk jh jh c t c ≥-。
车间调度优化算法1. 背景介绍车间调度是指在生产过程中,根据工序、设备和人力资源等因素进行合理安排和优化,以最大程度地提高生产效率和资源利用率。
优化车间调度可以实现减少生产时间、降低成本、提高产品质量等目标,对企业的竞争力具有重要影响。
2. 车间调度问题车间调度问题是一类非常经典和复杂的组合优化问题。
它涉及到多个任务在有限的资源和时间约束下的安排顺序和分配资源的问题。
常见的车间调度问题包括作业车间调度问题、流水车间调度问题、多车间调度问题等。
2.1 作业车间调度问题作业车间调度问题是指在一个车间中,有多个作业需要在不同的设备上加工完成,且每个作业都有不同的加工时间和顺序限制。
目标是使得所有作业完成时间最短或最早。
2.2 流水车间调度问题流水车间调度问题是指在一个车间中,多个作业需要按照一定的顺序在不同的设备上进行加工。
每个作业只能按照顺序流水加工,即前一个作业在设备上加工完成后,才能开始下一个作业的加工。
2.3 多车间调度问题多车间调度问题是指在多个车间中,多个作业需要在不同的车间和设备上进行加工。
每个车间有不同的资源限制和时间窗口。
目标是使得所有作业完成时间最短或最早,同时满足车间资源和时间窗口的约束。
3. 车间调度优化算法3.1 车间调度算法分类车间调度优化算法主要包括启发式算法和精确算法两类。
3.1.1 启发式算法启发式算法是通过设定一些规则和策略来寻找近似最优解的方法。
常见的启发式算法包括遗传算法、模拟退火算法、蚁群算法等。
这些算法基于一些启发性的搜索策略,在较短时间内找到较优解,并具有较好的可扩展性。
3.1.2 精确算法精确算法是通过穷举所有可能的解空间,找到全局最优解的方法。
常见的精确算法包括动态规划、整数规划、分支定界等。
这些算法可以通过逐步优化和约束条件的剪枝,找到最优解,但计算复杂度较高。
3.2 车间调度算法选择和调优选择合适的车间调度算法取决于问题的规模、约束条件和求解目标。
0018算法笔记——【动态规划】流水作业调度问题与Johnson 法则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个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
动态规划——流⽔作业调度问题问题:n个作业 N={1,2,…,n}要在2台机器M1和M2组成的流⽔线上完成加⼯。
每个作业须先在M1上加⼯,然后在M2上加⼯。
M1和M2加⼯作业i 所需的时间分别为 ai 和bi,每台机器同⼀时间最多只能执⾏⼀个作业。
流⽔作业调度问题要求确定这n个作业的最优加⼯顺序,使得所有作业在两台机器上都加⼯完成所需最少时间。
最优调度应该是:1. 使M1上的加⼯是⽆间断的。
即M1上的加⼯时间是所有ai之和,但M2上不⼀定是bi之和。
2. 使作业在两台机器上的加⼯次序是完全相同的。
则得结论:仅需考虑在两台机上加⼯次序完全相同的调度。
为了得到最优⼦解结构(⽐较重要~~~~ ⽼师说期末考试会考到这个):—>机器M1开始加⼯S中作业时,机器M2还在加⼯其他作业,要等时间 t 后才可利⽤,则: 1. 则完成S中作业所需的最短时间记为T(S,t) 2. 完成所有作业所需的最短时间为T(N,0) 3. T(N,0)=min{ai + T(N-{i}, bi)}, i∈N。
ai:选⼀个作业i先加⼯,在M1的加⼯时间。
T(N-{i},bi}:剩下的作业要等bi时间后才能在M2上加⼯。
注意这⾥函数的定义,因为⼀开始⼯作i是随机取的,M1加⼯完了ai之后,要开始加⼯bi了,这⾥M1是空闲的可以开始加⼯剩下的N-i个作业了,但此时M2开始加⼯bi,所以要等bi时间之后才能重新利⽤,对应到上⾯函数T(s,t)的定义的话,这⾥就应该表⽰成T(N-{i},bi), 所以最优解可表⽰为T(N,0)=min{ai + T(N-{i}, bi)}, i∈N,即我们要枚举所有的⼯作i,使这个式⼦取到最⼩值。
这⾥顺便吐槽⼀句:算法中会利⽤很多数学知识,⼀定要搞清楚函数的意义以及每个数学符号所代表的含义,这样不⾄于各种懵⽐。
继续分析T(S,t)可得: T(S,t)={ai + T(S-{i}, bi+max{t-ai,0})}, i∈S 其中:T(S-{i}, bi+max{t-ai,0}):剩下的作业等bi+max{t-ai,0}才能在M2加⼯,⾄于这⾥是怎么推导出来的呢?见下⾯推导:最优⼦结构的证明(问题最优解包括⼦问题最优解):最优⼦结构:设π是N的⼀个最优调度,其加⼯顺序为π1,…, πn,其所需的加⼯时间为 aπ1+T’(即第⼀个作业π1在M1上加⼯的时间和其它的加⼯时间)。
流⽔作业调度问题———Johnson算法问题描述:N个作业1,2,…,n要在由2台机器A和B组成的流⽔线上完成加⼯。
每个作业加⼯的顺序都是先在A上加⼯,然后在B上加⼯。
A和B加⼯作业i所需的时间分别为a[i]和b[i]。
你可以安排每个作业的执⾏顺序,使得从第⼀个作业在机器A上开始加⼯,到最后⼀个作业在机器B上加⼯完成所需的时间最少。
求这个最少的时间。
⼤概思路:求⼀个加⼯顺序使得加⼯时间最短,就是让机器空闲时间最短,当A开始⼯作便会⼀直运作,关键是B会等待A,很明显A加⼯第⼀个作业时B得等待,同理B加⼯最后⼀个作业A 得等待Johnson算法此算法是⼀种贪⼼策略:把在A机器上加⼯最快的作业先加⼯,把B机器上加⼯最快的作业放在最后具体实现:设M i=min{a i,b i}将数组M由⼩到⼤排序,然后从第⼀个开始处理,若M i=a i则按顺序排在作业加⼯顺序的前⾯,若M i=b i则按顺序排在后⾯最后排出来的顺序就是最优解算法证明设S={J1,J2,J3····J n}为待加⼯作业排序,T(S,t)为A开始加⼯S中作业,B需t时刻后才能加⼯A加⼯完的作业,这种情况下加⼯完S中作业所需最⼩的时间T(S,t)=min{a i+T(S−{J i},b i+max{t−a i,0})}, J i∈S假设最佳⽅案是先加⼯J i,然后加⼯J j,则有T(S,t)=a i+T(S−{J i},b i+max{t−a i,0})=a i+a j+T(S−{J i,J j},b i+bj+T ij)T ij=b j+max{b i+max{t−a i,0}−a j,0},0}=b i+b j−a i−a j+max{t,a i,a i+a j−b i}若J i和J j调换顺序则:T′(S,t)=a i+a j+T(S−{J i,J j},T ji)T ji=b i+b j−a i−a j+max{t,a j,a i+a j−b j}所以T(S,t)<=T′(S,t),所以有max{t,a i,a i+a j−b i}<=max{t,a j,a i+a j−b j}a i+a j+max{−b i,−a j}<=a i+a j+max{−b j,−a i}(其实2步转化我不太清楚,只是意会了⼀下,如有理解的⿇烦告诉我,感谢)即min{b j,a i}<=min{b i,a j}也就是说J i在J j之前加⼯最优得满⾜上式条件,则a i<=b i,a j或者b j<=b i,a j即在A机器上加⼯时间短的任务优先,⽽在B机器上加⼯时间短的排在后⾯,与具体实现的步骤相符Processing math: 100%。
流水作业调度问题(不能直接使用动态规划法的例子)流水作业调度的定义:设有n个作业,每一个作业i均被分解为m项任务: T i1, T i2, ┅, T im(1≤i≤n,故共有n m个任务),要把这些任务安排到m台机器上进行加工。
如果任务的安排满足下列3个条件,则称该安排为流水作业调度:1. 每个作业i的第j项任务T ij (1≤i≤n, 1≤j≤m)只能安排在机器P j上进行加工;2. 作业i的第j项任务T ij(1≤i≤n, 2≤j≤m)的开始加工时间均安排在第j-1项任务T i,j-1加工完毕之后;(任何一个作业的任务必须依次完成,前一项任务完成之后才能开始着手下一项任务)3. 任何一台机器在任何一个时刻最多只能承担一项任务。
最优流水作业调度:设任务T ij在机器P j上进行加工需要的时间为t ij。
如果所有的t ij (1≤i≤n, 1≤j≤m)均已给出,要找出一种安排任务的方法,使得完成这n个作业的加工时间为最少。
这个安排称之为最优流水作业调度。
完成n个作业的加工时间:从安排的第一个任务开始加工,到最后一个任务加工完毕,其间所需要的时间。
优先调度:允许优先级较低的任务在执行过程中被中断,转而去执行优先级较高的任务。
非优先调度:任何任务一旦开始加工,就不允许被中断,直到该任务被完成。
流水作业调度一般均指的是非优先调度。
非优先调度可看成是特殊的优先调度:所有任务的优先级均相同。
7 5 8e.g. (t ij)= 2 2 60 7 4注意:t ij为0表示作业i无须在机器P j上进行加工、即该道工序可以省略。
已经证明,当机器数(或称工序数)m≥3时,流水作业调度问题是一个NP-hard问题(e.g分布式任务调度)。
(粗糙地说,即该问题至少在目前基本上没有可能找到多项式时间的精确最优算法。
)∴目前仅当m=2时,该问题可有多项式时间的算法。
为方便起见,记t i1为a i(作业i在P1上加工所需时间),t i2为b i(作业i在P2上加工所需时间)。
双机流⽔作业调度问题(Johnson算法)问题定义:双机流⽔作业调度:总共有n个作业,作业i分为两个内容,需要按顺序先后在机器A和机器B上完成,分别需要时间a i,b i来完成,⼀台机器只能同时进⾏⼀项作业,问完成所有作业所需的最⼩时间。
多机流⽔作业调度:⼀个作业需要在⼤于两台机器上先后完成,是NP-hard问题。
解法:问题就是求最佳作业序列。
设前i项作业所需的时间为C i,可以得出以下式⼦c i=a1+b1,i=1 max c i−1,∑i j=1a j+b i,2≤i≤n可以证明,对于相邻两项i和j,如果min(a i,b j)<min(a j,b i)则i项放前⾯更优。
将a i和b i的关系分为<,=,>三类,可以得到如下排列顺序:1.当a i<b i,a j<b j时,a i≤a j,应该按a升序排序2.当a i=b i,a j=b j时,随意排列。
3.当a i>b i,a j>b j时,b i≥b j,应该按b降序排序。
同样可以证明,a i<b i的项应该排在最前,然后是a i=b i的项,最后是a i>b i的项。
代码:{{}//P1248,给定n,ai,bi,求最⼩⽤时和对应序列#include <bits/stdc++.h>using namespace std;const int maxn=1e5+5;typedef long long ll;struct node{int a,b,d,id;bool operator<(const node &v)const {if(d!=v.d)return d<v.d;else if(d==-1){return a<v.a;}else{return b>v.b;}}}p[maxn];int main () {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&p[i].a);for(int i=1;i<=n;i++){scanf("%d",&p[i].b);p[i].id=i;int cha=p[i].a-p[i].b;if(cha==0)p[i].d=0;else p[i].d=cha<0?-1:1;}sort(p+1,p+1+n);ll ans=0,dt=0;for(int i=1;i<=n;i++){ans+=p[i].a;dt=max(0ll,dt-p[i].a);dt+=p[i].b;}ans+=dt;printf("%lld\n",ans);for(int i=1;i<=n;i++){if(i>1)printf(" ");printf("%d",p[i].id);}puts("");}Processing math: 100%。