Definir capa ou conjunto de batidas; Numpy, menos combinações de elementos para compor o conjunto completo

Meu objetivo é encontrar o menor número possível de subconjuntos [a-f] para compor o conjunto completo A.

A = set([1,2,3,4,5,6,7,8,9,10]) # full set


#--- below are sub sets of A ---

a = set([1,2])
b = set([1,2,3])
c = set([1,2,3,4])
d = set([4,5,6,7])
e = set([7,8,9])
f = set([5,8,9,10])

Na realidade, o conjunto pai A com o qual estou lidando contém 15k elementos exclusivos, com 30k subconjuntos e esses subconjuntos variam em comprimentos de um único elemento único a 1.5k elementos únicos.

A partir de agora, o código que estou usando se parece mais ou menos com o seguinte e é incrivelmente lento:

import random


B = {'a': a, 'b': b, 'c': c, 'd': d, 'e': e, 'f': f}
Bx = B.keys()
random.shuffle(Bx)

Dict = {}

for i in Bx: # iterate through shuffled keys.
    z = [i]
    x = B[i]
    L = len(x)

    while L < len(A):
        for ii in Bx:
            x = x | B[ii]
            Lx = len(x)
            if Lx > L:
                L = Lx
                z.append(ii)

    try:
        Dict[len(z)].append(z)
    except KeyError:
        Dict[len(z)] = [z]

print Dict[min(Dict.keys()]

Isso é apenas para dar uma idéia da abordagem que adotei. Para maior clareza, deixei de lado uma lógica que minimiza as iterações em conjuntos que já são grandes demais e outras coisas assim.

Eu imagino que o Numpy seria MUITO bom nesse tipo de problema, mas não consigo pensar em uma maneira de usá-lo.

questionAnswers(3)

yourAnswerToTheQuestion