我有一个m个处理器(列)和n个任务(行)的2d矩阵,矩阵填充了每个进程在处理器上运行所需的时间,我需要找到运行这n个任务的最佳时间m个处理器。
答案 0 :(得分:1)
所描述的问题属于并行机器调度问题的类别 此外,由于每个任务在不同的处理器上花费不同的时间,因此该问题称为统一机器调度问题。
这种问题非常强NP,因此没有多项式时间算法。因此,除非矩阵非常小,因为复杂性类似于O( n ^ m )
,否则实际上不鼓励采用蛮力方法。
话虽这么说,通过使用混合整数线性规划(MILP)并使用最好的线性求解器(如Cplex或Gurobi)解决它,最佳方法对于不那么大的矩阵可能是可行的(我几乎不认为像开源解算器那样LP-solve可以处理超出一定大小的问题。)
here描述了适用于此问题的MILP模型示例。
然而,鉴于它们的复杂性,这种问题通常使用启发式/元启发式解决,因此无法确保达到最佳解决方案。无论如何,一个好的贪婪算法,然后进行良好的局部搜索以改善贪婪的解决方案,可以非常接近最优解。
编辑:
一种可能的暴力方法是计算所有可能的分配组合TASK-PROCESSOR,然后计算完工时间。 Here's an example in C/C++
答案 1 :(得分:0)
首先计算完成所有处理所需的总线性时间(加上所有任务的持续时间)。
现在将其除以一个或多个处理器m
。
这是您的目标平均时间。您希望找到每个处理器的持续时间组合,其总和尽可能接近此数字
最基本的方法是:
avg = <the average from earlier>
list = <all jobs>
FOR i = 0 to m
WHILE duration(processor[i]) < avg:
processor[i].add(longest lasting job in `list` that will keep the time less than `avg`
这将在最后留下一些工作,将最长的工作添加到最短的处理器时间,直到list