具有特定规则的组合数

时间:2013-04-02 16:55:57

标签: python combinatorics

我想找出以下问题的组合数量:

共有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

我已经达到了解决这个问题的能力。我已经尝试过循环,只是过滤掉了糟糕的结果,但我无法让它真正起作用。我会喜欢这方面的帮助。感谢。

2 个答案:

答案 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))