問題描述
假設有n個任務由k個可並行工作的機器來完成。完成任務i需要的時間為ti。試設計乙個演算法找出完成這n個任務的最佳排程,使得完成全部任務的時間最早。
輸入
7 3輸出思路:2 14 4 16 6 5 3
使用回溯法的演算法框架,回溯法我認為就是深度優先搜尋+選擇+剪枝的乙個過程。
待會注意看這裡,mt 陣列表示每個機器需要執行的時間,初始也就是0
mt[i]
+=arr_task[task];if
(mt[i]
//剪枝,因為如果該機器的要執行的時間已經大於當前最優時間,就不用繼續遞迴了,
//因為已經不可能是最優的了
mt[i]
-=arr_task[task]
;
先讓這個機器執行這個任務(先遍歷樹的左節點),然後以此為條件進行下乙個任務的遞迴(繼續遍歷),同時再恢復狀態(回溯),這樣可以把所有的可能都覆蓋到。
c++ **
#include
#include
#define n 100
using
namespace std;
//n表示任務數 k表示機器數
int n,k;
//用於儲存每個任務的執行時間
int arr_task[n]
;//用於儲存每個機器執行完任務需要的時間,預設是0
int mt[n]
;//最優值
int besttime=
100000
;//獲取這三個機器的最大需要執行時間,也就是看看這三颱什麼時候都結束
intgetmaxtime
(int mt)
}return maxtime;
}void
backtrack
(int task)
}else
mt[i]
-=arr_task[task];}
}}intmain()
backtrack(0
);cout << besttime << endl;
return0;
}
回溯法 最佳排程問題
一 題目要求 設有n個任務由k個可並行工作的機器來完成,完成任務i需要時間為。試設計乙個演算法找出完成這n個任務的最佳排程,使完成全部任務的時間最早。二 演算法設計與分析 該演算法可抽象為子集樹回溯演算法,針對特定的任務數和機器數定 空間,對於n個任務和k個機器,解編碼 x1,x2,xn xi表示給...
演算法 回溯法解決最佳排程問題
問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...
演算法 回溯法解決最佳排程問題
問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...