负载平衡算法-特殊示例

问题描述

| 假设我有两座建筑物,可以在其中建造不同的单元。 一栋建筑物只能同时建造一个单位,但是最多有5个单位的FIFO队列,这些队列将按顺序建造。 每个单元都有一个构建时间。 我需要知道,考虑到我的建筑物的构建队列中已存在的单元,最快的解决方案是使我的单元尽快运行的最快方法。 我认为,像RoundRobin这样的“著名”算法在这里不起作用。 有没有什么算法可以解决这个问题?     

解决方法

        这让我想起了一些星际争霸: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,14s to complete.
Building 2,12s to complete.
我们想添加另一个耗时2秒的单元,我们可以简单地循环遍历所选建筑物,并选择耗时最短的建筑物。 在这种情况下,它将建立2。这将导致Time2 ...
Time 2
Building 1,13s to complete
Building 2,11s+2s=13s to complete
...
Time 5
Building 1,10s to complete (5s are over,the first unit pops out)
Building 2,10s to complete
等等。 当然,您必须注意生产设备的上限。就像建筑物有5个元素一样,不要分配任何东西,而是选择时间最短的下一栋建筑物。 我不知道您是否可以使用引擎轻松实现此功能,或者它是否支持某种时间单位。 这只会导致每个时间单位O(n)更新一次所有生产设施,其中n是可以生产某种东西的建筑物的数量。如果您要提交单元,则假设您将所选建筑物保持在已排序的顺序中,则将采用O(1)的顺序,即最低的优先顺序-因此仅进行第一个元素查找。在这种情况下,您必须在处理诸如取消或添加之类的单位之后重新使用列表。 否则,阿米特的答案似乎也是可能的。     ,        这是NPC问题(答案的末尾有证明),因此,找到理想解决方案的最大希望就是尝试所有可能性(这将是2 ^ n个可能性,其中n是任务数)。 注释中建议了可能的启发式方法(AShelly在注释中进行了改进):将任务从最大到最小排序,并将它们放在一个队列中,每个任务完成后现在都可以从队列中获取元素。 当然这并不总是最佳的,但是我认为在大多数情况下都会取得良好的效果。 证明问题出在NPC上: 令S = {u | u是需要生产的单位}。 (S是包含所有\'tasks \'的集合) 主张:如果存在可能的知情分裂(两个队列同时完成),则是最佳选择。让这个时间成为HalfTime 这是正确的,因为如果存在不同的最佳值,则至少一个队列必须在t> HalfTime处完成,因此它不是最佳值。 证明: 假设我们有一个算法
A
在多项式时间产生最佳解,那么我们可以通过以下算法解决多项式时间的分区问题:
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是微不足道的)。因此我们建议的算法可解决多项式时间的分区问题。因此,我们的问题是NPC Q.E.D.     ,这是一个简单的方案: 令U为要构建的单元的列表,使F为可以构建它们的工厂的集合。对于每个工厂,跟踪总的时间直到完成;即,直到队列完全空了多长时间。 通过减少构建时间对U进行排序。插入新项目时保持排序顺序 在工厂完成后的开始或任何时间的最后一滴答声中,设备将无法工作: 列出所有有队列的工厂的就绪清单 通过增加时间到完成来对就绪列表进行排序 获得最快将要完成的工厂 从U取第一项,并将其添加到工厂 重复直到U为空或所有队列已满。 谷歌搜索“最小makepan”可能会给您带来其他解决方案的线索。这个CMU讲座有一个很好的概述。 事实证明,如果您提前知道工作集,那么这个问题就是Multiprocessor_scheduling,即NP-Complete。显然,我建议的算法称为“最长处理时间”,并且其结果始终不超过最佳时间的4/3。 如果您不提前知道工作,则可以使用在线Job-Shop计划 论文“在线最小Makespan计划的重新排序能力”说   针对许多问题,包括最低要求   makepan调度,这是合理的   不仅为   一定数量的未来工作,但是   另外允许算法   选择以下工作之一   接下来处理,因此   重新排序输入序列。 因为每个工厂都有一个FIFO,所以您实际上可以缓冲传入的作业,因为您可以将它们保持到工厂完全空闲为止,而不是试图始终保持所有FIFO都满。 如果我对论文的理解正确,该方案的结果是 保持固定大小的传入缓冲区 工作。一般来说,越大 缓冲,更接近理想 安排你得到。 为每个工厂分配权重w 给定的公式,取决于 缓冲区大小。在这种情况下 缓冲区大小=工厂数量+1,对2个工厂使用权重(2 / 3,1 / 3); (5 / 11,4 / 11,2 / 11)for 3。 一旦缓冲区已满,则每当有新作业到达时,您都将以最少的构建时间删除该作业,并将其分配给工厂的完成时间

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...