批处理作业调度问题 (回溯法)

目录

一、问题解析

二、实例剖析

三、算法思路

四、代码实现

结果:

总结


前言

问题】n 个作业{1, 2, …, n}要在两台机器上处理,每个作业必须先由机器 1 处理,再由机器 2 处理,机器 1 处理作业i所需时间为 ai,机器 2 处理作业 i 所需时间为 bi(1 ≤ i ≤ n),批处理作业调度问题(batch-job scheduling problem)要求确定这 n 个作业的最优处理顺序,使得从第 1 个作业在机器 1 上处理开始,到最后一个作业在机器 2 上处理结束所需时间最少。

一、问题解析

想法】显然,批处理作业的一个最优调度应使机器 1 没有空闲时间,且机器 2的空闲时间最小。

  1. 存在一个最优作业调度使得在机器 1 和机器 2 上作业以相同次序完成
  2. 由于是一种作业调度顺序的方案,因此该问题的解空间树是排列树

二、实例剖析

例如,有三个作业{1, 2, 3},在机器 1 上所需的处理时间为(2, 5, 4),在机器 2上所需的处理时间为(3, 2, 1),则存在 6 种可能的调度方案:{(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)},相应的完成时间为{12, 13, 12, 14, 13, 16},最佳调度方案是(1, 2, 3)和(2, 1, 3),最短完成时间为 12。

其他情况如上类似,这里就不再赘述!!

三、算法思路

算法设数组a[n]存储 n 个作业在机器 1 上的处理时间,b[n]存储 n 个作业在机器 2 上的处理时间。设数组x[n]表示 n 个作业批处理的一种调度方案,其中x[i]表示第 i 个处理的作业编号,sum1[n]和sum2[n]保存在调度过程中机器 1 和机器 2的当前完成时间,其中sum1[i]表示在安排第 i 个作业后机器 1 的当前完成时间,sum2[i]表示在安排第 i 个作业后机器 2 的当前完成时间,且根据下式进行更新:

关键点:

⭐sum1[i] = sum1[i-1] + a[ x[i] ]

⭐sum2[i] = max(sum1[i], sum2[i-1]) +b[ x[i] ]

算法:回溯法求解批处理调度BatchJob

输入:n 个作业在机器 1 上的处理时间 a[n],在机器 2 上的处理时间 b[n]

输出:最短完成时间bestTime,最优调度序列 x[n]

1. 初始化解向量 x[n] = {-1};最短完成时间bestTime = MAX;

2. 初始化调度方案中机器 1 和机器 2 的完成时间:

sum1[n] = sum2[n] = {0}; i = 0;

3. 当 i >= 0 时调度第 i 个作业:

3.1 依次考察每一个作业,如果作业 x[i] 尚未处理,则转步骤 3.2,

否则尝试下一个作业,即 x[i]++;

3.2 处理作业 x[i]:

3.2.1  sum1[i]=sum1[i-1]+ a[x[i]];

3.2.2  sum2[i]=max{sum1[i], sum2[i-1]}+ b[x[i]];

四、代码实现

#include <iostream>
#include <vector>
#include <climits>using namespace std;int bestTime = INT_MAX;
vector<int> bestSchedule;
vector<int> currentSchedule;void backtrack(vector<int>& a, vector<int>& b, vector<bool>& processed, vector<int>& sum1, vector<int>& sum2, int index, int n) {if (index == n) {if (sum2[n-1] < bestTime) {bestTime = sum2[n-1];bestSchedule = currentSchedule;}return;}for (int i = 0; i < n; i++) {if (!processed[i]) {processed[i] = true;currentSchedule[index] = i;sum1[index] = (index > 0 ? sum1[index-1] : 0) + a[i];sum2[index] = max(sum1[index], (index > 0 ? sum2[index-1] : 0)) + b[i];backtrack(a, b, processed, sum1, sum2, index + 1, n);processed[i] = false;}}
}int batchJobScheduling(vector<int>& a, vector<int>& b) {int n = a.size();vector<bool> processed(n, false);vector<int> sum1(n, 0);vector<int> sum2(n, 0);currentSchedule.resize(n);backtrack(a, b, processed, sum1, sum2, 0, n);return bestTime;
}int main() {vector<int> a = {2, 3, 1};vector<int> b = {3, 1, 2};int result = batchJobScheduling(a, b);cout << "Best processing time: " << result << endl;cout << "Best schedule: ";for (int job : bestSchedule) {cout << job << " ";}cout << endl;return 0;
}

结果:

第一行表示:所需的最短时间;第二行表示:最好的安排次序

总结

算法时间复杂度高,时间消耗太多了,在ACM上一直会超时,不如贪心法效率高。我是一个小菜鸡,欢迎各路大神批评指正!!

 

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

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

相关文章

【Linux-时间管理和内核定时器】

Linux-时间管理和内核定时器 ■ 设置系统节拍率■ 高节拍率和低节拍率的优缺点&#xff1a;■ jiffies 系统节拍数■ get_jiffies_64 这个函数可以获取 jiffies_64 的值■ 处理绕回■ 使用 jiffies 判断超时 ■ jiffies 和 ms、 us、 ns 之间的转换函数在这里插入代码片■ 内核…

QT常量中有换行符

头文件添加&#xff1a; #pragma execution_character_set("utf-8")

随笔之职场:追求技术悲惨之路

技术与职场的反思 作为一名拥有十几年技术开发经验的专业人士&#xff0c;我曾坚信技术能力的提升是职场成功的关键。我专注于WebGIS开发&#xff0c;不断学习新技术&#xff0c;追求技术的深度和广度。然而&#xff0c;随着时间的推移&#xff0c;我逐渐意识到&#xff0c;技…

Java中的类加载器

类加载器 1.什么是类加载器&#xff1f; 启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff1a;这是JVM自带的类加载器&#xff0c;负责加载Java的核心类库&#xff0c;如rt.jar等。由于安全原因&#xff0c;启动类加载器加载的类不能被其他类加载器加载的类…

数据库(8)——DML数据操作

增添数据 给指定字段添加数据 INSERT INTO 表名 (字段名1&#xff0c;字段名2,...)VALUES(值1,值2...); 没有的添加的字段默认为NULL。 给全部字段添加数据 INSERT INTO 表名 VALUE (值1,值2,....值n); 此时值的顺序对应表中字段的顺序 批量添加数据 INSERT INTO 表名(字段1,…

ssm143校园一卡通系统软件的设计与实现+jsp

校园一卡通系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园一卡通系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间…

聊聊变异测试

软件质量保障 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。 1. 介绍 有句话说&#xff1a;证实容易&#xff0c;证伪难。正如测试一样&#xff0c;证明缺陷存在容易&#xff0c;但证明不存在缺陷难。而变异测试颠覆了这一原则&#xff0c;如果我们知道存在缺陷&am…

2024-5-26

今日安排&#xff1a; 后面还是按照安排来了&#xff0c;CTF 真不是我能玩的… 重新开始审计 nf_tables 源码&#xff0c;并在审计的过程中复现历史漏洞【 && iptables 相关学习】♥♥♥♥♥实验报告 ♥♥♥♥♥复现 CTF 相关题目♥♥♥♥学习 winpwn♥♥♥♥mount 的…

CAD二次开发(6)-用户交互之选择集

1. 简单测试 测试让选中的图形描红 [CommandMethod("SeleDemo")]public void SeleDemo(){Database db HostApplicationServices.WorkingDatabase;Editor ed Application.DocumentManager.MdiActiveDocument.Editor;PromptSelectionResult psr ed.GetSelection();…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

mars3d的V2版本的Video2D与V3版本的Video2D实现数据快速迁移

场景&#xff1a; 目前是v2和v3的两个相机视角的不同格式&#xff0c;在Mars3d的V2的旧数据想可以快速迁移到V3版本。 V2版本的数据&#xff1a; {"camera": {"fov": 1.0471975511965976,"dis": 20,"stRotation": 0,"showFrust…

基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)

癫痫是一种由大脑神经元突发性异常放电导致的大脑功能性障碍疾病。据世界卫生组织统计&#xff0c;全球约有7000万人患有癫痫。癫痫患者在发病时呈现肌肉抽搐、呼吸困难、意识丧失等症状。由于癫痫发作的偶然性&#xff0c;患者极有可能在高空、驾驶、游泳等危险情况下发病并丧…

2024最新 Jenkins + Docker实战教程(二) - Jenkins相关配置

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

异常有什么,异常类有什么

在Java中&#xff0c;异常&#xff08;Exception&#xff09;是一种在程序运行过程中出现的不正常情况。异常机制提供了一种从错误中恢复的途径。异常分为两大类&#xff1a;检查异常&#xff08;Checked Exception&#xff09;和运行时异常&#xff08;Runtime Exception&…

C语言代码错误(一)

今天在写选择排序代码时&#xff0c;在测试数据发现不能显示结果 1、代码如下&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的下标int buf; // 互换数据时的临时变量int n;printf("你想输入多少个数据n:\n…

C++之lambda函数与std::bind区别及用法实例(二百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

202212青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为 5 次, 则 n 的值可能为?() A :5 B :15 C :30 D :35 正确答案:C 试题解析: 对分查找最多查找次数m与个数之间 n 的关系是: n 对 2 的对数的取整后加 1,现在最多查找次数是…

LabVIEW如何实现多张图拼接

在LabVIEW中实现相机多次拍摄进行拼接的过程&#xff0c;可以分为以下几个步骤&#xff1a;设置相机参数、控制相机拍摄、图像处理与拼接、显示和保存结果。以下是一个详细的实现方案&#xff1a; 1. 设置相机参数 首先需要配置相机的参数&#xff0c;例如分辨率、曝光时间、…

Java Swing + MySQL图书借阅管理系统

系列文章目录 Java Swing MySQL 图书管理系统 Java Swing MySQL 图书借阅管理系统 文章目录 系列文章目录前言一、项目展示二、部分代码1.Book2.BookDao3.DBUtil4.BookAddInternalFrame5.Login 三、配置 前言 项目是使用Java swing开发&#xff0c;界面设计比较简洁、适合作…

Qt中信号和槽解决了什么问题

信号和槽解决了什么问题 Qt 中的信号和槽机制是一种用于处理对象之间通信的重要机制,它解决了以下几个问题: 对象之间的解耦(Decoupling): 问题: 在一个系统中,如果对象之间直接调用彼此的方法,就会形成紧密耦合的结构。这样的耦合使得对象难以独立地变更和维护,而且…