0

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

有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

我已经达到了解决这个问题的能力的尽头。我已经尝试过循环,只是过滤掉了不好的结果,但我真的不能让它工作。我希望得到一些帮助。谢谢。

4

2 回答 2

0

是否需要编写脚本来计算它?它可以纯粹以数学方式完成。诚然,我的组合学相当生疏,但我的想法是这个问题可以简化为

(3! * choose(12, 3)) * (3! * choose(9, 3)) * (3! * choose(6, 3)) * (3! * choose(3, 3))

这很好地简化了12!。您也可以轻松地将其概括为任意数量的类别、部分、每个类别的部分和类型。我只是不确定为什么你需要为此编写脚本,除非它是为了分配,在这种情况下,你应该真正发布你拥有的代码并解释你的思维过程和问题。

于 2013-04-02T17:29:49.900 回答
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))
于 2013-04-02T17:31:15.303 回答