Dado um conjunto de conjuntos, encontre os menores conjuntos contendo pelo menos um elemento de cada conjunto

15

Dado um conjunto de conjuntos, eu gostaria de encontrar um conjunto M tal que cada conjunto S em S contém pelo menos um elemento de M . Eu também gostaria de MSMSSMM contivesse o mínimo possível de elementos enquanto ainda atendesse a esse critério, embora possa existir mais de um menor com essa propriedade (a solução não é necessariamente única).M

Como um exemplo concreto, suponha que o conjunto seja o conjunto de bandeiras nacionais e, para cada bandeira S em S , os elementos sejam as cores usadas na bandeira da nação. Os Estados Unidos teria S = { r e d , w h i t e , b l u e } e Marrocos teria S = { r e d , g r e e n } . Então MSSSS={red,white,blue}S={red,green}M seria um conjunto de cores com a propriedade de que cada A bandeira nacional usa pelo menos uma das cores . (M As cores olímpica azul, preto, vermelho, verde, amarelo e branco são um exemplo desse , ou pelo menos eram em 1920.)M

Existe um nome geral para esse problema? Existe um algoritmo "melhor" aceito para encontrar o conjunto ? (Estou mais interessado na solução em si do que em otimizar o processo para complexidade computacional.)M

Bdesham
fonte
2
Você pode estar procurando pelo problema da tampa do aparelho ?
Juho
@ Juho Não é bem assim. No meu exemplo, o problema da tampa do conjunto seria encontrar um conjunto de sinalizadores de modo que a união desses sinalizadores contenha todas as cores usadas em todos os sinalizadores. Por outro lado, estou procurando algo que cuspa apenas uma lista de cores, não uma lista de sinalizadores, e não preciso que o conjunto contenha todas as cores possíveis. Vou dar uma olhada nessa área na Wikipedia, acho que você me colocou no caminho certo. Obrigado! M
precisa saber é

Respostas:

13

O problema é o conhecido NP-complete problem Hitting Set . Está intimamente relacionado com a Set-Cover . A prova de completude do NP pode ser encontrada no livro clássico de Garey e Johnson .

Se você quiser aproximar, poderá traduzir sua instância primeiro para Set-Cover e, em seguida, aplique um algoritmo de aproximação para Set-Cover. No entanto, Set-Cover não pode ser aproximado por um fator constante no tempo polinomial, a menos que P = NP, como mostrado por Lund e Yannakakis .

Se você estiver interessado em soluções exatas e suas entradas se comportarem bem, eu recomendaria o uso de um tratável de parâmetro fixo . O tempo de execução aqui é expresso não apenas em termos do comprimento de entrada n mas também em termos de um parâmetro adicional k . Se o tempo de execução é O(f(k)nO(1)) , chamamos o algoritmo de algoritmo FPT. Aqui, f(k) é uma função crescente. Portanto, se k é constante, temos um algoritmo polytime. O primeiro capítulo do livro de Flum e Grohe , explica um algoritmo FPT para acertar o conjunto (mais precisamente para p conjunto de batidas de -card). O algoritmo é fácil de implementar e usa o método de árvores de pesquisa limitadas. Ainda assim, ele precisa de muito espaço para explicar aqui, basicamente você divide a busca de força bruta (?) Necessária em pedaços pequenos (quando k é pequeno).

A.Schulz
fonte
Obrigado. Você pode fornecer uma referência para um lugar para ler sobre implementações reais? Ou seja, como eu traduziria meu problema para um problema de cobertura do jogo e como resolveria isso?
bdesham
11
bdesham, pense em cada elemento como o conjunto de conjuntos ao qual ele pertence. execute a tampa do conjunto na entrada de elementos como conjuntos. Além disso, leia a página wiki vinculada aqui.
Sasho Nikolov 22/08/2012
Você está interessado em uma solução aproximada ou deseja ter a solução exata?
A.Schulz
Eu gostaria de uma solução exata. Os conjuntos de dados com os quais estou trabalhando são pequenos o suficiente para não achar que isso seja um problema.
precisa saber é
11
@Keyser: Você está certo. No entanto, é prática comum associar o problema de decisão ao problema de otimização correspondente, uma vez que eles estão relacionados a problemas NP-completos.
A.Schulz
2

SsM={s}c{c}1MSAM=A. Eu posso estar errado no entanto.

saadtaame
fonte
2

Dê uma olhada no "A Theory of Diagnostic from First Principles", de Ray Reiter, onde ele fornece um algoritmo para computar conjuntos de batidas, e esta nota adicional "Uma correção ..." .

O algoritmo é geralmente conhecido como algoritmo "hit set tree", não deve ser muito difícil encontrar uma implementação. Você mencionou que não estava muito interessado em tempo de execução, mas otimizações como o encerramento antecipado de ramificações etc. são bastante críticas para a implementação e também interessantes :)

papercutexit
fonte
2
Você pode resumir o algoritmo para tornar sua resposta mais independente? Os links podem e vão quebrar.
Juho
0

Na prática, uma das melhores maneiras (certamente uma das mais fáceis) de resolver instâncias do Set Cover / Hitting Set é a programação inteira mista. Isso envolve comunicar a formulação de programação inteira ao solucionador de sua escolha.

barney
fonte