我想找出以下问题的组合数量:
共有4个部分。每个部分包含12个类别。每个类别又包含3种类型。 A,B和C.对于每个部分,您必须选择3种类型。该类别不能被选择多次,每个部分必须具有每种类型之一。结果可能如下所示:
S1
C1 TA
C2 TB
C3 TC
S2
C4 TA
C5 TB
C6 TC
S5
C7 TA
C8 TB
C9 TC
S4
C10 TA
C11 TB
C12 TC
或
S1
C1 TC
C2 TB
C4 TA
S2
C3 TB
C5 TC
C6 TA
S5
C7 TC
C10 TA
C9 TB
S4
C11 TC
C8 TB
C12 TA
我已经达到了解决这个问题的能力。我已经尝试过循环,只是过滤掉了糟糕的结果,但我无法让它真正起作用。我会喜欢这方面的帮助。感谢。
答案 0 :(得分:0)
是否需要编写脚本来计算?它可以纯粹在数学上完成。我的组合学确实相当生疏,但我的想法是这个问题减少到了
(3! * choose(12, 3)) * (3! * choose(9, 3)) * (3! * choose(6, 3)) * (3! * choose(3, 3))
这简化为简单12!
。对于任何类别,部分,每个类别的部分和类型,您也可以轻松地对其进行概括。我只是不确定为什么你需要为此编写一个脚本,除非是为了一个作业,在这种情况下你应该发布你的代码并解释你的思考过程和问题。
答案 1 :(得分:0)
一种简单的方法来打破这种逻辑可能是这样的:
您需要将 12个类别随机分为 4个部分。 random是一个很好的工具。
categories = range(1,13) # 1-based
# now you can use random.shuffle to shuffle it in place
import random
random.shuffle(categories) # now categories is shuffled.
# split the categories evenly between the 4 sections
sections = [categories[3*i:3*(i+1)] for i in range(4)]
您现在需要将 3种类型随机分发到每个部分中的类别。
# lets make a function that returns a randomly ordered sequence of types 1,2,3
def rand_types():
types = [1,2,3]
random.shuffle(types)
return types
# now we can use this for each assignment
final = []
for section in sections:
final.append(zip(section, rand_types()))
# [[(8, 2), (5, 1), (10, 3)],
# [(6, 2), (7, 3), (2, 1)],
# [(4, 1), (12, 3), (1, 2)],
# [(11, 2), (3, 1), (9, 3)]]
如果您不喜欢使用zip
,则可以自行构建(category, type)
元组:
for section in sections:
final.append([])
for i, t in enumerate(rand_types()):
final[-1].append((section[i], t))