問題描述:
設有n個獨立的作業,由m台相同的機器進行加工處理。作業i所需的處理時間為t[i]。
任何作業可以在任何一台機器上面加工處理,但未完工之前不允許中斷處理。任何作業不能 拆分成更小的 作業。
要求給出一種作業調度方案,使所給的n個作業在盡可能短的時間內由m台機器加工處理完成。
算法分析:
采用最長處理時間作業優先的貪心選擇策略,可以設計出解多機調度問題較好的近似算法。
分n<=m(作業數小於機器數),n>m(作業數大於機器數)求解。
假定有7個獨立作業,所需處理時間分別為{2,14,4,16,6,5,3},由三台機器M1,M2,M3加工。按照貪心算法產生的作業調度如下圖所示,所需總加工時間為17.
[cpp]
#include<stdio.h>
#define N 7 //作業數
#define M 3 //機器數
int s[M] = {0,0,0};//每台機器當前已分配的作業總耗時
int main(void)
{
int time[N] = {16,14,6,5,4,3,2};//處理時間按從大到小排序
int maxtime = 0;
if(M >= N)
{
maxtime = setwork1(time,N);
}
else
{
maxtime = setwork2(time,N);
}
printf("最多耗費時間%d。",maxtime);
system("PAUSE");
}
//機器數大於待分配作業數
int setwork1(int t[],int n)
{
int i;
for(i=0;i<n;i++)
{
s[i] = t[i];
}
int ma = max(s,N);
return ma;
}
//機器數小於待分配作業數
int setwork2(int t[],int n)
{
int i;
int mi = 0;
for(i=0;i<n;i++)
{
mi = min(M);
printf("%d,時間和最小的機器號為%d.時間和為%d:\n",i,mi,s[mi]);
s[mi] = s[mi]+t[i];
}
int ma = max(s,M);
return ma;
}
//求出目前處理作業的時間和 最小的機器號
int min(int m)
{
int min = 0;
int i;
for(i=1;i<m;i++)
{
if(s[min] > s[i])
{
min = i;
}
}
return min;
}
//求最終結果(最長處理時間)
int max(int s[],int num)
{
int max = s[0];
int i;
for(i=1;i<num;i++)
{
if(max < s[i])
{
max = s[i];
}
}
return max;
}