分区中可能的组合数

时间:2009-02-27 22:37:35

标签: math combinatorics linear-programming

给定是大小为n的集合S,其被划分为大小为n1,...,nk的类(s1,...,sk)。当然,它认为n = n1 + ... + nk。

我感兴趣的是找出可以组合此分区元素的方式的数量,以便每个组合恰好包含每个类的一个元素。

因为我可以从s1中选择n1个元素,从s2中选择n2个元素,所以我正在为任意n1,... nk寻找max(n1 * .. * nk)的解决方案,因为它保持n1 +。 。+ NK = N

我觉得这是一个线性优化问题,但是自从我将这些东西作为本科生学习以来已经太久了。我希望有人记得如何计算这个。

2 个答案:

答案 0 :(得分:3)

您是否正在寻找每个分区中包含一个元素的组合数量?

那只是n1 * n2 * ... * nk。

编辑: 你似乎也在问一个单独的问题:

给定N,如何指定n1,n2,...,nk使其产品最大化。这实际上不是线性优化问题,因为你的变量是相乘的。

它可以通过一些微积分来解决,即通过使用拉格朗日乘数在每个变量中使用约束来获取部分衍生物。

结果是n1 .. nk应该尽可能接近相同的大小。

if n is a multiple of k, then n_1 = n_2 = ... = n_k = n/k

otherwise, n_1 = n_2 = ... = n_j = Ceiling[n/k]
      and  n_j+1 = ... = n_k = floor[n/k]

基本上,我们尝试尽可能均匀地将元素分布到分区中。如果它们均匀分配,那很好。如果没有,我们尽可能均匀地划分,并且无论剩下什么,我们都为第一个分区提供额外的元素。 (不必是第一个分区,这个选择相当随意。)这样,任何两个分区拥有的元素数量的差异最多只有一个。

血腥细节

这是我们希望最大化的产品功能:

P = n1 * n2 * ... nK

我们使用拉格朗日乘数定义一个新函数:

Lambda = P + 1(N - n1 - n2 ... -nk)

并在每个k n_i变量中采用偏导数:

dLambda / dn_i = P / n_i - l

和l:

dLambda / dl = N - n1 -n2 ... -nk

设置所有偏导数= 0,我们得到一个k + 1方程组,当我们求解它们时,我们得到n1 = n2 = ... = nk

一些有用的链接:

Lagrange Multipliers

Optimization

答案 1 :(得分:2)

floor(n/k)^(k - n mod k)*ceil(n/k)^(n mod k)

- MarkusQ

P.S。对于你给出的S = {1,2,3,4},n = 4,k = 2的例子,这给出了:

floor(4/2)^(2 - 4 mod 2)*ceil(4/2)^(4 mod 2)
floor(2)^(2 - 0)*ceil(2)^(0)
2^2 * 2^0
4 * 1
4

......如你所愿。

为了阐明,该公式给出了具有最大可能排列数的分区所产生的排列数。当然会有其他不太理想的分区。

对于给定的边界,具有最大面积的矩形是最接近正方形的矩形(并且在较高维度中也是如此),这意味着您希望边的长度尽可能接近(例如,所有平均长度都向上或向下舍入)。然后可以看出公式为:

   (length of short sides)^(number of short sides)
times
   (length of long sides)^(number of long sides)

这只是满足此约束的超矩形的体积。

请注意,以这种方式查看时,它还会告诉您如何构建最大分区。