问题描述
|
假设我有两座建筑物,可以在其中建造不同的单元。
一栋建筑物只能同时建造一个单位,但是最多有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。
一旦缓冲区已满,则每当有新作业到达时,您都将以最少的构建时间删除该作业,并将其分配给工厂的完成时间