Eu tenho um problema de decisão NP-completo. Dada uma instância do problema, eu gostaria de criar um algoritmo que produza SIM, se o problema for possível e, NÃO, caso contrário. (Obviamente, se o algoritmo não for ideal, ele cometerá erros.)
Não consigo encontrar algoritmos de aproximação para esses problemas. Eu estava procurando especificamente pelo SAT e encontrei na página da Wikipedia sobre o algoritmo de aproximação o seguinte: Outra limitação da abordagem é que ela se aplica apenas a problemas de otimização e não a problemas de decisão "puros", como a satisfação, embora muitas vezes seja possível .. .
Por que não definimos, por exemplo, a taxa de aproximação como algo proporcional ao número de erros que o algoritmo comete? Como realmente resolvemos os problemas de decisão de maneira gananciosa e subótima?
— Ribz
Existem algoritmos de aproximação para MAX-SAT.
MAX-SAT não é um problema de decisão, não?
Os algoritmos de aproximação são sempre para problemas de otimização.
Então, basicamente, você quer ter um algoritmo que termine rapidamente, mas que possa ocasionalmente dar a resposta errada. Eu acho que você está confundindo muito os problemas usando termos bem definidos, como "algoritmo de aproximação" e "ótimo" aqui. Aqueles têm significados muito específicos. Acho que você está procurando uma heurística - se você atualizar sua pergunta com esse termo (ou começar do zero com uma nova pergunta para evitar ainda mais confusão), poderá obter melhores resultados.
Embora essa não seja uma resposta completa, ela explica parte do motivo: existem problemas importantes no SAT para os quais apenas o bit baixo errado não é melhor do que metade dos bits errado.
Os algoritmos de aproximação são apenas para problemas de otimização, não para problemas de decisão.
Por que não definimos a taxa de aproximação como a fração de erros que um algoritmo comete ao tentar resolver algum problema de decisão? Como "a razão de aproximação" é um termo com um significado padrão bem definido, que significa outra coisa, e seria confuso usar o mesmo termo para duas coisas diferentes.
OK, poderíamos definir alguma outra relação (vamos chamá-la de outra coisa - por exemplo, "a relação det") que quantifica o número de erros que um algoritmo comete, para algum problema de decisão? Bem, não está claro como fazer isso. Qual seria o denominador dessa fração? Ou, dito de outra maneira: haverá um número infinito de instâncias de problemas e, para algumas delas, o algoritmo dará a resposta certa e outras para a resposta errada; portanto, você terá uma proporção que é "algo dividido pelo infinito", e isso acaba sendo sem sentido ou não definido.
Como alternativa, poderíamos definir como a fração de erros dos erros do algoritmo, em instâncias de problemas do tamanho n . Então, poderíamos calcular o limite de r n como n → ∞ , se esse limite existir. Isso fariarnrnnnrnrnn → ∞n→∞seja bem definido (se o limite existir). No entanto, na maioria dos casos, isso pode não ser muito útil. Em particular, assume implicitamente uma distribuição uniforme nas instâncias de problemas. No entanto, no mundo real, a distribuição real nas instâncias de problemas pode não ser uniforme - geralmente está muito longe de ser uniforme. Consequentemente, o número que você obtém dessa maneira geralmente não é tão útil quanto você poderia esperar: geralmente dá uma impressão enganosa de quão bom é o algoritmo.
Para saber mais sobre como as pessoas lidam com a intratabilidade (dureza do NP), dê uma olhada em Lidando com o intratabilidade: problemas completos do NP .
+1. Mas o último ponto não é sólido, pode-se argumentar que você pode definir a taxa de aproximação como o limite, pois n vai ao infinito do número de erros que o programa comete na entrada do comprimento n sobre o número de cadeias de comprimento n. Isso obviamente não é útil, pois muitas vezes um programa simples que apenas gera "SIM" (ou "NÃO") atinge uma boa proporção (às vezes até 1!).
@det, essa é uma pergunta separada, que você deve fazer separadamente (depois de ler sobre isso em livros-texto padrão ou recursos on-line). Preferimos que você faça apenas uma pergunta por postagem.
@aelguindy, bom ponto. Atualizei minha resposta de acordo.
@det Por que ganancioso? O que significa "quase" resolver um problema de decisão?
@ Mehrdad: Geralmente você avalia um algoritmo de aproximação pelo seu pior erro: um limite superior de quão não ideal ele é. Assim, por exemplo, você pode dizer que um determinado algoritmo de aproximação sempre encontra um resultado que é pelo menos cinco sextos do resultado ideal. Não há como traduzir isso para um problema de decisão; se o seu algoritmo algumas vezes emitir (digamos) 0,1, ou então será desativado em 0,9 (nesse caso, seria melhor, no pior caso, sempre emitir 0,5), ou o "aproximado" será uma farsa e "0,1 "na verdade significa apenas" 0 ".
O motivo pelo qual você não vê razões de aproximação nos problemas de tomada de decisão é que elas geralmente não fazem sentido no contexto das perguntas que normalmente são feitas sobre problemas de tomada de decisão. Em uma configuração de otimização, faz sentido porque é útil estar "próximo". Em muitos ambientes, isso não faz sentido. Não faz sentido ver com que frequência você está "próximo" em um problema discreto de logaritmo. Não faz sentido ver com que frequência você está "próximo" de encontrar um isômero de gráfico. E da mesma forma, na maioria dos problemas de tomada de decisão, não faz sentido estar "próximo" da decisão certa.
Agora, em implementações práticas, há muitos casos em que é útil saber qual parte dos problemas pode ser decidida "rapidamente" e qual parte não. No entanto, diferentemente da otimização, não existe uma maneira única de quantificar isso. Você pode fazer isso estatisticamente, como sugere, mas apenas se souber a distribuição estatística de suas entradas. Na maioria das vezes, as pessoas interessadas em problemas de decisão não têm a mesma sorte de ter essas distribuições.
Como um estudo de caso, considere o problema da parada. Sabe-se que o problema da parada é indecidível. É uma pena, porque é um problema realmente útil para resolver se você estiver criando um compilador. Na prática, no entanto, descobrimos que a maioria dos programas é realmente muito fácil de analisar a partir de uma perspectiva de problemas interrompidos. Os compiladores aproveitam isso para gerar código ideal nessas circunstâncias. No entanto, um compilador deve reconhecer que existe a possibilidade de um determinado bloco de código não ser decidido. Qualquer programa que dependa do código "provavelmente decidível" pode ter problemas.
No entanto, a métrica usada pelos compiladores para determinar o desempenho deles na resolução desses casos particulares do problema de parada é muito diferente de uma métrica usada por um programa de criptografia para testar se um par específico de números primos é aceitavelmente reforçado contra ataques. Não existe um tamanho único para todas as soluções. Se você deseja uma métrica desse tipo, convém adaptá-la para se ajustar ao espaço de problemas e à lógica de negócios específicos.
Então, pelo que entendi, a única maneira de resolver um problema de decisão é projetar o algoritmo ideal que pode ser muito ineficiente? Porque eu tenho um problema de decisão (NP-completo) e me pediram para criar um algoritmo guloso (rápido) para encontrar uma solução. Como posso resolver isso? Você conhece algum artigo que se concentre nesse tipo de problema?
— Ribz 8/11
@det Volte e recupere o problema. Se você tiver um problema completo de NP, ficará um pouco preso, mas é altamente provável que você não precise realmente resolvê-lo. Por exemplo, você nem sempre precisa da resposta perfeita. Talvez perto seja bom o suficiente. Ou talvez você possa resolver o problema em um subconjunto de casos que sejam fáceis e resolva os que são difíceis. Como um exemplo, os algoritmos de empacotamento geralmente são NP-completos, mas algoritmos que chegam a 5% do ideal usando abordagens probabalísticas são comuns.
— Cort Ammon - Restabelece Monica 8/16
Com toda a honestidade, ser instruído a criar um algoritmo ganancioso para resolver um programa completo de NP é literalmente o mesmo que ser encarregado de enfrentar toda a comunidade de ciência da computação / matemática sozinho. Se você encontrar um algoritmo para um programa de NP-completos em P tempo, ao muito menos você ganharia o prêmio argila US $ 1 milhão para a solução de P = NP. Na realidade, os efeitos de sua descoberta remodelariam a computação como a conhecemos e sustentariam completamente toda a indústria de segurança / criptografia da noite para o dia. Melhor ajustar a redação da tarefa para não ser comprovadamente NP-completa.
Eu usei um algoritmo exato guloso para um problema NP-completo. Eu só precisava resolver um caso pequeno e conseguir um servidor de 64 processadores por um fim de semana.
Além das respostas existentes, deixe-me salientar que há situações em que faz sentido ter uma solução aproximada para um problema de decisão, mas funciona diferente do que você imagina.
Com esses algoritmos, apenas um dos dois resultados é determinado com certeza, enquanto o outro pode estar incorreto. Faça o teste de Miller-Rabin para números primos , por exemplo: Se o teste determinar que um número não é primo, esse resultado é certo. Mas, no outro caso, significa apenas que o número é provavelmente primo. Dependendo de quanto tempo de computação você está disposto a investir, você pode aumentar sua confiança no resultado, mas não será 100%, como é o caso não primo.
Isso é especialmente poderoso ao lidar com problemas indecidíveis: você pode escrever uma ferramenta que tente resolver o problema de parada de um pedaço de código específico. Se conseguir encontrar uma prova de que o programa não será repetido indefinidamente, você pode reivindicá-lo com 100% de certeza. Se você não conseguir encontrar essa prova, pode ser que o fluxo de controle do programa esteja muito complicado para a sua ferramenta analisar, mas não é uma prova de que ele funcionará para sempre. Ao simplificar as estruturas de controle, você poderá criar um programa equivalente suficientemente simples para a ferramenta provar que ela será interrompida por certo.
Existe uma grande diferença entre os algoritmos probabilístico (sua resposta) e aproximado (a pergunta). Em particular, a combinação de ambos é uma raça muito especial.
Além disso, sabemos que algoritmos probabilísticos para o problema de parada não existem, assumindo uma interpretação razoável do termo nesse contexto.
@ Rafael Não pretendi que minha resposta fosse específica para algoritmos probabilísticos. É verdade que, para Miller-Rabin, esse é o caso, mas como você se mencionou, isso não é mais verdade no exemplo do problema de interrupção, e acho que também não será verdade na maioria dos casos em que você encontra esse comportamento. O ponto que eu queria transmitir é simplesmente que você só terá certeza de um resultado, mas não do outro.
Se você não está dizendo mais do que isso, alguns problemas são apenas semicomputáveis, não acho que você esteja respondendo à pergunta.
@ Rafael Minha resposta também não é específica para problemas semi-computáveis. Na verdade, não acho que a abordagem que descrevi se aplique a problemas semi-computáveis. Lá, agora você terá certeza se aterrissou no ramo indefinido da função, para poder afirmar com certeza que não há resultado. O que eu descrevi se resume a: Pode haver uma resposta, mas o algoritmo pode não ter parecido difícil o suficiente para tropeçar nele.