多机调度问题:
有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;
}