1. 程式人生 > >多機排程問題

多機排程問題

設有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;
}