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 M 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).
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 M seria um conjunto de cores com a propriedade de que cada A bandeira nacional usa pelo menos uma das cores . ( As cores olímpica azul, preto, vermelho, verde, amarelo e branco são um exemplo desse , ou pelo menos eram em 1920.)
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.)
fonte
Respostas:
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 entradan 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).
fonte
fonte
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 :)
fonte
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.
fonte