【发布时间】:2011-10-25 22:56:38
【问题描述】:
给定 n(比如 3 个人)和 s(比如 100$),我们想将 s 划分给 n 个人。
所以我们需要所有可能的和为 s 的 n 元组
我的 Scala 代码如下:
def weights(n:Int,s:Int):List[List[Int]] = {
List.concat( (0 to s).toList.map(List.fill(n)(_)).flatten, (0 to s).toList).
combinations(n).filter(_.sum==s).map(_.permutations.toList).toList.flatten
}
println(weights(3,100))
这适用于较小的 n 值。 (n=1、2、3 或 4)。
超过 n=4 需要很长时间,几乎无法使用。
我正在寻找使用惰性评估/流来重新编写代码的方法。
我的要求:必须为 n 最多 10 工作。
警告:问题变得非常大非常快。我从 Matlab 得到的结果 -
---For s =100, n = 1 thru 5 results are ---
n=1 :1 combinations
n=2 :101 combinations
n=3 :5151 combinations
n=4 :176851 combinations
n=5: 4598126 combinations
---
【问题讨论】:
-
所以我猜“公平”不是问题?如果您对 s 的分区方式添加约束,那么组合将会少得多。
-
我不明白您为什么要实际生成所有组合的列表...?这样做的目的是什么?
-
我认为不可能在普通计算机中列出所有总和为 100 的 10 元组,因为这个数字太大了。但是,我们可以给出所有 10 元组的计数。
-
Luigi,这是大多数金融机构的标准资产配置问题。假设给你 s$ 并要求在 n 个股票中分配它以最大化某个指标(比如夏普值),你首先需要对 s$ 进行分区。如果股票数量很少(低于 5 只股票),这种天真的蛮力方法非常有效。除此之外,我们还使用线性代数技术。
-
@Daniel:我认为你只需要在你的记忆表中为
min提供一个维度。
标签: scala functional-programming permutation combinations data-partitioning