3.9 流水作业调度问题

 


 

  •  博主简介:一个爱打游戏的计算机专业学生
  • 博主主页: @夏驰和徐策
  • 所属专栏:算法设计与分析

 1.我对流水调度问题的理解

流水作业调度问题是动态规划中的一个经典问题,它涉及将一系列作业分配给多个工作站以最小化总完成时间。该问题的目标是确定作业的最优调度顺序,以使得所有作业的完成时间最小。

下面是该问题的一般描述和解决步骤:

1. 问题描述:
   - 给定n个作业和m个工作站,每个作业有一个处理时间(ti)和一个工作站的要求(wj)。
   - 每个工作站一次只能处理一个作业,且每个作业只能分配给一个工作站。
   - 每个工作站在完成作业后会空闲,可以接受下一个作业。

2. 动态规划解决步骤:
   - 定义状态:首先定义问题的状态。可以使用一个二维数组dp[i][j]表示前i个作业分配给j个工作站时的最小完成时间。
   - 状态转移方程:根据最优子结构性质,可以推导出状态转移方程,即递推关系,来计算dp[i][j]。
   - 边界条件:确定边界条件,如dp[0][j]和dp[i][0]的初始值。
   - 递推计算:利用状态转移方程和边界条件,通过递推计算填充整个dp数组。
   - 最优解的构造:根据dp数组中的最优值,逆向追溯得到最优解的调度顺序。

3. 时间复杂度:
   - 动态规划算法的时间复杂度为O(nm),其中n是作业的数量,m是工作站的数量。

在流水作业调度问题中,关键是确定合适的状态定义和状态转移方程,以及正确处理边界条件。同时,根据实际情况,可能需要考虑其他约束条件,如工作站的容量限制或作业之间的关联关系等。因此,在解决流水作业调度问题时,需要综合考虑问题的特点和约束条件,设计合理的动态规划算法来求解最优调度方案。

 

 

 1.最优子结构性质的证明:

要证明流水作业调度问题具有最优子结构性质,需要证明以下两个条件:

1. 最优子结构性质:如果一个问题的最优解包含了子问题的最优解,那么该问题具有最优子结构性质。

2. 子问题的最优解可以用来构造原问题的最优解。

下面是对流水作业调度问题的最优子结构性质的证明:

假设存在一个最优解J,它包含了作业序列J1, J2, ..., Jn的最优调度方案。我们将J分成两个部分,J1, J2, ..., Jk和Jk+1, Jk+2, ..., Jn,其中1 ≤ k ≤ n-1。

现在考虑子问题,即将J1, J2, ..., Jk和Jk+1, Jk+2, ..., Jn分别调度在两个不同的流水线上。假设存在另一个调度方案J',它的完成时间小于J的完成时间。

由于J'是一个最优解,那么J'中的子序列J1, J2, ..., Jk和Jk+1, Jk+2, ..., Jn的调度方案也必须是最优的。否则,我们可以通过替换J'中的这两个子序列的调度方案,得到一个更优的调度方案。

根据最优子结构的定义,我们可以使用子问题的最优解来构造原问题的最优解。假设我们知道了子问题J1, J2, ..., Jk和Jk+1, Jk+2, ..., Jn的最优调度方案。我们可以将两个子问题的调度方案合并,形成一个新的调度方案,即将J1, J2, ..., Jk的调度安排在第一个流水线上,将Jk+1, Jk+2, ..., Jn的调度安排在第二个流水线上。这样,我们就得到了原问题J的最优调度方案。

综上所述,流水作业调度问题具有最优子结构性质。这意味着我们可以通过解决子问题的最优解来构造原问题的最优解。这是使用动态规划等方法求解流水作业调度问题的关键性质。

 

 

 3.流水作业调度的Johnson法则

 我的理解:

Johnson法则是一种常用于解决流水作业调度问题的启发式算法。它通过考虑作业的处理时间和机器之间的处理顺序,来确定作业的最佳调度顺序。

Johnson法则适用于两台机器的情况下,每个作业需要在这两台机器上按照一定顺序进行加工。下面是Johnson法则的基本步骤:

1. 首先,对于每个作业,将其处理时间分为两个部分:一个部分是在第一台机器上的处理时间,另一个部分是在第二台机器上的处理时间。

2. 接下来,计算每个作业在第一台机器上的处理时间和在第二台机器上的处理时间之和,并将作业按照这个总时间进行排序。

3. 根据排序结果,选择处理时间最短的作业,并将其安排在两台机器之间进行加工。

4. 不断重复上述步骤,选择处理时间最短的作业并进行安排,直到所有作业都被调度完毕。

Johnson法则的核心思想是通过优先处理处理时间较短的作业来减少整体的加工时间。它可以有效地降低作业的总处理时间,并提高生产效率。

需要注意的是,Johnson法则适用于只有两台机器的情况,并且要求作业的处理时间是可测量且可比较的。对于多台机器的情况,可以考虑其他调度算法来解决流水作业调度问题。

4.算法描述

Johnson法则是一种用于解决流水作业调度问题的启发式算法,适用于具有两台机器的情况。该算法通过考虑作业的处理时间和机器之间的处理顺序,来确定作业的最佳调度顺序。

算法的基本描述如下:

1. 输入:一组作业列表,每个作业包含两个处理时间,分别表示在两台机器上的加工时间。

2. 初始化两个空的机器工作队列,分别表示第一台机器和第二台机器。

3. 对于每个作业,计算其在两台机器上的加工时间之和,并将作业按照这个总时间进行排序。

4. 选择处理时间最短的作业,并根据其在两台机器上的加工时间来确定加工顺序:

   - 如果第一台机器上的加工时间小于等于第二台机器上的加工时间,则将该作业添加到第一台机器的工作队列中。
   - 否则,将该作业添加到第二台机器的工作队列中。

5. 重复步骤4,直到所有作业都被调度完毕。

6. 输出最终的作业调度顺序。

Johnson法则的关键在于通过优先处理处理时间较短的作业来减少整体的加工时间。通过动态地选择作业的加工顺序,可以达到最小化作业的总处理时间的目标。

需要注意的是,Johnson法则只适用于两台机器的情况,并且要求作业的处理时间是可测量且可比较的。对于多台机器的情况,需要使用其他调度算法来解决流水作业调度问题。

 5.算法复杂性分析

最坏情况,Flowshop所需的计算时间O(nlogn),所需空间显然位O(n)。

6.算法实现

源代码:

#include <stdio.h>
#define MAX_JOBS 100

int min(int a, int b) {
    return (a < b) ? a : b;
}

void findOptimalSchedule(int n, int processingTime[][2], int schedule[]) {
    int dp[MAX_JOBS][2] = {0};
    dp[0][0] = processingTime[0][0];
    dp[0][1] = dp[0][0] + processingTime[0][1];

    for (int i = 1; i < n; i++) {
        dp[i][0] = dp[i-1][0] + processingTime[i][0];
        dp[i][1] = min(dp[i][0] + processingTime[i][1], dp[i-1][1] + processingTime[i][1]);
    }

    int j = n - 1;
    for (int i = n - 1; i >= 0; i--) {
        if (j == 0) {
            schedule[j] = 1;
            break;
        }
        if (dp[i][0] + processingTime[j][0] <= dp[i][1] + processingTime[j][1]) {
            schedule[j] = 1;
            j--;
        }
    }
}

int main() {
    int n; // 作业数量
    int processingTime[MAX_JOBS][2]; // 作业的加工时间
    int schedule[MAX_JOBS]; // 最优调度顺序

    printf("Enter the number of jobs: ");
    scanf("%d", &n);

    printf("Enter the processing times:\n");
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &processingTime[i][0], &processingTime[i][1]);
    }

    findOptimalSchedule(n, processingTime, schedule);

    printf("Optimal schedule: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", schedule[i]);
    }
    printf("\n");

    return 0;
}

这段代码实现了动态规划算法来求解流水作业调度问题。它使用一个二维数组 `dp` 来保存每个作业在两台机器上的最优加工时间,然后根据最优加工时间来确定最优调度顺序。最后,将最优调度顺序打印出来。

你可以根据自己的输入数据测试这段代码,并查看输出的最优调度顺序。请注意,这里假设输入的作业数量不超过100,并且作业的加工时间都为正整数。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

练习:有限状态机测试

练习&#xff1a;有限状态机测试 1 FSM 示例 在练习中&#xff0c;我们将使用两个 FSM。 两者都有输入字母 X {a, b} 和输出字母 Y {0,1}。 第一个 FSM 将称为 M1 并由以下有向图表示。 对于上面给出的每个 FSM Mi&#xff1a; 1.确定以下值&#xff0c;显示您的工作。 (a…

内存对齐原则

struct &#xff08;1&#xff09;结构体第一个数据成员放在offset为0的地方&#xff0c;后面每个成员相对于结构体首地址的偏移量&#xff08;offset&#xff09;都是成员大小&#xff08;该变量类型所占字节&#xff09;的整数倍&#xff0c;如有需要编译器会在成员之间加上填…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术&#xff0c;非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况&#xff0c;及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…

研报精选230528

目录 【行业230528华金证券】传媒行业深度研究&#xff1a;AIGC最新应用与场景研究 【行业230528国海证券】电动船舶行业深度报告&#xff1a;绿色智能大势已至&#xff0c;驶向电化百亿蓝海 【行业230528华西证券】纺织服装行业周报&#xff1a;5月增长放缓无碍中长期出清逻辑…

Vue.js 中的过滤器和计算属性

Vue.js 中的过滤器和计算属性 Vue.js 是一款流行的 JavaScript 框架&#xff0c;它提供了一种简单而灵活的方式来构建交互式 Web 应用程序。在 Vue.js 中&#xff0c;过滤器和计算属性是两个常用的概念。它们可以帮助开发者更方便地处理数据&#xff0c;提高代码的可读性和可维…

【Linux】进程状态与进程优先级

目录 一、什么是进程二、进程状态1、Linux下的进程状态2、两个特殊进程1、僵尸进程2、孤儿进程 三、进程优先级 一、什么是进程 进程就是程序的一个执行实例&#xff0c;也就是正在执行的程序&#xff0c;然后由操作系统帮助我们将程序转化为进程&#xff0c;完成特定的任务。…

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因,如何修正这些坐标偏差?

山区特殊场景的倾斜摄影三维模型数据出现几何坐标偏差原因&#xff0c;如何修正这些坐标偏差&#xff1f; 山区倾斜摄影三维模型数据出现几何坐标偏差的原因可能有很多&#xff0c;其中一些常见的原因包括不同地图投影系统之间的转换问题、GPS定位误差、测量设备精度问题、摄影…

AI+边缘,是如何加速制造转型的?

在现代工业中&#xff0c;提起智慧工厂、智能制造有一个经久不衰的话题&#xff0c;那便是IT和OT的融合。 IT&#xff08;Information Technology&#xff09;部门专注于处理数据&#xff0c;整个业务系统需要它来维持运营。而OT&#xff08;Operation Technology&#xff09;…

实战Windows Chrome 0day

遇到挑战跟挫折的时侯&#xff0c;我有一个坚定的信念&#xff0c;我可以断气&#xff0c;但绝不能放弃 漏洞复现 实战Windows Chrome 0day需要满足的条件 第一点是关闭沙箱环境 第一种方式 设置Chrome浏览器的快捷方式 在快捷方式上增加 -no-sandbox 第二种方式 命令行命令…

Studio One6简体中文版全新版本功能详解

Studio One 6是一款强大的音乐编曲软件,可以帮助您使用灵活的和弦轨道功能实现音乐创作。通过新的智能模板、直观的拖放工作流、可定制的用户界面和强大的集成工具&#xff0c;使创建快速而轻松。 无论你选择 Studio One 哪个版本&#xff0c;你都可以得到无限的音轨、通道和插…

微信小程序原生开发功能合集十八:系统主题及自定义主题功能实现

本章实现系统主题监听及相应处理,包括暗黑色、亮色等。并实现自定义主题控制相关功能,可通过菜单进行主题的切换。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: ht…

SpringBoot+Vue 的简历招聘系统

文章目录 1、效果演示2、 前言介绍3、主要技术4 **系统设计**4.1 系统体系结构4.2开发流程设计4.3 数据库设计原则4.4 数据表 5 **系统详细设计**5.1管理员功能模块5.2用户功能模块5.3前台首页功能模块 6、源码获取 1、效果演示 2、 前言介绍 随着科学技术的飞速发展&#xff…

Three.js--》实现3d圣诞贺卡展示模型

目录 项目搭建 初始化three.js基础代码 加载环境模型 设置环境纹理 添加水面并设置阴影效果 实现幽灵小球的运动 实现相机切换和文字切屏 实现漫天星星和爱心样式 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目…

笔试强训8

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 day13 一. 单选 1.下列关于视图的说法错误的是&#xff1a; A 视图是从一个或多个基本表导出的表&#xff0c;它是虚表B 视图一经定义就可以和基本表一样被查询…

SSM 如何使用 Redis 实现缓存?

SSM 如何使用 Redis 实现缓存&#xff1f; Redis 是一个高性能的非关系型数据库&#xff0c;它支持多种数据结构和多种操作&#xff0c;可以用于缓存、队列、计数器等场景。在 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;开发中&#xff0c;Redis 可以用来实现数…

皮卡丘CSRF

1.CSRF&#xff08;get&#xff09; 首先看提示&#xff0c;我们选择用户kobe&#xff0c;密码123456登录 点击修改个人信息&#xff0c;假如用户要把住址改为shanxi 再点击submit&#xff0c;同时用bp抓包&#xff0c;我们可以看到是get请求&#xff0c;数据包含在URL之中 将…

NCI架构-1

1、NFCC和DH通过物理连线相连&#xff0c;物理连线对应为Transport Layer&#xff08;传输层&#xff09;&#xff0c;支持SPI、I2C、UART、USB等&#xff1b; 2、DH中所有和NFC相关的应用程序都可视为DH-NFCEE(EE:Execution Enviroment)&#xff0c;图左的NFCEE模块可运行一些…

Jetson nano之ROS入门 - - 机器人建模与仿真

文章目录 前言一、URDF建模1. URDF语法详解a. robotb. linkc. joint 2. URDF机器人建模实操 二、Xacro宏优化1、 Xacro宏语法详解2、 Xacro建模实操 三、Rviz与Gazebo仿真1、Gazebo集成URDF建模语法基础2、Gazebo集成URDF实操 总结 前言 在ROS中&#xff0c;机器人建模和仿真是…

Android AIDL Callback的使用(配源码)

零、示例说明 本示例&#xff0c;完成的功能是&#xff1a;客户端向服务端注册一个回调&#xff0c;服务端是一个商店shop&#xff0c;当商店里的产品 Product 有变化时&#xff0c;调用回调向通知客户端&#xff0c;什么商品更新了。 一、完整源代码 完整源码链接: https:/…

solr快速上手:配置从mysql同步数据(五)

0. 引言 上一节我们已经配置了新的索引&#xff0c;但是数据还是手动添加的&#xff0c;并没有实现自动从数据库同步&#xff0c;所以这一节&#xff0c;继续来实现从mysql同步数据到solr solr快速上手&#xff1a;solr简介及安装&#xff08;一&#xff09; solr快速上手&a…