【问题标题】:Python creating array of permutations with conditions on pool of values at each level of the arrayPython在数组的每个级别上创建具有条件的排列数组
【发布时间】:2020-03-06 17:30:57
【问题描述】:

从概念上讲,我正在尝试从一个包含 10 个值的池(例如 [0-9])中构建可能的排列数组,其中您可以根据排名在每个元素处选择 3 个。因此,假设选择的第一个元素是 0,那么下一个可供选择的值池将是 1、2、3。如果然后选择了三个 [0,3],那么下一个选择将有一个 [1,2,4] 池,依此类推。我希望这有 5 个级别,但当然是试图编写一个对级别数、值和限制条件任意的解决方案。 目标是在嵌套数组中传回所有排列。我将使用这个数组来构建一个用于可视化的 DataFrame。

我的第一次尝试是使用itertools permutations 为这 10 个值创建所有排列,然后根据与前一个条目的距离从那些不符合我的条件的排列中删除。这似乎效率低下,但我也很难确定移除的条件。

编辑:我没有正确指定选择过程始终以 [0,1,2] 作为第一选择。根据可用的下一个等级(例如 10 的最大等级)在每个等级中添加额外的选项。因此,如果在第一等级选择 2,则“3”代替它。 [0,1,3] 是下一个可用的选择。如果选择 1,则您在下一级有 [0,3,4] 可供选择。这一直持续到您达到说 5 个选择的最大长度。

【问题讨论】:

  • 我无法理解您的选择通常是如何工作的。如果首先选择8,那么下一个池是什么?选择第二个数字后,池究竟如何变化?
  • 你能澄清一下吗?排列的第一个选择元素可以是 0 到 9 中的任何一个,还是只能从 [0, 1, 2] 的初始池中提取?一个完整的排列是否具有所有 10 个值,或者每个排列都可以是可变长度的?目前尚不清楚如何将您的示例扩展到您想要的行为的完整规范。
  • 我添加了一些说明。让我知道需要更多信息。

标签: python numpy permutation


【解决方案1】:

好的,如果我理解正确,这就是你描述的过程:

Reserve: [3, 4, 5, 6, 7, 8, 9]
Pool: [0, 1, 2]
Chosen: []

只要我们还没有 5 个 Chosen 项目,从 Pool 中删除任何项目并将其附加到所选序列。然后从Reserve 中删除first 项并将其附加到池中。根据需要重复。

我将使用 P 作为池的大小,使用 N 作为所选序列的长度。所以在这个例子中 P=3 和 N=5。

我仍然有点不确定这是否是您打算描述的过程,因为似乎 7、8 和 9 永远不会出现在所选序列中,但您确实说您正在尝试提出一个通用解决方案,所以我假设“reserve”实际上是无限大小的。

你的问题是,我们如何枚举所有可能的选择序列?

在此过程中,您要做的唯一选择是从池中提取哪个元素。你总是有 P (=3) 个选择。这些选择将总是是不同的项目(因为每个项目只有一个)。只要您确信没有两个不同的选择序列可能导致相同的项目序列,您现在就可以看到您恰好有 PN 个可能的序列。剩下的唯一棘手的事情是将选择索引序列转换为选择值序列。我建议简单地执行我们上面描述的算法,而不是做任何聪明的事情。

from itertools import (product, count)

def generate_sequences(pool_size, n):
    for choice_sequence in product(range(pool_size), repeat=n):
        pool = list(range(pool_size))
        sequence = []
        reserve = count(pool_size)
        for choice_index in choice_sequence:
            sequence.append(pool[choice_index])
            pool[choice_index] = next(reserve)
        yield sequence

我认为这行得通。为了简化问题,而不是从池的中间删除一个选定的项目并将新项目从储备池的末端附加到池的末端,我将新项目放入由所选项目腾出的插槽中。这会改变我们发出序列的顺序,但我认为它不应该改变生成的整个序列集。

可能有一种更简单的方法可以做到这一点,但我认为这在时间复杂度方面几乎是一样的。


这里未解决的是基本项目集(我们称其大小为 R)是否可能受到限制。显然,必须是 R ≥ N 或者您根本无法选择 N 个项目。然而,如果 R 可以选择 N 个项目,但不可能维持一个大小为 P 的恒定池 - 最终你没有项目可以添加到储备中。这是可以克服的,但很繁琐。我会把它留作练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多