例如,您有几个double
s 列表,您需要将它们分布在几个固定大小的“桶”中(桶大小也是 a double
)。还有两个额外的约束:
某些列表中的值只能进入某些(预先指定的)存储桶:
bucket1 <-\ |--- list1 / / bucket2 <--\ bucket3 <---- list2 bucket4 <--/ bucket5 <--- list3
生成的分布必须尽可能均匀(例如,所有桶的负载因子为
0.5
)。
此类问题的具体示例:假设您有多个电源单元(“桶”)和几块灯板。每个供电单元连接到一个或多个板,每个供电单元的容量不同,灯消耗的能量不同。如果某些板连接到多个电源单元,那么您可以将一些灯“分配”到第一个电源,一些 - 到第二个,等等。
对于大量元素,使用蛮力快速执行此操作变得不可行。
有没有有效的方法?
编辑:我设计了以下方法-似乎很快就收敛到所需的结果。思路如下:
- 首先,对于每个列表,我使用最小加载桶启发式将项目分配到允许的桶中。
- 然后,我执行以下操作:
- 对于每个列表:
- 从桶中删除与列表对应的项目
- 使用相同的最小负载启发式再次分发它们
- 计算最大负载桶大小与最小负载的比率(对于允许的桶)
- 如果 ratio 小于某个常数(我采用
1.02
),或者通过了太多步骤,则终止循环。
- 对于每个列表:
一般的想法是“平滑”桶,直到分布变得足够平坦,这通常意味着我们达到了所需的目标。
这是一个好的算法吗?