3.9 流水作业调度问题

news2024/11/27 18:33:13

 


 

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

 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,并且作业的加工时间都为正整数。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go test 包外测试

之前文章有介绍过 go test coverage 单测覆盖率 和Go test基础用法&#xff0c;今天这里主要介绍 go 单测中比较特殊的一种场景&#xff1a;包外测试。初次看到这个名字&#xff0c;我还以为就是单独创建一个新目录&#xff0c;所有的单测用例统一都汇总到这个目录下&#xff0…

【P48】JMeter 断言持续时间(Duration Assertion)

文章目录 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明二、测试计划设计 一、断言持续时间&#xff08;Duration Assertion&#xff09;参数说明 可以控制取样器的执行是否超过某个时间&#xff0c;如果超时则报错&#xff0c;持续时间断言器也叫超时…

21天学会C++:Day6----内联函数

CSDN的uu们&#xff0c;大家好。这里是C入门的第六讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 知识点讲解 2.1 内联函数的使用 2.2 内联函数的特性 2.2 …

强大Excel 插件 Zbrainsoft Dose for Excel 3.6.2 Crack

强大的 Excel 插件 Zbrainsoft Dose for Excel 3.6.2 如果您厌倦了在Excel中消除重复的行&#xff0c;比较工作表或执行困难的活动&#xff0c;那么Dose for Excel是您需要的强大便捷解决方案&#xff0c;只需单击几下即可将所有这些复杂的杂务简化。它具有 100 多个强大的新功…

pytorch实战 -- 自动微分

autograd——自动求导系统 import torch torch.manual_seed(7) <torch._C.Generator at 0x7f3c1f9e0490> torch.autograd.backward(tensors, grad_tensorsNone, retain_graphNone, create_graphFalse) 功能&#xff1a;自动求取梯度 tensors&#xff1a;用于求导的张量&…

axios-CancelToken方法取消请求-控制多次同样api调用取消上一次接口调用

前言 开发当中看到了axios取消方法&#xff0c;经过查阅&#xff0c;axios这个包是提供了取消请求的方法的。 移动端当是tab栏类的页面&#xff0c;或者是下拉刷新和上拉加载是一个接口是&#xff0c;会出现20条情况&#xff08;接口调用2次&#xff09;。 pc端同一个按钮&am…

【欢迎您,xxx--JavaScript】

login.html <body><form action"index.html">用户名&#xff1a;<input type"text" name"usname"><input type"submit" value"登录"></form> </body> index.html <body><di…

BERT在GLUE数据集构建任务

0 Introduction 谷歌开源的BERT项目在Github上&#xff0c;视频讲解可以参考B站上的一个视频 1 GLUE部分基准数据集介绍 GLUE数据集官网GLUE数据集下载&#xff0c;建议下载运行这个download_glue_data.py文件进行数据集的下载&#xff0c;如果链接无法打开&#xff0c;运行…

七、Gitee码云的注册及使用(二)

1、创建远程仓库 (1)登录Gitee.com&#xff0c;点击右上角 号&#xff0c;再点击新建仓库。 (2)填写仓库名称&#xff0c;路径&#xff0c;仓库介绍 (3)选择是否开源 (4)初始化仓库 开源许可证&#xff1a;主要包括开源是否可以随意转载&#xff0c;开源但不能商业使用&…

yolov8改进大作战,开箱即用,提供yolov8魔术师专栏代码

1.yolov8魔术师专栏介绍 开箱即用&#xff1a;提供 yolov8魔术师专栏 代码&#xff0c;方便直接使用&#xff0c;无需自己重新添加引起的一些bug问题&#xff1a; https://blog.csdn.net/m0_63774211/category_12289773.html?spm1001.2014.3001.5482 专栏内容如下&#xff…

【深入浅出Spring Security(五)】自定义过滤器进行前后端登录认证

自定义过滤器 一、自定义过滤器自定义登录认证过滤器自定义 LoginFilter配置 LoginFilter测试 二、总结 一、自定义过滤器 在【深入浅出Spring Security&#xff08;二&#xff09;】Spring Security的实现原理 中小编阐述了默认加载的过滤器&#xff0c;里面有些过滤器有时并…

OpenGL实现第一个窗口-三角形

1.简介 此代码是基于QtOpenGL实现的&#xff0c;但是大部分的代码是OpenGL&#xff0c;Qt封装了一些类&#xff0c;方便使用。 2.准备工作 QOpenGLWidget提供了三个便捷的虚函数&#xff0c;可以重写&#xff0c;用来重写实现典型的OpenGL任务。不需要GLFW。 paintGL&#…

【C语言】Visual Studio社区版安装配置环境(保姆级图文)

目录 1. 官网下载社区版2. 选择安装项目2.1 点击使用C的桌面开发2.2 语言包选择简体中文2.3 设置安装位置 3. 创建新项目3.1 点击创建新项目3.2 点击空项目&#xff0c;下一步3.3 设置项目名称路径3.4 创建项目 4. 测试例程总结 欢迎关注 『C语言』 系列&#xff0c;持续更新中…

代码随想录 二叉树 Java (一)

文章目录 &#xff08;简单&#xff09;144. 二叉树的前序遍历&#xff08;简单&#xff09;94. 二叉树的中序遍历&#xff08;简单&#xff09;145. 二叉树的后序遍历二叉树的统一遍历方法&#xff08;参考代码随想录&#xff09;&#xff08;中等&#xff09;102. 二叉树的层…

横岗茂盛村旧改,已立项,一期已拆平。

项目位于龙岗区横岗街道红棉路与茂盛路交汇处&#xff0c;距离轨道3号线横岗站约700米。 茂盛片区城市更新单元规划&#xff08;草案&#xff09;已经在近日公示&#xff0c;该旧改被纳入《2012年深圳市城市更新单元计划第五批计划》&#xff0c;2019年曾被暂停&#xff0c;20…

Redis实战14-分布式锁基本原理和不同实现方式对比

在上一篇文章中&#xff0c;我们知道了&#xff0c;当在集群环境下&#xff0c;synchronized关键字实现的JVM级别锁会失效的。那么怎么解决这个问题呢&#xff1f;我们可以使用分布式锁来解决。本文咱们就来介绍分布式锁基本原理以及不同实现方式对比。 我们先来回顾&#xff…

【深度学习】混合精度训练与显存分析

混合精度训练与显存分析 ​ 关于参数精度的介绍可以见文章https://zhuanlan.zhihu.com/p/604338403 相关博客 【深度学习】混合精度训练与显存分析 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoningin Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是&#xff0c;我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

2023 更新版:苏生不惑开发过的那些原创工具和脚本

苏生不惑第431 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 4年来苏生不惑这个公众号已经写了400多篇原创文章&#xff0c;去年分享过文章更新版&#xff1a;整理下苏生不惑开发过的那些工具和脚本 &#xff0c;今年再更新下我开发过的原创工具…

【Python开发】FastAPI 07:Depends 依赖注入

在 FastAPI 中&#xff0c;Depends 是一个依赖注入系统&#xff0c;用于注入应用程序中所需的依赖项&#xff0c;通过 Depends&#xff0c;我们可以轻松地将依赖项注入到 FastAPI 路由函数中。简单来说&#xff0c;Depends 依赖注入的目的就是将代码重复最小&#xff01; 目录 …