用约束统一分割序列

时间:2014-03-19 18:05:52

标签: r algorithm

我希望(粗略地)使用包含/排除约束来均匀地分割序列。我在R中寻找这样的函数(因此,在R中描述),但它认为它也是一个很好的算法问题:)

以下设置描述了问题。

## size
n = 5 # length of a sequence
m = 3 # number of groups

## constraints
# inclusion constraints
# same index (for example, first two elements) must be in a same group.
ic = c(1,1,2,3,4)
# exclusion constraints
# same index (for example, last two elements) must not be in a same group.
ec = c(1,2,3,4,4)

## run
g = uniform_split(n, m, ic, ec) # the function I am looking for!

# possible g when m = 3:
g = c(1,1,2,2,3) # most preferred
g = c(1,1,3,2,3) # most preferred
g = c(1,1,1,2,3) # satisfies constraints, but less balanced.

# possible g when m = 2:
g = c(1,1,2,1,2) # most preferred
g = c(1,1,2,2,1) # most preferred
g = c(1,1,1,1,2) # satisfies constraints, less balanced
g = c(1,1,1,2,1) # satisfies constraints, less balanced

如图所示,可能的顺序可能不仅仅是一个,甚至可能不存在。因此,结果不需要完全平衡,也不需要提供所有可能的选择。如果有可能的话,大致统一的结果之一就足够了。但是,分组的质量可以通过向量的范数来定义:distance = (count_in_group(1), count_in_group(2), ... count_in_group(m)) - (n/m, n/m, ..., n/m)

此外,您可以假设以下内容,简单地(或可能使问题复杂化)。

  • m< = n:这可以消除琐碎的案件。

  • 包含约束/排除约束是单调不减少的:这将使只有邻居具有包含/排除关系。

  • O(n)溶液具有相当好的结果是优选的(不确定它是否可能也是最好的)。

这种分组用于分割数据帧并将工作分配到多个核心。 R的parallel::clusterSplit函数会在不考虑约束的情况下拆分序列。

n = 5,选择m = 3作为示例目的。实际上,n将是数千(数据帧的行数),m将是几十/几百(核心数)。

任何人都知道如何编写这样的函数吗?

1 个答案:

答案 0 :(得分:0)

合并必须放在一起的项目(并添加其权重)后,此问题是一个分区问题,对分区中共存的项目有一些限制。由于分区通常是NP难的,我首先会尝试一种贪婪的策略,该策略依次考虑不能共存的每个最大项目组,并将它们打包到负载最小的分区(最重到最小,第二重到第二等)。 。首先是“困难”组(首先是最大总重量)。如果R有一个不错的优先级队列,那么这应该足够快。

可能存在更聪明的组合优化算法,但考虑到开环调度的局限性,我怀疑它们不值得。