我有 m 机器和 n 任务。有一个成本矩阵 A ,其中 Aij 是在机器 i 上执行任务 j 的成本。每项任务必须分配给一台机器,但每台机器可以接受多项任务。
我的问题是找到将任务分配给机器的方法,以最小化 MakeSpan ,这是任何一台机器的最高成本。
我该如何解决这个问题?我考虑使用匈牙利算法,但它最大限度地降低了总成本,而不是任何一台机器的最高成本。
答案 0 :(得分:0)
您可以将问题表达为整数线性程序。如果我们将B[i][j]
任务分配给B[i][j] = 1
机器,则j
为0和1的矩阵,其含义为i
。任务不可分割的事实使得这个问题成为ILP而不是LP - 否则我们可以坚持0 <= B[i][j] <= 1
。
我们希望尽量减少任何机器的最高成本。这不是一个线性函数,但有一个标准的技巧来表达它,通过引入一个虚拟变量(在程序中称为MakeSpan
)。
ILP是这个有m + n个约束的程序:
minimize MakeSpan such that
sum(B[i][j] for i=1..m) = 1 for all j
sum(B[i][j]*A[i][j] for j=1..n) <= MakeSpan for all i
第一组约束形式化了将每个任务分配给一台机器的想法。第二组约束是每台机器的成本最多为MakeSpan
。
当MakeSpan
等于任何机器的最高成本时,本地实现最小MakeSpan
,并且当最大成本也最小化时全局实现。{/ p>
要解决ILP,您可以使用自己喜欢的ILP解算器。例如,GLPK是一个开源求解器。