需要针对包含运行任务时间的2d矩阵的最优解决方案

时间:2012-05-01 17:55:01

标签: c++ algorithm

我有一个m个处理器(列)和n个任务(行)的2d矩阵,矩阵填充了每个进程在处理器上运行所需的时间,我需要找到运行这n个任务的最佳时间m个处理器。

2 个答案:

答案 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

中没有剩余的工作