Lidando com a intratabilidade: problemas NP-completos


43

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?


4
Será útil indicar qual é o seu problema.
Dave Clarke

2
Esta pergunta não é sobre um problema específico. Quero conhecer as técnicas para poder aplicá-las no futuro, se necessário.
Anonymous

1
É como perguntar: como eu resolvo um problema no tempo polinomial em geral? Existem zilhões de problemas e cada um tem sua própria solução especializada.
Dave Clarke

3
@ DaveClarke: Existem técnicas estabelecidas, então acho que a pergunta é válida; uma pergunta mais focada pode ser melhor, no entanto.
Raphael

Respostas:


54

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ê.O(cn)c<1.3Ω(2n)

  • 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.

    • Propriedades estruturais
      Suas entradas podem ter propriedades que simplificam a solução do problema, por exemplo, planaridade, bipartididade ou falta de um menor para gráficos. Veja aqui alguns exemplos de classes de gráfico para as quais o CLIQUE é fácil.

    • O(2knm)kmkn
    • Quantidades de entrada limitadas
      Além disso, alguns problemas admitem algoritmos executados em tempo pseudo-polinomial , ou seja, seu tempo de execução é limitado por uma função polinomial em um número que faz parte da entrada; a ingênua verificação de primalidade é um exemplo. Isso significa que, se as quantidades codificadas em suas instâncias tiverem um tamanho razoável, você poderá ter algoritmos simples que se comportam bem para você.
  • 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.


  1. Simplicidade é beleza: limites superiores aprimorados para cobertura de vértices por Chen Jianer, Iyad A. Kanj, Ge Xia (2005)

4
claro, um Monte Carlo ou um algoritmo de Las Vegas é muito improvável para ser executado em polytime em um problema NP-hard
Sasho Nikolov

12

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:

  1. Escreva um programa simples que codifique sua instância do problema como uma instância SAT .

  2. 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:

  1. Codifique seu problema como uma instância MAX-SAT (ponderada) .

  2. 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.


8

Complexidade parametrizada

Uma maneira de atacar a intratabilidade é pensar no problema no contexto de complexidade parametrizada.

kf(k)p(n)kf(k)

O(nf(k))

Estes são alguns exemplos em diferentes classes da hierarquia W:

  1. A cobertura do vértice é FPT (o mesmo ocorre com os caminhos separados do vértice em gráficos não direcionados)
  2. Conjunto independente e Clique são ambos completos W [1]
  3. O conjunto dominante é W [2] -Completo.

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:

Complexidade parametrizada versus algoritmos de aproximação:

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), ...

Exemplos de usos práticos:

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:

  1. 2...2O(n)2O(k)k=10

  2. 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).


5

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.


4

vivjvkGGuse um algoritmo tolerável para resolver seu problema em tempo exponencial . Entre os algoritmos exponenciais, o tempo de execução de alguns deles pode ser tolerável quando o tamanho da entrada do seu problema for menor que um valor específico.


2

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.