Existe alguma estratégia para a busca por força bruta?

7

Não sei como defini-lo com elegância, mas basicamente quero implementar um algoritmo de pesquisa de força bruta, mas existem muitas maneiras diferentes de enumerar através do espaço de pesquisa. Isso pode ser ingênuo da minha parte, mas imagino que a maneira como escolho enumerar através do espaço de pesquisa possa afetar muito se meu algoritmo funciona ou não na prática.

Considere o seguinte problema de decisão como um exemplo simplificado.

Entrada: Um polinômio com coeficientes inteiros e um número natural .p(x)k

Pergunta: Existe tal que ?i[k]p(i)=0

Agora, pode haver muitos algoritmos diferentes para resolver esse problema, mas decido escolher uma abordagem de força bruta. Considere as seguintes estratégias para enumerar através do espaço de pesquisa.

Estratégia Ascendente: Eu poderia verificar se é 0, então , então , ..., até encontrar um tal que ou tente cada .p(1)p(2)p(3)ip(i)=0i[k]

Estratégia descendente: eu poderia verificar se é 0, então , então , ..., até encontrar um tal que ou tente todo .p(k)p(k1)p(k2)ip(i)=0i[k]

Popularidade Estratégia: Eu poderia armazenar uma lista pequena da maioria das soluções populares e julgar os primeiro antes de tentar os números em .L[k]L

Estratégia da peneira: eu poderia fazer uma espécie de enumeração da peneira. Eu tento todos os números divisíveis por 2 em , depois os números divisíveis por 3 em , depois 5, depois 7, depois 11, depois 13 e assim por diante. (Supondo que eu tenha acesso a uma grande lista pré-calculada de números primos.)[k][k]

Estratégia de aleatoriedade: Talvez exista uma estratégia de enumeração interessante que utilize uma grande seqüência de bits aleatórios.

Basicamente, pretendo responder às seguintes perguntas sobre algoritmos de pesquisa de força bruta:

Pergunta A: Existem benefícios em escolher uma estratégia de enumeração específica?

Pergunta B: Existem exemplos de problemas de pesquisa em que, na prática, você escolheria uma estratégia de enumeração interessante? Sinto que pode haver alguns problemas de pesquisa em que, na prática, uma variante da Estratégia de Popularidade funciona efetivamente.

Michael Wehar
fonte
3
Você quer dizer "força bruta" no sentido estrito de tentar todas as entradas possíveis, usando nenhuma informação obtida de uma entrada para escolher entradas futuras ? Essa definição específica de força bruta é relevante porque é trivialmente paralela, mas é compatível com todas as suas estratégias sugeridas. OTOH, a resposta de Juho fala sobre "podar o espaço de pesquisa", que exclui várias entradas com base nas informações obtidas de apenas uma entrada.
MSalters 14/10/15
11
Um boato - eu calculei o estágio ideal do foguete para o Kerbal Space Program algumas vezes com uma pesquisa alfa / beta / heurística (força bruta basicamente direcionada que corta árvores de pesquisa que não podem ser a melhor resposta), e ajustes manuais de prioridades podem torná-lo ordens de magnitude mais rápidas. Em particular, expandir ocasionalmente um nó com uma boa heurística em oposição ao melhor alfa parece ajudar significativamente, pois não há uma maneira barata, mas boa, de calcular o alfa que eu encontrei. Portanto, a resposta é afirmativa à pergunta A.
TLW
11
@MSalters Você fez um bom argumento com seu comentário. Eu o chamei de busca por força bruta porque, se não houver solução, você ainda tentaria cada elemento do espaço de pesquisa (pouca ou nenhuma poda). No entanto, você pode usar o conhecimento anterior adquirido para determinar de maneira inteligente a ordem na qual você enumera através do espaço de pesquisa. Além disso, como você mencionou, alterando a ordem de enumeração, você pode dificultar a paralelização.
22615 Michael Wehar
11
Para seu exemplo específico, você tem soma e produto de raízes que podem simplificar a pesquisa.
Mark Hurd
Este post discute a complexidade da busca por força bruta: cstheory.stackexchange.com/questions/14404/...
Michael Wehar

Respostas:

5

A resposta para ambas as suas perguntas é sim! Definitivamente, mesmo que, na pior das hipóteses, você precise enumerar todo o espaço de pesquisa com força bruta (para provar que não há solução), faz sentido considerar como você percorre o espaço de pesquisa. Em geral, você encontrará muita literatura e discussão sobre o tópico no campo da IA ​​e, em particular, por exemplo, resolução de SAT / CSP. Uma introdução rápida e suave é dada pelo livro de Russell e Norving.

Eu gosto de usar o quebra-cabeça Sudoku como exemplo. Para decidir se um quebra-cabeça parcialmente preenchido tem uma solução, você pode verificar exaustivamente todas as formas possíveis de concluí-lo. A abordagem ingênua é uma busca cega por retroceder. Isso é extremamente inútil. Uma idéia melhor é a seguinte: para a próxima célula a ser atribuída, sempre escolha a que tiver menos valores legais. Em geral, essa é uma "heurística de falha em primeiro lugar", e a intuição é que essa escolha provavelmente falhará em breve e, assim, remove a árvore de pesquisa de forma agressiva. Na verdade, existe uma "sabedoria" conhecida no campo: "para ter sucesso, você deve falhar rapidamente". Grosso modo, quanto mais cedo você falha, mais rápido consegue concentrar seu esforço na parte mais difícil do problema.

Pode parecer que o exposto acima é muito específico do problema, e só se aplica a dizer quebra-cabeças do Sudoku. Felizmente, este não é o caso. É bastante útil modelar seu problema ou tentar vê-lo, como por exemplo, uma instância SAT / CSP. Em seguida, você pode aplicar imediatamente truques conhecidos para acelerar sua força bruta, criar melhores heurísticas e assim por diante. Obviamente, você pode fazer várias magnitudes melhor usando um bom solucionador de CSP / SAT em vez de força bruta. Isso é benéfico, mesmo que nada seja consideravelmente melhor que a força bruta para o seu problema. Isso se deve ao fato de que as instâncias tendem a ter uma estrutura que pode ser explorada por solucionadores inteligentes e é difícil detectar você mesma a mesma estrutura com, por exemplo, força bruta.

Uma resposta minha mais antiga dá um pouco mais de concretude. Acho que todas as estratégias mencionadas foram experimentadas, principalmente a aleatoriedade. Por exemplo, estratégias de reinicialização aleatória são muito poderosas e estão em uso em solucionadores modernos.

Juho
fonte
3

A força bruta pode de fato ser um pouco melhorada pelas heurísticas, com base em algum conhecimento do problema em questão.

Não existe uma estratégia universal que possa funcionar em qualquer lugar, especialmente se for cega (independente da história de resultados para diferentes ensaios). Além disso, provavelmente existem problemas que não existem em nenhuma estratégia.

Um exemplo de estratégia heurística é o recozimento simulado, no qual você assume que, quanto melhores as soluções encontradas, mais próximo do ideal. Essa propriedade pode não ser válida para outras questões.

Pergunta A : não, não existe uma estratégia geral a ser aplicada às cegas.

Yves Daoust
fonte
@ Juho: ok, estou descartando B, pois o OP está pedindo exceções à regra.
Yves Daoust