批處理作業調度問題 (回溯法)

目錄

一、問題解析

二、實例剖析

三、算法思路

四、代碼實現

結果:

總結


前言

問題】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.pswp.cn/bicheng/16592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16592.shtml
英文地址,請注明出處:http://en.pswp.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): 問題: 在一個系統中,如果對象之間直接調用彼此的方法,就會形成緊密耦合的結構。這樣的耦合使得對象難以獨立地變更和維護,而且…