用python实现多系数
问题是: 假设有9个不同的对象,找到将其划分为2、3和4组的所有方法 从数学上讲,除法的总数可以表示为9/2.3.4! 这是我尝试过的用python实现多系数,python,combinatorics,Python,Combinatorics,问题是: 假设有9个不同的对象,找到将其划分为2、3和4组的所有方法 从数学上讲,除法的总数可以表示为9/2.3.4! 这是我尝试过的 import itertools def multiCoef(seta, n1, n2): seta = set(seta) for comba in itertools.combinations(seta, n1): comba = set(comba) for combb in itertools.combinations(seta-
import itertools
def multiCoef(seta, n1, n2):
seta = set(seta)
for comba in itertools.combinations(seta, n1):
comba = set(comba)
for combb in itertools.combinations(seta-comba, n2):
combb = set(combb)
yield comba, combb, seta-comba-combb
你可以用这样的东西试试,它运行得很好:
>>> y = multiCoef(x, 2, 3)
>>> for i in y: print i
但一旦群体数量增加,这种方法就会变得麻烦。有更好的方法吗?一旦定义了函数子集(a,b),就可以枚举a中大小为b的所有子集
for i in subsets(mySet,2):
for j in subsets(mySet.difference(i),3):
for k in subsets(j.difference(k),4)
print i,j,k
一旦定义了用于枚举a中大小为b的所有子集的函数子集(a,b)
for i in subsets(mySet,2):
for j in subsets(mySet.difference(i),3):
for k in subsets(j.difference(k),4)
print i,j,k
见itertools
参见itertools
要找到划分
(m+n+p)
项目组m,n,p
的方法,首先将集合划分为m
组,然后将这些组中的每一个分组除以n
,然后除以p
现在,将(m+n+p)项分成(n+p)组的方法如下
==>(n+m+n)Cn+p
==>(m+n+p)/(m!*(n+p)!)
现在把(n+p)项分成n组的方法是
==>(n+p)Cn
==>(n+p)/(n!*(p)!)
所以(n+m+n)Cm*(n+p)Cn=(m+n+p)/(m!*(n+p)!)*(n+p)/(n!*(p)!)
==>(m+n+p)/(m!*n!*p!)
做我们可以使用的组合
给定m=4,n=3,p=2
将小组分成(n+p)=5项
>>> g1=(x for x in itertools.combinations(xrange(9),5))
注意:您可以将其保留为生成器
将这些组中的每一组分为n个项目=3个项目的子组
>>> groups=[(x,tuple(set(g)-set(x))) for g in g1 for x in itertools.combinations(g,3)]
注意::tuple(set(g)-set(x))将为您提供不是x的元素,即组的另一部分
团体规模为
>>> len(groups)
1260
>>>
现在验证
>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260
要想找到划分
(m+n+p)
项在m,n,p
组中的方法,首先要将集合划分为m
组,然后将这些组中的每一个除以n
,然后再除以p
现在,将(m+n+p)项分成(n+p)组的方法如下
==>(n+m+n)Cn+p
==>(m+n+p)/(m!*(n+p)!)
现在把(n+p)项分成n组的方法是
==>(n+p)Cn
==>(n+p)/(n!*(p)!)
所以(n+m+n)Cm*(n+p)Cn=(m+n+p)/(m!*(n+p)!)*(n+p)/(n!*(p)!)
==>(m+n+p)/(m!*n!*p!)
做我们可以使用的组合
给定m=4,n=3,p=2
将小组分成(n+p)=5项
>>> g1=(x for x in itertools.combinations(xrange(9),5))
注意:您可以将其保留为生成器
将这些组中的每一组分为n个项目=3个项目的子组
>>> groups=[(x,tuple(set(g)-set(x))) for g in g1 for x in itertools.combinations(g,3)]
注意::tuple(set(g)-set(x))将为您提供不是x的元素,即组的另一部分
团体规模为
>>> len(groups)
1260
>>>
现在验证
>>> factorial(9)/(factorial(2)*factorial(3)*factorial(4))
1260
下面是一个递归生成器,它获取数字范围(
first
和last
)和avail
,即所需集合大小的列表。假设sum(avail)=last-first+1)
在循环的每一次迭代中,算法都会尝试将第一个赋值给其中一个集合,然后为first+1,…,last
生成所有赋值。generate生成集合赋值的元组:元组中每个位置的值标识对应索引的集合赋值。换句话说,t(k)
是first+k
的设置赋值,一个范围为0..len(avail)-1
def生成(第一个、最后一个、可用):
对于索引,枚举中的n(可用):
如果n==0:
持续
新的可用性=列表(可用性)
新的可用性[索引]-=1
如果第一次<最后一次:
对于生成中的d(第一个+1,最后一个,新的可用):
d=(不精确,)+d
产量d
elif first==last:
收益率(指数)
对于generate(1,9,[2,3,4])中的perm:
烫发
以下是一个递归生成器,它获取数字范围(first
和last
)和avail
,即所需集合大小的列表。假设sum(avail)=last-first+1)
在循环的每一次迭代中,算法都会尝试将第一个赋值给其中一个集合,然后为first+1,…,last
生成所有赋值。generate生成集合赋值的元组:元组中每个位置的值标识对应索引的集合赋值。换句话说,t(k)
是first+k
的设置赋值,一个范围为0..len(avail)-1
def生成(第一个、最后一个、可用):
对于索引,枚举中的n(可用):
如果n==0:
持续
新的可用性=列表(可用性)
新的可用性[索引]-=1
如果第一次<最后一次:
对于生成中的d(第一个+1,最后一个,新的可用):
d=(不精确,)+d
产量d
elif first==last:
收益率(指数)
对于generate(1,9,[2,3,4])中的perm:
烫发
我理解这个问题。这是组合数学,我理解这个问题。这是组合数学,我想你可能没抓住重点。g2应该从剩下的5个选项中选择?@CravingSpirit,抱歉错过了。我想你可能错过了要点。g2应该从剩下的5个中选择?@CravingSpirit,抱歉错过了