多機排程問題
阿新 • • 發佈:2018-12-12
設有n個獨立的作業{1,2,…,n},由m臺相同的機器進行加工處理。作業i所需的處理時間為ti。現約定,每個作業均可在任何一臺機器上加工處理,但未完工前不允許中斷處理。作業不能拆分成更小的子作業。
現要求給出一種作業排程方案,使所給的n個作業在儘可能短的時間內由m臺機器加工處理完成。
NP難問題。
想法:儘可能的使每個機器的工作時間趨向一致,所以用最長時間的作業去填當前工作時間最短的機器(即最長處理時間作業優先)。
可以用貪心策略取得近似解。
當n<=m,直接分配給n個機器。
當n>m,將作業按作業時間大到小排序,然後按此順序安排給空閒的機器
#include <cstdio> #include <stdlib.h> #include <algorithm> using namespace std; int cmp(const void* a, const void* b) { return *(int*)b - *(int*)a; } int main() { int t,n,m; scanf("%d", &t); for( int i = 1; i <= t; i++ ) { scanf("%d%d",&n,&m); int operition[n], machine[m]; for( int j = 0; j < m; j++ ) machine[j] = 0; for( int j = 0; j < n; j++ ) { scanf("%d", &operition[j]); } qsort(operition,n, sizeof(operition[0]), cmp); int j = 0; int m_index = 0; while(j < n) { machine[m_index] += operition[j++]; //將作業分給空閒的機器 for( int k = 0; k < m; k++ ) //找出總工作時間最短的機器,即下一個空閒的機器 if( machine[m_index] > machine[k]) m_index = k; } int mtime = machine[0]; for( int k = 0; k < m; k++ ) if( mtime < machine[k]) mtime = machine[k]; printf("Case %d: %d\n",i,mtime); } return 0; }