Python 选择组合的平衡子集

Python 选择组合的平衡子集,python,combinations,subset,Python,Combinations,Subset,我有一个包含N个元素的数组。我想选择它们的mk组合,使元素尽可能均匀地分布(也就是说,所有N个元素在那里的次数相同,并且彼此尽可能均匀地配对(或三倍,等等) 例如,手动使用以下值进行此操作很简单,或者至少很容易,如果需要花费时间的话: N = 8 M = 14 K = 4 对于14*4个可能点,8个元素中的每一个都将出现14*4/8=7次。此外,每个元素将有7*(4-1)=21个“伙伴”,这意味着其他7个元素中的每一个都将出现21/7=3次。同样,由于每对元素出现三次,因此有3*(4

我有一个包含N个元素的数组。我想选择它们的mk组合,使元素尽可能均匀地分布(也就是说,所有N个元素在那里的次数相同,并且彼此尽可能均匀地配对(或三倍,等等)

例如,手动使用以下值进行此操作很简单,或者至少很容易,如果需要花费时间的话:

N = 8  
M = 14  
K = 4 
对于14*4个可能点,8个元素中的每一个都将出现14*4/8=7次。此外,每个元素将有7*(4-1)=21个“伙伴”,这意味着其他7个元素中的每一个都将出现21/7=3次。同样,由于每对元素出现三次,因此有3*(4-2)=这些集合中剩下的6个点,这些点被其他6个元素完美地填充。因此,每个元素出现7次,每对出现三次,每个三元组都是唯一的,并且所有三元组都存在。由于对从何处开始构建此集合进行了一些任意决定,我大概花了十分钟来填充

我想知道的是,是否有一种方法(最好是Python)适用于一般情况,或者至少是一种组合稍不完美的情况,比如我现在正在研究的情况:

N = 12
M = 22
K = 6
以前的一些相同逻辑仍然有效。每个元素出现22*6/12=11次,每个元素有11*(6-1)=55个伙伴,因此其他11个元素中的每一个都与它配对5次。在这五对中,有5*(6-2)=剩余20个点,其他10个元素各填充两次。因此每个元素出现11次,每对出现5次,每个三元组出现两次。不幸的是,移动到下一步不起作用,因为三元组有2*(6-3)=6个空格,用剩下的9个元素填充,因此虽然四个小元素应该是唯一的,但它们并不都存在


正如你所看到的,我试图用数学的方法来处理这个问题,但我希望有一种方法可以让Python帮我完成繁重的工作(和随机化)。有什么想法吗?

我正在考虑一个
itertools.composition(N\u列表,K\u元素)
random.choice(combs)的组合
M
次,但要生成所有可能的组合只是为了选择几个,这将是昂贵的。但也许这可以让您开始。请参阅平衡子集优化问题