动态规划-3.8流水作业调度

流水作业调度(动态规划) 题目:    n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi 例如这个例子: 所以最有时间就为: a4+a0+a2+a1+a3+[(b4+b0+b1+b2)-(a0+a1+a2+a3)]+b3      =1+2+3+4+6+[(7+5+2+3)- 阅读详情

问题描述:

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

分析:

直观上,一个最优调度应使机器M1没有空闲时间,且机器M2空闲时间最少。一般情况下,机器M2上会有机器空闲和作业积压2种情况。

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

其中a[i]是第i个作业在M1上工作的时间,b[i]是第i个作业在M2上工作的时间,同一作业分别在两个机器上的工作时间不一定相同

1
针对这两个递归等式,如果觉得不易理解,请看如下图示。
在这里插入图片描述

流水作业调度思想三大步骤:

3

流水作业调度程序实现四大步骤

①令N1={i|a[i]< b[i]},N2={i|a[i]>=b[i]}
②按key值升序排序
③连接N1&N2
④计算总时间

例如:*表示选择某作业时该选择比较的key值

作业J0J1J2J3J4J5
M130*12050*20*90110
M280100*906030*10*

则 N1 = {J3,J0,J2}(升序);N2 = {J1,J4,J5}(降序)

public class test3_8 {
	public static int flowShop(int[] M1,int[] M2,int[] c){
		int n = M1.length;
		Element[] d = new Element[n]; //作业元素
		//1.令N1={i|a[i]<b[i]},N2={i|a[i]>=b[i]}
		for(int i=0;i<n;i++){
			int key = (M1[i]<M2[i])? M1[i]:M2[i];  
			int index = i;
			boolean job = (M1[i]<=M2[i]);  //job=1表示N1,job=0表示N2
			d[i] = new Element(key,index,job);
		}
		//2.按key值升序排序
		bobleSort(d);
		//3.连接N1&N2
		int count=0;
		int k = n-1;
		for(int i=0;i<n;i++){
			if(d[i].job)  c[count++] = d[i].index;    //如果是N1
			else c[k--] = d[i].index;                 //如果是N2
		}
		//4.计算总时间
		int time1 = M1[c[0]];
		int time2 = time1+M2[c[0]];
		for(int i=1;i<n;i++){
			time1 += M1[c[i]];
			//此处不能是 += 
			time2 = (time1<time2)?(time2+M2[c[i]]):(time1+M2[c[i]]);
		}
		return time2;
	}
	//整个数组无需分N1或N2排序,整体升序排序也保证N1&N2内部为升序排序
	public static void bobleSort(Element[] d){
		int n = d.length;
		Element temp;
		for(int i=0;i<n-1;i++){
			boolean ok = true;
			for(int j=1;j<n-i;j++){
				if(d[j-1].key>d[j].key){
					temp = d[j];
					d[j] = d[j-1];
					d[j-1] = temp;
					ok = false;
				}
			}
			if(ok) break;
		}
	}
	public static void main(String[] args) {
		int n = 6;
		int time;  //最优作业调度花费总时间
		int[] c = new int[n];  //作业调度顺序
		int[] M1 = {30,120,50,20,90,110}; //在M1机器上的工作时间
		int[] M2 = {80,100,90,60,30,10}; //在M2机器上的工作时间
		System.out.print("M1机器上顺序工作时间为:");
		for(int i=0;i<n;i++) System.out.print("("+i+")"+M1[i]+" ");
		System.out.println();
		System.out.print("M2机器上顺序工作时间为:");
		for(int i=0;i<n;i++) System.out.print("("+i+")"+M2[i]+" ");
		System.out.println();
		time = flowShop(M1,M2,c);
		System.out.println("完成作业最短时间为:"+time);
		System.out.print("作业最优调度顺序为:");
		for(int i=0;i<n;i++)
			System.out.print(c[i]+" ");
		System.out.println();
	}
}
//作业元素(key,index,job)
class Element{
	int key;   //排序关键码
	int index;  //作业序号
	boolean job;  //N1&N2标识符
	public Element(int k,int i,boolean j){
		this.key = k;
		this.index = i;
		this.job = j;
	}
}

运行结果如下:

M1机器上顺序工作时间为:(0)30 (1)120 (2)50 (3)20 (4)90 (5)110 
M2机器上顺序工作时间为:(0)80 (1)100 (2)90 (3)60 (4)30 (5)10 
完成作业最短时间为:430
作业最优调度顺序为:3 0 2 1 4 5 

补充:以上代码用的排序算法是冒泡排序,大家可以更换成快速排序,这样可以使本算法时间复杂度降到最低,即O(nlogn),因为时间复杂度最高的就是排序代码段,除排序以外代码段都是一个for循环,该算法所需空间为O(n)。

附C++代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct JobUnit{
    long T1;  // 作业在第1个机器上的时间
    long T2;  // 作业在第2个机器上的时间
};
class Solution{
    static bool cmp(JobUnit a, JobUnit b){
        bool aIsP = a.T1 < a.T2; // 若作业a在第1台机器的耗时小于在第2台机器的耗时,则用小者做比较
        bool bIsP = b.T1 < b.T2;
        if(aIsP && bIsP)         // 若两个作业的key值都是第1台机器的耗时,则按升序排序
            return a.T1 < b.T1;
        else if(!aIsP && !bIsP)  // 若两个作业的key值都是第2台机器的耗时,则按降序排序
            return a.T2 > b.T2;
        else if(aIsP && !bIsP)   // 若第1个作业的key值是第1台机器,第2个作业的key值时第2台机器,则不交换
            return true;
        return false;       // 若第1个作业的key值是第2台机器,第2个作业的key值时第1台机器,则交换位置
    }
public:
    long jobSchedule(vector<JobUnit>& job, int n){
        // 1.划分N1和N2并按不同key值排好序
        sort(job.begin(), job.end(), cmp);
        // 2.计算最低总耗时
        for(int i = 0;i < n;i++){
            minTime += job[i].T1;
            if(i > 0)
                // 1)之前所有任务在第二台机子的累计剩余、2)前一个任务在第二台机子上的剩余和3)当前任务在第二台机子上的耗时取最大
                remainTime = max(remainTime - job[i].T1, max((job[i-1].T2 - job[i].T1), job[i].T2));
            else
                remainTime = job[i].T2;
        }
        return minTime + remainTime;
    }
private:
    long minTime = 0, remainTime;
};
int main(){
    int n;
    JobUnit jobunit;
    vector<JobUnit> job;
    while(cin.peek() != '\n'){
        scanf("%ld", &jobunit.T1);
        job.push_back(jobunit);
    }
    n = job.size();
    for(int i = 0;i < n;i++)
        scanf("%ld", &job[i].T2);
    Solution sol;
    cout<<sol.jobSchedule(job, n)<<endl;
    return 0;
}
流水作业调度难题:动态规划如何实现精确排程优化 流水作业调度(Flow Shop Scheduling)是制造排产中的经典组合优化问题,核心是在多台固定工序的机器上找出最优任务排列,使得总完工时间(makespan)最短。随着任务数增长,排列空间呈阶乘级爆炸,传统穷举法难以为继。动态规划算法通过状态压缩与支配剪枝,将“已排任务集合”和“各机器结束时刻”抽象为公共子状态,大幅缩减搜索空间,在中小规模排程中稳定求得全局最优解。该方法不仅能与Johnson规则交叉验证,还能扩展至序列相关准备时间、插单重排和并行机等真实生产场景,为车间排产提供精确的决策基准。理 阅读详情

相关推荐

动态规划求解流水作业调度:从状态压缩到车间排产实战

在制造车间中,如何安排工件经过多台机器的顺序以最小化总完工时间,是一类经典的排序优化问题。流水作业调度要求所有工件遵循相同工艺路线,当工件数增长时排列组合呈指数爆炸,属于NP-hard难题。动态规划通过将“已排工件集合”编码为二进制掩码,并记录每台机器的完工时间向量,将指数级搜索压缩为状态转移;这种状态压缩方式在小规模场景下能快速求出严格最优解。技术上,该方案不只能直接用于10~15个工件的班次排产,还可作为启发式算法的基准验证工具。结合Johnson规则处理两台机器的特例,并在大规模场景中与NEH、元启发

weixin_33290540的博客 277

流水作业调度——动态规划

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

何妨吟啸且徐行 7554

动态规划 流水作业调度问题

JAVA实现流水作业调度问题 直接是源程序 需要的自己下载 看这好的给评价下 谢谢!!

流水线作业调度问题c语言,流水线作业调度问题

题目:感觉有些 , 还要思考的地方 , 留下了 ,以后看。。。。DescriptionN个作业{1,2,………,n}要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi,1≤i≤n。流水作业高度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完...

weixin_39523280的博客 1392

流水作业调度问题动态规划思路与Johnson法则1

1、问题描述:         n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工 2、问题分析     直观上,一个最优调度应使机器M1

第二十届全国大学生智能车竞赛-地瓜机器人智慧医疗挑战赛技术解析与实战指南

本文深入解析了第二十届全国大学生智能车竞赛-地瓜机器人智慧医疗挑战赛的核心技术。内容涵盖从零搭建数字孪生环境、实现AI视觉任务(二维码识别、引导线追踪、目标检测)、在边缘设备部署轻量化大模型进行图生文描述,到遥操作与自主控制的平滑切换,并提供了基于ROS2的系统集成与赛场实战指南,助力参赛者高效备赛。

weixin_29252171的博客 2778

流水线调度问题【java版本】

题目要求 N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。 思路: 需要M2尽可能早用多用不出现空闲的状态。 将任务分成两类 ...

qq_43313769的博客 1315

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3391

动态规划算法解决流水作业调度

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 #动态规划算法解决流水作业调度 所展示的欢

q642634743的博客 8843

2D激光slam四种算法建图效果对比

2d激光slam四种算法建图比较

m0_73791170的博客 8449

Unity序列帧动画输出全攻略:Recorder+Timeline实战与透明通道处理

序列帧动画是游戏开发、影视动画和UI动效中的基础技术,指将连续动作分解为一系列静态图像并按序播放,形成动态视觉效果。其原理是通过时间轴精确控制每一帧的内容与时机,实现动画的逐帧呈现。在实时渲染领域,序列帧输出技术价值显著,它能够将动态内容高质量地转换为静态图像序列,便于跨平台复用、后期合成与资源分发。应用场景广泛,包括角色动画导出、技能特效制作、宣传片素材生成等。本文聚焦Unity引擎,深入解析如何利用Recorder与Timeline工具链,高效输出带Alpha透明通道的PNG序列帧,并重点攻克透明通道处

weixin_31556767的博客 327

流水作业调度--动态规划(详解)

3.8流水作业调度----动态规划(详解) 问题描述:流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 在 直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。在一般情况下,机器M2上会有机器空闲和作业积压两种情况。如下图: 设全部作业的集合为N={1,2,…,n},S⊆N是N的作业子集。在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其他作业,要等时间t后才可利用。这种情况下,完成S中

weixin_46654640的博客 4020

ESP32-C3芯片通过蓝牙控制开锁功能

定义BLE服务和特征,用于接收开锁命令。0x00FF// 服务UUID0xFF01// 特征UUID4// 句柄数量// 特征值// 特征属性// 处理GATT服务器事件// 处理事件(详细代码见下文)// 注册GATT回调if (ret) {return;// 创建GATT服务器。

m0_46145044的博客 921

流水作业调度问题

问题描述: n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。 目标:确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 题目类型:动态规划 算法描述: 流水作业调度问题的Johnson算法: (1) 令 (2)将N1 中作

K.SHI的博客 2万+

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)

王老师青少年编程 3398

流水作业调度问题(转)

流水作业调度问题(不能直接使用动态规划法的例子) 流水作业调度的定义: 设有n个作业,每一个作业i均被分解为m项任务: Ti1, Ti2, ┅ , Tim(1≤i≤n,故共有n×m个任务), 要把这些任务安排到m台机器上进行加工。 如果任务的安排满足下列3个条件, 则称该安排为流水作业调度: 1. 每个作业i的第j项任务Tij (1≤i≤n, 1≤j≤

2327

从开票数据到 ML81N 一键过账:用 ABAP BAPI 批量创建 Service Entry Sheet 的落地方案

摘要:SAP ESM场景中,服务履约确认通常通过ML81N事务码创建服务条目表(SES)完成。本文介绍如何基于开票数据(VBRK/VBRP)自动生成SES:首先通过BAPI_PO_GETDETAIL获取采购订单服务行结构,然后使用BAPI_ENTRYSHEET_CREATE创建SES并覆盖开票数量与金额,最后调用BAPI_ENTRYSHEET_RELEASE自动释放。解决方案包含ALV交互界面、批量处理逻辑和结果跳转功能,实现从人工录入到自动化处理的转变。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 327

流水作业调度算法c语言,算法笔记动态规划流水作业调度问题与Johnson法则

《算法笔记动态规划流水作业调度问题与Johnson法则》由会员分享,可在线阅读,更多相关《算法笔记动态规划流水作业调度问题与Johnson法则(12页珍藏版)》请在人人文库网上搜索。1、0018算法笔记【动态规划】流水作业调度问题与Johnson法则1、问题描述:n个作业1,2,n要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工...

weixin_39672572的博客 750

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Johnson法则——流水作业调度——动态规划

流水作业调度问题(不能直接使用动态规划法的例子) 流水作业调度的定义: 设有n个作业,每一个作业i均被分解为m项任务: Ti1, Ti2, ┅ , Tim(1≤i≤n,故共有n×m个任务), 要把这些任务安排到m台机器上进行加工。 如果任务的安排满足

ll365594480的专栏 3298

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

流水作业调度问题的算法设计与分析PPT+讲稿

如图是最优子结构的证明,这段证明不是很好理解,简单来说就是要证明问题的最优解包含子问题的最优解就行了,那么这里的证明思路是先假设一个最优调度,对于他的子调度T’,因为T(S,t)被定义为是完成S中作业所需的最短时间记为T(S,t),所以有T’>=T(S, bπ1),那么如果这个子调度这里不是最优解的话即T’>T(S, bπ1),会得出aπ1+T’ > aπ1+T(S, bπ1)即原来假设的最优调度不符和最优调度的标准,矛盾,从而推出 T’是一定等于T(S, bπ1),即这个子调度也是最优调度。

XLYcmy的博客 833

《算法设计与分析》--流水作业调度随笔

转自:https://blog.csdn.net/hlk_1135/article/details/53872064 n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。 目标:确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 题目...

qq_40903237的博客 575

流水作业调度问题详解:Johnson法则、代码实现与排产应用

调度算法是运筹学与生产管理中的核心基础,尤其在制造业排产和任务调度场景中,如何合理安排工序顺序直接决定设备利用率与订单交付周期。流水作业调度问题作为典型的组合优化问题,要求在给定机器序列下寻找最小化总完工时间的加工顺序。针对两台机器的特殊情形,Johnson法则提供了多项式时间的精确解法,通过将工件按加工时间特征分组、排序并合并,即可得到最优调度方案。该法则不仅适用于车间作业排序,也可推广至虚拟机器降维处理特定三台机器问题,并为遗传算法等元启发式方法提供高质量初始解。理解Johnson法则的适用边界、交换论

weixin_33826609的博客 315

流水作业

王晓东的《计算机算法设计与分析》上这一节我看的云里雾里,数学公式让我眼花缭乱。但是读懂数学公式的推导过程并不是最重要的事情。重要的是解题的思路! 我读懂了“流水作业”的题目要求,以及最优子结构性质 动态规划——流水作业调度问题 这里有流水作业的具体实例,很好地展示了自底向上的动规过程,C++代码 0018算法笔记——【动态规划】流水作业调度问题与John...

weixin_30487701的博客 270
上一篇: JFrame 的层次结构 及 背景设置说明
下一篇: 动态规划-3.9 0-1背包问题
SL_World
SL_World 领域专家: 算法与数据结构技术领域 领域专家: 算法与数据结构技术领域
博客等级 码龄10年 1034粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SL_World

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值