需要包含运行任务时间的 2D 矩阵的最佳解决方案

Require an Optimal solution for a 2d matrix containing time for running tasks

本文关键字:2D 最佳 解决方案 时间 包含 运行 任务      更新时间:2023-10-16

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

所描述的问题属于并行计算机调度问题的类别。
此外,由于每个任务在不同的处理器上花费不同的时间,因此该问题称为统一机器调度问题

这类问题具有很强的NP难度,因此没有多项式时间算法。因此,除非矩阵非常小,否则确实不鼓励使用蛮力方法,因为复杂性类似于O( n ^ m )

话虽如此,通过使用混合整数线性规划 (MILP( 并使用 Cplex 或 Gurobi 等最佳线性求解器来解决它,对于不太大的矩阵来说,最佳方法可能是可行的(我几乎不认为像 LP-solve 这样的开源求解器可以处理超出一定大小的问题(。

此处描述了适用于此问题的 MILP 模型示例。

然而,鉴于它们的复杂性,这类问题通常使用启发式/元启发式来解决,因此不确定达到最佳解决方案。无论如何,一个好的贪婪算法,然后加上一个好的局部搜索来改进贪婪解,可以非常接近最优。

编辑:

一种可能的暴力方法是计算任务处理器的所有可能分配组合,然后计算 makespan。下面是 C/C++ 中的一个示例

首先计算完成所有处理所需的总线性时间(将所有任务的持续时间相加(。现在将其除以数字或处理器,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中没有剩余的作业