我需要创建带有约束的重叠集,这些约束表示类似的项不应该一起出现。我有一个本地贪婪的算法,可以正常工作,但肯定会崩溃。我想知道是否有全局算法。
我想要以n
(s
; s=8
)的大小排列n>>s
个项目。集合之间存在重叠,因此每个项目在所有集合中至少出现两次(如果mod(n,s/2)==0
,则恰好两次)。此外,项目不应多次放在一个共同的集合中。
满足此要求的算法是将项目随机排列成n/2
个集合,并通过从i
到i+1
集合中选择一个元素来完成集i+s/2
(在i=0
到达i
后n
处继续。
然而,存在限制。为简单起见,请说我的物品有颜色和形状。有很多颜色c
和有限数量的形状p
,即s << c < n
和p<s
。因此,虽然没有一个集合应该包含每种颜色的1个以上,但我允许每个集合最多包含3个。
我当前的算法迭代按顺序创建集合,然后尝试在集合之间交换项目以满足约束。我认为最好把它变成某种可以在全球范围内优化的分配问题,并且可能已经解决了这样的问题(或至少给出了一个名称)。有这样的算法吗?