一、題目要求
設有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...