Digamos que temos 10 pessoas, cada uma com uma lista de livros favoritos. Para uma determinada pessoa X, gostaria de encontrar um subconjunto especial dos livros de X gostado apenas de X, ou seja, não há outra pessoa que goste de todos os livros no subconjunto especial de X. Penso neste subconjunto especial como uma "impressão digital" única para o X.
Gostaria muito de receber sugestões sobre uma abordagem para encontrar esses conjuntos. (Embora isso pareça um problema de lição de casa, está relacionado a um problema na minha pesquisa de biologia que estou tentando resolver.)
algorithms
sets
edron79
fonte
fonte
Respostas:
Suponho que você queira que a impressão digital seja a menor possível. Então, este é o problema do Conjunto de ocorrências : Para cada pessoa, faça uma lista de todos os livros de que o X gostou, mas não dessa pessoa. Em seguida, o objetivo é selecionar pelo menos um livro de cada lista. O problema é difícil para o NP, então você não pode esperar encontrar um algoritmo que sempre o resolva de maneira ideal em tempo polinomial. O algoritmo ganancioso tem um péssimo limite teórico, mas geralmente funciona bastante decente na prática. Se você deseja resolvê-lo da melhor maneira possível, um solucionador de Programação Linear Inteira deve ser capaz de resolver instâncias de até 1000 ou talvez 10000 livros. Se você fornecer mais detalhes sobre o tamanho e a estrutura de suas instâncias, sugerimos outras abordagens.
fonte
Este não é um algoritmo particularmente inteligente, mas é polinomial e acho que deve funcionar. Pegue qualquer conjunto. Para cada elemento deste conjunto, conte o número de conjuntos restantes que não o contêm e lembre-se de quais conjuntos o contêm. Escolha o elemento com a contagem mais alta e refaça as contagens dos elementos restantes, ignorando os conjuntos que não possuem o elemento que você acabou de escolher. Continue até que todos os conjuntos restantes tenham sido eliminados de consideração.
Não pensei muito nisso, mas intuitivamente, parece que deveria funcionar. A idéia é tomar avidamente como o próximo elemento da impressão digital definir o item que cobre os conjuntos mais descobertos.
fonte
fingerprint books
Deixe-me demonstrar no código python:
O código é impresso:
fonte
Este é o OP (não foi registrado no envio inicial, agora não posso comentar corretamente). Muito obrigado pelo feedback - a solução original do algoritmo guloso levou-me na direção certa. O espaço total em que estou trabalhando diz respeito a centenas de indivíduos e milhares de "livros" - se isso for possível com a abordagem de programação inteira, eu adoraria ouvir mais sobre isso.
fonte