【问题标题】:Unique combinations of vector elements that fulfill criteria满足标准的向量元素的独特组合
【发布时间】:2018-11-19 11:04:04
【问题描述】:

我有一个整数向量,例如totalVector <- c(4,2,1),还有两个变量totalResulttotalNumber。我想做的是:

我想从 totalVector 中找到“totalNumber”元素的所有唯一组合,这些组合加起来为“totalResult”。为了澄清,如果totalResult = 100和totalNumber = 50,我希望totalVector中总和为100的50个元素的所有组合(显然允许重复,但重复的结果,例如25个四边形和25个重新排列的四边形应该只计算在内一次)。

我最初是通过扩展总向量(将每个元素重复 50 次)、使用 combn() 获取 50 个元素的所有组合然后过滤它们的总和来做到这一点的。然而,对于较大的值,这被证明是非常低效的,并且由于数据量太大而失败。有没有更快、更少数据量的方法来做到这一点?

【问题讨论】:

  • 你应该向数学家询问除蛮力之外的算法。
  • 您实际上是在尝试找到两个线性丢番图方程组的正解(一个方程涉及totalResult,一个涉及totalNumber)。 Ehrhart polynomials 与简单地计算解决方案的数量相关,但可能还有另一种方法。

标签: r


【解决方案1】:

我认为 OP 正在寻找与特定数字之和的向量重复的组合。这样就可以了:

totalVector <- c(4,2,1)
totalNumber <- 50
totalResult <- 100

library(RcppAlgos)
myAns <- comboGeneral(totalVector, totalNumber, repetition = TRUE,
                      constraintFun = "sum", comparisonFun = "==",
                      limitConstraints = totalResult)

dim(myAns)
[1] 17 50

all(apply(myAns, 1, sum) == totalResult)
[1] TRUE

免责声明:我是RcppAlgos的作者

【讨论】:

  • 不错的答案 (+1),但它在计算上变得不可行需要多长时间?它似乎仍然是一种蛮力方法(尽管有一个编写良好的包的帮助)。
  • @JohnColeman,首先我是一个超级粉丝。我从你的贡献中学到了很多。其次,你是对的(像往常一样)......这将很快在计算上变得不可行。这个问题帮助我睡了很多很多个晚上(我知道一般的说法是“让我保持清醒”,但我在这些类型的问题中找到了安慰)。到目前为止,我的结论是,对于一般情况,你不能比优化的蛮力做得更好。我曾尝试(但失败)应用整数分区方法。我目前的方法是应用一种二元方法.. 继续
  • @JohnColeman,因为我们能够生成 nth 组合,我们可以测试 sum(或我们正在应用的任何约束函数)并应用松散边界在我们应该搜索的地方。这将(理论上)至少限制我们正在测试的结果空间(尽管是以蛮力的方式)。最后一条评论的附录:我应该说“我目前的研究”而不是“我目前的方法”..这意味着它正在积极开发中。
【解决方案2】:

这将为您提供小样本所需的内容,但随着问题规模的扩大,您将很快遇到组合爆炸问题

tv <- sample(1:10, 10, replace = TRUE)
tn <- 5
tr <- 20
combinations <- combn(tv, tn)
equals.tr <- apply(combinations, MARGIN = 2, FUN = function(x) sum(x) == tr)
combinations[, equals.tr]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多