【问题标题】:Number of combinations with specific rules具有特定规则的组合数
【发布时间】:2013-04-02 16:55:57
【问题描述】:

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

有 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 个 S 和 12 个位置! C和3的位置! T 的职位?我是从这样一个事实得出的,即顺序很重要,没有重复。 -> 更像是每个的排列。如果是这样,这将是一个巨大的数字。

标签: python combinatorics


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    一个简单的方法来打破这个逻辑可能是这样的:

    您需要将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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2020-01-22
      相关资源
      最近更新 更多