多機調度問題:
有n個獨立的作業需要在m臺相同的機器上進行加工處理. 作業i需要的加工時間爲ti. 每個作業可以任選一臺機器加工, 但加工結束前不能中斷, 作業不允許拆分.
要求給一種作業調度方案, 使所給的n個作業在儘可能短的時間內完成.
問題分析:
爲什麼是NP問題? (待求證)
問題解答:
採用最長處理時間作業優先的貪心選擇策略可以設計出較好的近似算法
C語言描述:
// 多機調度問題
// @pre: job_time按遞減序排列
// @post:
// @return: 最短時間
int multi_dispatch(int job_time[], int jobs, int machines)
{
// 如果jobs數量<=machines數量, 那麼耗時爲jobs最長時間
if (jobs <= machines)
{
int max = job_time[0];
int i;
for (i=1; i<jobs; i++)
{
if (max < job_time[i])
{
max = job_time[i];
}
}
return max;
}
// 否則採用最長處理時間優先的貪心選擇策略
int *machine_time = (int*)calloc(sizeof(int), machines);
int i=0;
for (i=0; i<jobs; i++)
{
// 選擇最空閒的機器
int machine_no = get_min_index(machine_time, machines);
printf("將job[%d](耗時%3d)分配給機器machine[%d](預計完成時間:%d+%d)\n",
i, job_time[i], machine_no, machine_time[machine_no], job_time[i]);
machine_time[machine_no] += job_time[i];
}
int max=0;
for (i=0; i<machines; i++)
{
if (max < machine_time[i])
{
max = machine_time[i];
}
}
free(machine_time);
return max;
}