Suponha que eu sou um programador e tenho um problema NP-completo que preciso resolver. Quais métodos estão disponíveis para lidar com problemas de NPC? Existe uma pesquisa ou algo semelhante sobre este tópico?
Suponha que eu sou um programador e tenho um problema NP-completo que preciso resolver. Quais métodos estão disponíveis para lidar com problemas de NPC? Existe uma pesquisa ou algo semelhante sobre este tópico?
Respostas:
Existem várias estratégias bem estudadas; o que é melhor em sua aplicação depende das circunstâncias.
Melhorar o tempo de execução do pior caso
Usando o insight específico do problema, você pode melhorar o algoritmo ingênuo. Por exemplo, existemalgoritmos para Vertex Cover com c < 1,3 [1]; isso é uma grande melhoria em relação ao ingênuo Ω ( 2 n ) e pode tornar os tamanhos das instâncias relevantes para você.
Aprimore o tempo de execução esperado
Usando heurísticas, você pode criar algoritmos que são rápidos em muitas instâncias. Se esses incluem a maioria dos que você conhece na prática, você é de ouro. Exemplos são SAT para os quais existem solucionadores bastante envolvidos, e o algoritmo Simplex (que resolve um problema polinomial, mas ainda assim). Uma técnica básica que geralmente é útil é ramificar e vincular .
Restrinja o problema
Se você puder fazer mais suposições sobre suas entradas, o problema pode se tornar fácil.
Diminuir o resultado
Isso significa que você tolera resultados incorretos ou incompletos. Existem dois sabores principais:
Consulte Algoritmics for Hard Problems, da Hromkovič, para obter um tratamento completo.
Outras respostas abordaram isso de uma perspectiva mais teórica. Aqui está uma abordagem mais prática.
Para problemas de decisão "típicos" completos com NP ( "existe algo que satisfaça todas essas restrições?" ), É isso que eu sempre tentaria primeiro:
Escreva um programa simples que codifique sua instância do problema como uma instância SAT .
Depois, pegue um bom solucionador SAT , execute-o (usando o computador multi-core mais rápido que você possui) e veja o que acontece.
Tente com instâncias menores primeiro para ter uma idéia de quanto tempo pode levar.
Surpreendentemente, essa abordagem é muito melhor do que tentar implementar seu próprio solucionador especificamente para o seu problema atual:
Os solucionadores SAT são muito inteligentes e bem otimizados. Eles superam facilmente sua própria implementação de pesquisa de retorno (não importa quanto tempo você gaste otimizando seu código). Eles também superam facilmente muitas alternativas off-the-self, como solucionadores de programação linear inteira.
Isso requer muito pouca programação. O passo 1 é relativamente simples e não é crítico para o desempenho; você pode usar linguagens de script como Python. Outra pessoa já se encarregou de implementar tudo o que você precisa para a etapa 2.
Para problemas típicos de otimização NP-hard ( "encontre a menor coisa que satisfaça todas essas restrições" ), essa abordagem pode ou não funcionar.
Se você pode transformá-lo facilmente em um problema de decisão ( "existe algo de tamanho 4 que satisfaça todas essas restrições?" , "E quanto ao tamanho 3?" ), Ótimo, siga a mesma abordagem acima com problemas de decisão.
Caso contrário, convém recorrer a um solucionador heurístico que tente encontrar uma solução pequena (não necessariamente a menor ). Por exemplo:
Codifique seu problema como uma instância MAX-SAT (ponderada) .
Use os solucionadores heurísticos do pacote UBCSAT . Os solucionadores heurísticos paralelizam trivialmente; tente encontrar um cluster de computadores com centenas de computadores. Você pode executar os solucionadores o quanto quiser e, em seguida, pegar a melhor solução que você encontrou até agora.
Uma maneira de atacar a intratabilidade é pensar no problema no contexto de complexidade parametrizada.
Estes são alguns exemplos em diferentes classes da hierarquia W:
Esse é outro nível de complexidade para classificar os problemas de NP de maneira mais precisa e, se você quiser mais, pode analisar a Complexidade do circuito parametrizado e a Hierarquia W de Downey et al (1998).
E se você quiser ainda mais, leia a Teoria da Complexidade Parametrizada de Flum and Grohe .
E finalmente:
Sabe-se que, se o problema tem FPTAS ( esquema de aproximação em tempo totalmente polinomial ), também é FPT (o que é óbvio). Não existe uma relação muito estreita entre PTAS e hierarquia W (pelo menos não sei neste momento).
Também em alguns casos, podemos corrigir alguns parâmetros diferentes, por exemplo: o comprimento de um caminho mais longo no gráfico é limitado e o tamanho de uma solução é limitado (por exemplo, no conjunto de vértices de feedback), ...
Pode haver pessoas que acreditam que a complexidade parametrizada é inútil na prática. Mas isso está errado. Muitos algoritmos parametrizados são descobertos em aplicativos do mundo real, quando você pode corrigir alguns parâmetros, aqui está um exemplo:
Um dos algoritmos heurísticos mais rápidos e precisos para o TSP é: mesclagem de tour e decomposição de ramificação , que usa a parametrização do problema (não diretamente, mas a decomposição de ramificação e a abordagem de programação dinâmica usada com base em algumas boas suposições).
A completude do NP é sobre a intratabilidade do pior caso. Dependendo do problema em que você está trabalhando, muitas classes de instâncias podem ser solucionadas em um tempo razoável na prática (embora seja necessário um algoritmo mais especializado para obter os bons tempos de execução).
Considere verificar se há uma redução eficiente do seu problema para um problema com bons solucionadores disponíveis, como Satisfação Booleana ou Programação Linear Inteira.
Embora abordado brevemente em algumas das respostas, deixe-me enfatizar que, na prática, os problemas de NP-completos são resolvidos (ou aproximados) o tempo todo. A principal razão pela qual você pode resolver problemas completos de NP na prática é:
Instâncias encontradas na prática não são "piores casos".
Outro motivo para a discrepância é:
É difícil analisar algoritmos heurísticos formalmente.
Na prática, você usa algoritmos heurísticos para resolver seus problemas NP-completos e torcer pelo melhor. Os resultados geralmente são impressionantes.
Outra questão abordada em outras respostas é:
Às vezes, algoritmos exponenciais são rápidos o suficiente.
Isso, é claro, depende do problema. Quando o big data está envolvido, temos a máxima oposta:
Às vezes, os únicos algoritmos viáveis são quaseilineares.
Receio que a multidão aqui seja bastante teórica. Você pode obter melhores respostas no site principal de stackexchange.