设备包含位置数组,其中一些位置包含我们想要定期读取的值。查找最佳组的算法
我们希望定期阅读的地点列表还指定了我们想要阅读的频率。允许比指定更频繁地读取一个值,但不是更少。
单个读取操作可以从数组中读取连续的位置序列,因此可以从一个读取操作返回一组多个值。在单个操作中可以读取的连续位置的最大数量为M.
目标是对位置进行分组,以使读取操作的时间平均数最小化。如果有多种方法可以做到这一点,那么决胜局是为了最大限度地减少读取位置的时间平均数量。
(如果算法做这个允许的位置列表中的增量变化奖励分数! - 从头开始重新计算,即增加或从列表中删除一个位置/不需要分组)
我会试着用M = 6的例子来说明这一点。
下图显示了位置数组。数字表示该位置的期望读取周期。
| 1 | 1 | | | 1 | | | | | | 5 | | 2 |
\-------------------/ \-----------/
group A group B
在这第一个例子中,组A每隔2秒读一次,组B每2秒读一次。请注意,应该每5秒读取的位置实际上是每2秒读取一次 - 这很好。
| 1 | | | | | 1 | 1 | | 1 |
\-----------------------/\----------/
group A group B (non-optimal!)
这个例子显示了我的初始头脑简单的算法,这是填满第一组直到满,然后启动另一个的故障。以下分组是更理想的,因为虽然组的数目每秒读取是相同的,在这些基团读取位置的数量是小的:
| 1 | | | | | 1 | 1 | | 1 |
\---/ \---------------/
group A group B (optimal)
最后,其中三组是两个以上更好的例子:
| 5 | | | | | 1 | 1 | | | | | 5 |
\-----------------------/\----------------------/
group A group B (non-optimal)
该解决方案需要每秒两组读取。更好的解决方案如下:
| 5 | | | | | 1 | 1 | | | | | 5 |
\---/ \-------/ \---/
group A group B group C
这需要两个读取每5秒(组A和C)加一每秒(B组):每秒1.4组读取。
编辑:(如果允许读取是非周期性的,这个例子有更好的解决方案,在第一秒读取第一个解决方案的两个组,在第2,3,4和5秒读取组B的第二个解决方案,重复一次,这会导致每秒读取1.2组数据,但我不想这样做,因为这会使代码负责调度读取更为复杂)。但这不是一个聚类问题。我还发现Algorithm to allocate a list of numbers to N groups under certain condition,它指出'Bin装箱'的问题,但我不认为这是它。
顺便说一句,抱歉的模糊标题。我想不出一个简洁的描述,甚至没有相关的搜索关键字!
新的例子由2010年9月28日:
这就像前面的例子,但所有项目以同样的速度更新。现在两个组比三好:
| 1 | | | | | 1 | 1 | | | | | 1 |
\-----------------------/\----------------------/
group A group B (optimal)
我已经开始尝试了解如何实现迭代改进。假设一个分组算法想出了:
| 1 | | | | | 1 | 1 | | | | | 1 | 1 | | | | | 1 |
\---/ \-------/ \-------/ \---/
group A group B group C group D (non-optimal)
\-----------------------/\----------------------/\----------------------/
group A group B group C (optimal)
这可以提高三个相邻组,每组6。雷克斯建议(下面的评论),我可以尝试三胞胎组合成对。但在这种情况下,我必须将四重奏组合成一个三重组,因为没有合法的中间安排,其中A + B + C(或B + C + D)可以重新排列成一对,使D保持原样。
我原本以为这表示在一般情况下,不能保证可以通过进行本地修改而从现有的有效解决方案创建新的有效解决方案。这意味着可以使用模拟退火算法,遗传算法等算法来尝试优化次优解。
但雷克斯指出(下面的评论),你总是可以将现有的组分成两部分。尽管这总是会增加成本函数,但这意味着解决方案需要摆脱其局部最小值才能达到全局最小值。
我正要说你可以随时组相邻的项目同样的时间(你最后一个例子中的B组),但这可能不是真的,这是M起作用的角落案例。它确实指出了一个策略,即用合理的规则建立逐步扩大的群体。问题的规模有多大? – phkahler 2010-09-14 13:38:07
这听起来像是在理论上最佳情况下它可能是一个NP完全或至少一个NP难题。您可以尝试在[CS Theory Stack Exchange](http://cstheory.stackexchange.com/)上重新发布它。 – 2010-09-14 13:40:49
@phkahler:在我的具体情况下,M大约是100,数组大小可以是1到30000左右但通常是几百的任何值,并且位置的数量需要从1到100左右。 – 2010-09-14 14:40:26