假设我有一个图表,其中节点是各种类型的工作负载,边是工作负载之间的依赖关系。(这是一个 DAG,因为不能存在循环依赖。)
我还有一组可以执行工作的多个代理。
一些工作负载种类可以分配给任何代理,其他的必须分配给特定代理,而其他的必须分配给特定代理组中的一个代理。
如何分配工作负载,以便:
在完成所有阻塞工作负载之前,不会向代理分配工作负载
完成总工作负载图需要尽可能短的时间。(请注意,最小化代理空闲时间通常是好的,但不是基本要求 - 可能存在一个特定代理空闲更长时间但完成所有代理的所有作业的总时间最少的情况。)
工作负载具有持续时间估计值,但为简单起见,假设每个工作负载都需要相同的计算时间。(只需将每个工作负载分解为多个连续依赖的工作负载,直到每个工作负载实际上都是一个恒定时间操作。)
我知道拓扑 DAG 排序,但这会产生一个单一的、串行的节点排序。我有多个并行运行的代理,并且这些关系使得可以通过对任务进行不明显的重新排序来进行潜在的大型时序优化。
这样做的结果最好呈现为最小总持续时间的甘特图。实际上,如果您将问题视为将里程碑中的错误票分配给团队中的工程师,目标是尽快完成里程碑,那么您就会明白这一点。(不......请不要告诉我将我的图表导入 MS Project 然后导出它:) - 我对它背后的算法感兴趣!)
非常感谢指向众所周知的算法、软件库或一般问题和原则的指针!