【发布时间】:2020-05-12 05:57:02
【问题描述】:
我有一个包含大约 120 个项目的列表,我需要检查一半列表的每个可能的不同组合,即 60 个项目,其中顺序无关紧要。所以这些组合的数量应该是 120!/(60!*60!)。问题是,我需要检查每个组合,因为我想为某个问题找到“最佳”组合。有谁知道如何解决这个问题?
(如果你有兴趣,我的问题如下: 在我的学校,有一半的人这周上学,其他人下周,然后我们这周又上学,等等。问题是,这是随机分配的,所以有些班级的学生人数不成比例(班级每个 25 人,所以一个班级在第 1 周有 19 名学生,在第 2 周有 6 名学生)。所以,我想找到最好的方法来划分学生,我们总共大约有 120 人,这样每个班级的人数大约是原来的一半。我的想法是为每个班级和他们的学生制作一个列表,并检查每个总数的组合的比例,从每个班级的比例中减去 0.5,然后将每个班级的差值的绝对值相加。总和最小的组合是最好的,因为类是最均匀的。)
【问题讨论】:
-
itertools 模块中有一个方法可以枚举组合。但是,有 96614908840363322603893139521372656 这样的组合......你将不得不找到另一种方法。首先,更准确地描述您的问题,因为它很不清楚。
-
是的,scipy.special.binom(120,60) 有 119 个二进制数字。这就像接近“太阳系中的原子数”之类的东西。这意味着即使您是 2 型文明,您也可能无法遍历所有组合。
-
如果您能很多更具体地了解“最佳”对学生的划分意味着什么以及您所说的“比例”等等等等。然后有可能想出一个更聪明的方法来解决这个问题。但无论如何,您目前似乎并没有真正的编程问题,而是一般的解决问题的问题。
标签: python combinations