生成组合的组合

时间:2014-04-29 16:30:03

标签: combinations

我试图使用这六个组件生成代码,这些代码将采用各种组合排列(组合)一个,两个,三个或四个单元的组件(即af),并提供各种非重复组合组合(combo.combo),其中包含所有组件(即[ab + cdef和ac + bde + f]但不包含[ae + bc + df和aef + bc + d])。

如果此代码允许我1)输入组件数量,2)输入每个组合的最小和最大单位长度,3)输入每个combo.combo的最小和最大组合数量,这将是很好的,以及4)随机化combo.combos的输出列表。

可能从某种迭代循环开始生成720种可能的组件组合(a-f)的每个版本,然后根据设置的限制参数开始修剪该列表?我已经掌握了python的一些工作知识并将开始使用,但任何提示或建议都是最受欢迎的。

combo.combo    a    b    c    d    e    f
a.bcdef        1    1    1    1    1    1
ab.cdef        1    1    1    1    1    1
abc.def        1    1    1    1    1    1
abcd.ef        1    1    1    1    1    1
abcde.f        1    1    1    1    1    1
a.b.cdef       1    1    1    1    1    1
a.bc.def       1    1    1    1    1    1
a.bcd.ef       1    1    1    1    1    1
a.bcde.f       1    1    1    1    1    1
ab.c.def       1    1    1    1    1    1

我发现很多代码会产生组合排列但不会产生组合的组合。我已经为组合组件包含了一个二进制矩阵,但我仍然坚持从这里开始,或者这个矩阵是一个错误的开始(虽然是一个有用的视觉助手。)

combo   a   b   c   d   e   f
a       1   0   0   0   0   0
b       0   1   0   0   0   0
c       0   0   1   0   0   0
d       0   0   0   1   0   0
e       0   0   0   0   1   0
f       0   0   0   0   0   1
ab      1   1   0   0   0   0
ac      1   0   1   0   0   0
ad      1   0   0   1   0   0
ae      1   0   0   0   1   0
af      1   0   0   0   0   1
bc      0   1   1   0   0   0
bd      0   1   0   1   0   0
be      0   1   0   0   1   0
bf      0   1   0   0   0   1
cd      0   0   1   1   0   0
ce      0   0   1   0   1   0
cf      0   0   1   0   0   1
de      0   0   0   1   1   0
df      0   0   0   1   0   1
ef      0   0   0   0   1   1
abc     1   1   1   0   0   0
abd     1   1   0   1   0   0
abe     1   1   0   0   1   0
abf     1   1   0   0   0   1
acd     1   0   1   1   0   0
ace     1   0   1   0   1   0
acf     1   0   1   0   0   1
ade     1   0   0   1   1   0
adf     1   0   0   1   0   1
aef     1   0   0   0   1   1
bcd     0   1   1   1   0   0
bce     0   1   1   0   1   0
bcf     0   1   1   0   0   1
bde     0   1   0   1   1   0
bdf     0   1   0   1   0   1
bef     0   1   0   0   1   1
cde     0   0   1   1   1   0
cdf     0   0   1   1   0   1
cef     0   0   1   0   1   1
def     0   0   0   1   1   1
abcd    1   1   1   1   0   0
abce    1   1   1   0   1   0
abcf    1   1   1   0   0   1
abde    1   1   0   1   1   0
abdf    1   1   0   1   0   1
abef    1   1   0   0   1   1
acde    1   0   1   1   1   0
acdf    1   0   1   1   0   1
acef    1   0   1   0   1   1
adef    1   0   0   1   1   1
bcde    0   1   1   1   1   0
bcdf    0   1   1   1   0   1
bcef    0   1   1   0   1   1
bdef    0   1   0   1   1   1
cdef    0   0   1   1   1   1

1 个答案:

答案 0 :(得分:0)

首先想到的方法是:

  1. 使用给定的组件生成所有组合(您已经做过:))
  2. 将结果组合视为一组新的组件(因此,您的组合将包含a,ab,abc,...而不是a,b,...,等等)
  3. 从第二组
  4. 生成所有组合
  5. 来自新的组合仅保留适用于您的条件的那些(从您的示例中不太清楚约束是什么)
  6. 当然,这具有极高的指数复杂性,因为你必须回溯两次,而第3步有更多的可能性。

    很可能有一种更有效的算法,从约束开始(“包含所有组件的非复制组合组合”)。