como encontrar todos os grupos de subconjuntos do conjunto A? Definir partições em Python
Eu quero encontrar um algoritmo que dado um conjuntoA
para encontrar todos os grupos de subconjuntos que atendem à seguinte condição:
x ∪ y ∪ .... z = A, onde x, y, ... z ∈ Grupo
e
∀ x, y ∈ Grupo: x ⊆ A, y ⊆ A, x ∩ y = ∅ = {}
e
∀ x ∈ Grupo: x! = ∅
Nota: Espero definir bem, não sou bom com símbolos matemáticos
Fiz a seguinte abordagem para pesquisar apenas grupos de dois subconjuntos:
from itertools import product, combinations
def my_combos(A):
subsets = []
for i in xrange(1, len(A)):
subsets.append(list(combinations(A,i)))
combos = []
for i in xrange(1, 1+len(subsets)/2):
combos.extend(list(product(subsets[i-1], subsets[-i])))
if not len(A) % 2:
combos.extend(list(combinations(subsets[len(A)/2-1], 2)))
return [combo for combo in combos if not set(combo[0]) & set(combo[1])]
my_combos({1,2,3,4})
Eu recebo a seguinte saída, estes são todos os grupos compostos por dois subconjuntos
[
((1,), (2, 3, 4)),
((2,), (1, 3, 4)),
((3,), (1, 2, 4)),
((4,), (1, 2, 3)),
((1, 2), (3, 4)),
((1, 3), (2, 4)),
((1, 4), (2, 3))
]
..... mas, grupos compostos por um, três, quatro subconjuntos ...
Pergunta, questão:
como posso encontrar uma solução geral?
por exemplo, a seguinte saída esperada:
my_combos({1,2,3,4})
[
((1,2,3,4)),
((1,2,3),(4,)),
((1,2,4),(3,)),
((1,3,4),(2,)),
((2,3,4),(1,)),
((1,2),(3,4)),
((1,3),(2,4)),
((1,4),(2,3)),
((1,2),(3,),(4,)),
((1,3),(2,),(4,)),
((1,4),(2,),(3,)),
((1,),(2,),(3,4)),
((1,),(3,),(2,4)),
((1,),(4,),(2,3)),
((1,),(4,),(2,),(3,))
]