负载均衡算法 - 特例

时间:2011-06-15 15:39:26

标签: algorithm load-balancing

让我假装我有两座建筑,我可以在那里建造不同的单元。 建筑物只能同时建造一个单元,但有一个最多5个单元的FIFO队列,它们将按顺序构建。 每个单元都有构建时间。 我需要知道,考虑到已经在建筑物的构建队列中的单位,尽可能快地获得我的单位的最快解决方案。 我认为像RoundRobin这样的“着名”算法在这里不起作用。

有没有可以解决这个问题的算法?

3 个答案:

答案 0 :(得分:0)

这是NPC问题(答案末尾的证明),所以找到理想解决方案的最佳希望是尝试所有可能性(这将是2 ^ n种可能性,其中n是任务数)。

在评论中建议了可能的启发式(并在AShelly的评论中进行了改进):将任务从大到小排序,并将它们放在一个队列中,每个任务现在都可以在完成时从队列中获取元素。 这当然不总是最优的,但我认为对大多数情况会有好结果。

证明问题是NPC:
设S = {u | u是需要生产的单位}。 (S是包含所有'任务'的集合)
声明:如果存在可能的完美拆分(两个队列同时完成),则它是最佳的。让这个时间成为半天 这是正确的,因为如果存在不同的最优,则至少有一个队列必须在t> HalfTime结束,因此它不是最佳的。

<强>证据: 假设我们有一个算法A来在多项式时间产生最佳解,那么我们可以通过以下算法在多项式时间求解partition problem

1. run A on input
2. if the 2 queues finish exactly at HalfTIme - return True.
3. else: return False

此解决方案解决了分区问题,因为声明:如果分区存在,它将由A返回,因为它是最佳的。所有步骤1,2,3都在多项式时间运行(1表示假设,2表示3和3表示微不足道)。所以我们建议的算法在多项式时解决了分区问题。因此,我们的问题是NPC
Q.E.D。

答案 1 :(得分:0)

这让我想起了星际争霸:D

我只是在构建队列中添加一个整数,表示忙碌的时间。 当然,每个时间单元必须更新一次此变量。 (时间单位在这里是“s”,持续几秒钟)

所以,假设我们有一座建筑物,我们提交3个单位,每个单位需要5个单位才能完成。总计最多15个。我们在时间= 0。 然后我们有另一个建筑物,我们提交2个单元,需要6个单元单元来完成每个单元。

所以我们可以有一个这样的表:

Time 0 
Building 1, 3 units, 15s to complete.
Building 2, 2 units, 12s to complete.

Time 1
Building 1, 3 units, 14s to complete.
Building 2, 2 units, 12s to complete.

我们想要添加另一个需要2s的单位,我们可以简单地遍历选定的建筑物并选择一个完成时间最短的建筑物。 在这种情况下,这将构建2.这将导致Time2 ...

Time 2
Building 1, 3 units, 13s to complete
Building 2, 3 units, 11s+2s=13s to complete

...

Time 5
Building 1, 2 units, 10s to complete (5s are over, the first unit pops out)
Building 2, 3 units, 10s to complete

等等。

当然,您必须照顾生产设施的上限。就像建筑物有5个元素一样,不要指定一些东西,然后选择下一个完成时间最短的建筑物。

我不知道您是否可以使用引擎轻松实现此功能,或者它是否支持某种时间单元。

这将导致每个时间单位更新所有生产设施一次,O(n)其中n是可以生产某些东西的建筑物数量。如果您要提交一个单位,则需要O(1),假设您将所选建筑物保持在排序顺序中,最低位 - 首先是第一个元素查找。在这种情况下,您必须在操作取消或添加等单位后求助列表。

否则amit的回答似乎也是可能的。

答案 2 :(得分:0)

这是一个简单的方案:

设U是要构建的单位列表,F是可以构建它们的工厂集。对于每个工厂,跟踪总时间 - 直到完成;即队列完全空的时间。

  • 通过减少构建时间来排序U.插入新项目时保持排序顺序
  • 在工厂完成单位工作失败后的任何时间点开始时或结束时:
    • 列出队列中包含空格的所有工厂的就绪列表
      • 通过增加time-til-complete
      • 对就绪列表进行排序
      • 获得最快完成的工厂
      • 从U中取出第一项,将其添加到工厂
      • 重复直到U为空或所有队列都已满。

谷歌搜索“最小完工时间”可能会为您提供其他解决方案的一些线索。 This CMU lecture有一个很好的概述。

事实证明,如果你提前知道这组工作,那么这个问题就是Multiprocessor_scheduling,这是NP-Complete。显然我建议的算法称为“最长处理时间”,它总是给出不超过最佳时间的4/3的结果。

如果您不提前知道这些工作,那就是在线Job-Shop Scheduling

论文"The Power of Reordering for Online Minimum Makespan Scheduling"

  

许多问题,包括最低限度   制定调度,这是合理的   不仅为a提供了先行   一定数量的未来工作,但是   另外还允许算法   选择其中一个工作   接下来处理,因此,到   重新排序输入序列。

因为你的每个工厂都有一个FIFO,你基本上可以缓冲传入的工作,因为你可以保留它们直到工厂完全空闲,而不是试图让所有的FIFO始终保持满

如果我正确地理解了论文,那么该计划的结果就是

  1. 保留一个固定大小的传入缓冲区 工作。一般来说,越大 缓冲,更接近理想 安排你得到。
  2. 根据以下内容为每个工厂分配一个重量 w 给定的公式,取决于 缓冲区大小。在这种情况下 缓冲区大小=数字工厂+1,2个工厂使用(2 / 3,1 / 3)的权重; (5 / 11,4 / 11,2 / 11)3。
  3. 一旦缓冲区已满,每当新作业到达时,您将使用最少时间删除该作业,并将其分配给具有完成时间的工厂。 w * T 其中 T 是所有工厂的总完工时间。
  4. 如果没有更多的传入作业,请使用我给出的第一个算法在U中安排剩余的作业。
  5. 将此问题应用于您的情况的主要问题是您不知道何时(如果有)将不再有传入的作业。但也许只是用“如果任何工厂完全闲置”取代那个条件,然后重新启动就会得到不错的结果。