Recentemente, passei pela dolorosa experiência divertida de explicar informalmente o conceito de complexidade computacional a um jovem programador autodidata talentoso, que nunca havia feito um curso formal de algoritmos ou complexidade antes. Não surpreendentemente, muitas noções pareciam estranhas a princípio, mas faziam sentido em alguns exemplos (PTIME, intratabilidade, incomputabilidade) , enquanto outras parecem vir mais naturais (classificação de problemas por reduções, tempo e espaço como recursos, análise assintótica) . Tudo estava indo muito bem até que eu acidentalmente admiti que SATpode ser resolvido com eficiência * na prática ... E assim, eu os perdi. Não importava o quão convincentemente eu estivesse tentando argumentar em favor da teoria, o garoto estava convencido de que era tudo matemática de porcaria artificial que ele não deveria cuidar. Bem...
¯ \ _ (ツ) _ / ¯
Não, não fiquei com o coração partido, nem me importei com o que ele pensava, esse não é o objetivo desta pergunta. Nossa conversa me fez pensar em uma pergunta diferente,
Quanto eu realmente sei sobre problemas que são teoricamente intratáveis (complexidade do tempo superpolinomial), mas praticamente solucionáveis (por meio de heurísticas, aproximações, solucionadores de SAT etc.)?
Eu percebi, não muito. Eu sei que existem alguns solucionadores de SAT muito eficientes que resolvem enormes instâncias com eficiência, que o Simplex funciona muito bem na prática e talvez mais alguns problemas ou algoritmos. Você pode me ajudar a pintar uma imagem mais completa? Quais problemas conhecidos ou mesmo classes de problemas estão nessa categoria?
TL; DR: Quais são os problemas que são contra-intuitivamente solucionáveis na prática? Existe um recurso (atualizado) para ler mais? Nós temos uma caracterização para eles? E, finalmente, como uma questão de discussão geral, não deveríamos?
EDIÇÃO 1: Ao tentar responder à minha última pergunta de discussão sobre essa caracterização , fui apresentado à análise suavizada de algoritmos, um conceito introduzido por Daniel Spielman e Shang-Hua Teng em [1] que interpola continuamente entre o pior dos casos e análises de caso médio de algoritmos. Não é exatamente a caracterização discutida acima, mas captura o mesmo conceito, e achei interessante.
Spielman, Daniel A. e Shang-Hua Teng. "Análise suavizada de algoritmos: por que o algoritmo simplex geralmente leva tempo polinomial." Journal of the ACM (JACM) 51, n. 3 (2004): 385-463.