回溯法 最佳排程問題

2021-07-27 04:59:30 字數 1485 閱讀 3800

一、題目要求

設有n個任務由k個可並行工作的機器來完成,完成任務i需要時間為。試設計乙個演算法找出完成這n個任務的最佳排程,使完成全部任務的時間最早。

二、演算法設計與分析:

該演算法可抽象為子集樹回溯演算法,針對特定的任務數和機器數定**空間,對於n個任務和k個機器,

解編碼:(x1,x2,。。。,xn),xi表示給任務i分配的機器編號;

解空間:,s=

三、演算法實現

#define num_task 10

#define num_mac 3

#include #include using namespace std;

void output(int x);

void backtrack(int task);

int gettime(int time_mac);

void output_assign(int best_x);

//所有陣列下標從1開始

int x[num_task + 1];//x[task]表示給任務task分配機器x[task]

int best_x[num_task+1];//儲存最優分配方案

int min_t=int_max;//執行任務所需的最小時間

int t[num_task + 1] = ;//每個任務所需時間

//int t[num_task + 1] = ;//每個任務所需時間

int time_mac[num_mac + 1] = ;//每個機器執行結束的時間

int main()

cout << endl;

cout << "所需要的最小時間為:"

} return max_time;

}void output_assign(int best_x)

}

四、結果分析和總結

3.1 任務數為10,機器數為5,執行結果如下:

3.2 任務數為10,機器數為3,執行結果如下:

3.3 分析總結

本實驗採用子集樹回歸演算法完成最佳排程問題,在不剪枝的情況下,由該問題解空間可知該演算法時間複雜度為n!,當任務數為10的時候需要進行3628800次搜尋,效率極低,採用剪枝操作後演算法效率得到明顯提公升。

最佳排程問題 回溯法

問題描述 假設有n個任務由k個可並行工作的機器來完成。完成任務i需要的時間為ti。試設計乙個演算法找出完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入7 3 2 14 4 16 6 5 3 輸出思路 使用回溯法的演算法框架,回溯法我認為就是深度優先搜尋 選擇 剪枝的乙個過程。待會注意看這裡...

演算法 回溯法解決最佳排程問題

問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...

演算法 回溯法解決最佳排程問題

問題 假設有 n 個任務由 k 個可並行工作的機器來完成。完成任務 i 需要時間為ti 設計完成這 n 個任務的最佳排程演算法,使得完成全部任務的時間最早。演算法設計 從n個作業中找出有最小完成時間和的作業排程,所以批處理作業排程問題的解空間是一棵排列樹。按照回溯法搜尋排列樹的演算法框架,設開始時t...