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

news2024/11/16 11:15:18

目录

一、问题解析

二、实例剖析

三、算法思路

四、代码实现

结果:

总结


前言

问题】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.coloradmin.cn/o/1700563.html

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

相关文章

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

前言 在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 【Unity实战篇 】 | Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 在Unity中经常会用到文本组件的自…

Jmeter插件下载(下载和使用教程)

插件管理器&#xff1a;plugins-manager下载安装和使用 下载&#xff1a; 官网地址&#xff1a;https://jmeter-plugins.org/install/Install/ 步骤1&#xff1a;将下载jmeter-plugins-manager-1.10.jar放到目录apache-jmeter-5.1.1\lib\ext&#xff0c;如下图 步骤2&#x…

《最新出炉》系列入门篇-Python+Playwright自动化测试-42-强大的可视化追踪利器Trace Viewer

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在我们日常执行自动化测试工作的过程中&#xff0c;经常会遇到一些偶发性的bug&#xff0c;但是因为bug是偶发性的&#xff0c;我们不一定每次执行都能复现&#xff0c;所以我…

力扣刷题--747. 至少是其他数字两倍的最大数【简单】

题目描述 给你一个整数数组 nums &#xff0c;其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是&#xff0c;则返回 最大元素的下标 &#xff0c;否则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;n…

Android端 可使用Yolov5训练 路标识别

相信大家对于路标识别&#xff0c;红绿灯识别&#xff0c;图形识别opencv中也是一件烦人的事情&#xff0c;其参数是及其受到现实环境因素的影响的&#xff0c;那么今天我就给大家推荐一种方式&#xff0c;缺点是周期长&#xff0c;但其优点是如果训练效果好久对于环境的各种变…

河南乙级道路与桥梁资质年审材料准备要点解析

河南乙级道路与桥梁资质年审材料准备要点解析如下&#xff1a;河南宽信权经理 一、企业基本情况材料 营业执照副本复印件&#xff1a;确保复印件清晰、完整&#xff0c;并加盖企业公章。 企业章程&#xff1a;提供最新的企业章程&#xff0c;并加盖企业公章。此材料需反映企业…

matepad11和matepad2023区别

​ 华为MatePad11和MatePad2023是华为公司推出的两款平板电脑&#xff0c;它们在处理器、价格和屏幕等方面存在差异。具体分析如下&#xff1a; 处理器 MatePad 11英寸2023款&#xff1a;搭载骁龙865处理器&#xff0c;最高主频为2.84GHz。 MatePad 2023&#xff1a;配备骁…

Android:使用Kotlin搭建MVVM+组件化App架构

一、简介Android MVVM架构模式 请点击查看Android&#xff1a;使用Kotlin搭建MVVM架构模式 二、简介组件化 以前一个项目所有业务代码都在App&#xff08;model&#xff09;里开发&#xff0c;App里按照功能模块分包&#xff0c;例如&#xff1a;首页&#xff08;home&#xff…

58同城前端社招一面挂了,面试总结:coding能力有待提高

总结面试不足&#xff1a;coding能力有待提高&#xff0c;项目对于大厂面试来说不够有亮点&#xff0c;难度不够&#xff0c;对于技术细节不够深入。下周继续加油&#xff0c;噢力给给&#xff01;&#xff01;&#xff01;&#x1f62d;&#x1f62d;&#x1f62d; 面试题 1、…

[Algorihm][简单多状态DP问题][买卖股票的最佳时机含冷冻期][买卖股票的最佳时机含手续费]详细讲解

目录 1.买卖股票的最佳时机含冷冻期1.题目链接买卖股票的最佳时机含冷冻期2.算法原理详解3.代码实现 2.买卖股票的最佳时机含手续费1.题目链接2.算法原理详解3.代码实现 1.买卖股票的最佳时机含冷冻期 1.题目链接 买卖股票的最佳时机含冷冻期 2.算法原理详解 思路&#xff…

Realcome:AI赋能,引领虚拟博主创业新纪元

在数字化浪潮汹涌的时代&#xff0c;一个崭新的科技品牌正在崭露头角——Realcome&#xff0c;一家以AI智能交互服务为核心&#xff0c;为企业提供全方位数字化营销解决方案的科技服务公司。自2021年成立以来&#xff0c;Realcome凭借其前沿的技术和创新的理念&#xff0c;迅速…

漂流瓶挂机项目,聊天脚本赚钱新玩法,号称单机30-50+ (教程+软件)

一、项目简介&#xff1a; 漂流瓶挂机项目主要是通过使用探遇漂流瓶、音麦漂流瓶等聊天软件&#xff0c;为用户提供一个聊天赚钱的平台。男性用户需要充值后才能发送消息&#xff0c;而女性用户则可以通过接收消息赚取分红。男性用户发送给女性用户的消息费用大约在.1-.2元之间…

【openlayers系统学习】4.2Mapbox 样式渲染图层

二、Mapbox 样式渲染图层 显然我们目前的地图需要一些样式。 VectorTile​ 图层的样式与 Vector​ 图层的样式工作方式完全相同。那里描述的样式在这里也适用。 对于这样的地图&#xff0c;创建数据驱动的样式&#xff08;对矢量图层操作&#xff09;非常简单。但矢量切片也用…

自动驾驶技术现状与需求分析

随着科技的不断进步和智能化浪潮的席卷&#xff0c;自动驾驶技术已成为当今交通领域的热点话题。本文旨在深入探讨自动驾驶技术的当前发展状况&#xff0c;并对其未来的市场需求进行细致分析。首先&#xff0c;我们将回顾自动驾驶技术的起源、发展历程以及当前的技术水平&#…

自动驾驶---Perception之IPM图和BEV图

1 前言 IPM&#xff08;Inverse Perspective Mapping&#xff0c;逆透视变换&#xff09;图的历史可以追溯到计算机视觉和图像处理领域的发展。逆透视变换是一种用于消除图像中透视效应的技术&#xff0c;使得原本由于透视产生的形变得以纠正&#xff0c;进而更准确地描述和理解…

早餐店燃气安全岂能马虎?探头选择与年检必须到位

在现代都市生活中&#xff0c;早餐店作为人们日常生活中的重要一环&#xff0c;其安全性问题日益受到人们的关注。其中&#xff0c;燃气泄漏引发的火灾和爆炸事故尤为令人担忧。 因此&#xff0c;点式可燃气体报警器在早餐店中的应用显得尤为重要。 在这篇文章中&#xff0c;…

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型

PyTorch深度学习实战&#xff08;44&#xff09;——基于 DETR 的目标检测模型 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0.…

防止CSRF攻击

防止CSRF攻击 跨站点请求伪造&#xff08;Cross-Site Request Forgery&#xff0c;简称CSRF&#xff09;是一种常见的网络攻击类型。当用户在受信任的站点上通过身份验证后&#xff0c;访问攻击者精心准备的恶意网站、电子邮件、博客、即时消息或程序时&#xff0c;可能会导致…

遥感信息SCI期刊,中科院1区,IF=7+,审稿速度非常快!

一、期刊名称 International Journal of Applied Earth Observation and Geoinformation 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;遥感 影响因子&#xff1a;7.5 中科院分区&#xff1a;1区 三、期刊征稿范围 《国际应用地球观测和地理信息杂志》…

ISCC2024个人挑战赛WP-MISC

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; where is flag 下载附件&#xff0c;解压出pyc&#xff0c;然后到下面网址反编译 python反编译 - 在线工具 记住c&#xff0c;是密文&#xff0c; Key是 k5fg…