Estou interessado na questão de qual a melhor maneira de ensinar a NP-completude aos cursos de ciência da computação. Em particular, devemos ensiná-lo usando reduções de Karp ou reduções de Turing?
Sinto que os conceitos de completude e redução de NP são algo que todo especialista em ciência da computação deve aprender. No entanto, ao ensinar a NP-completude, notei que o uso das reduções de Karp tem algumas desvantagens.
Antes de tudo, as reduções de Karp parecem desnecessariamente confusas para alguns estudantes. A noção intuitiva de redução é "se eu tiver um algoritmo para resolver o problema X, então também posso usá-lo para resolver o problema Y". Isso é muito intuitivo - mas mapeia muito melhor as reduções de Turing do que as reduções de Karp. Como resultado, vejo alunos que tentam provar a completude do NP serem desviados por sua intuição e formam uma prova incorreta. Tentar ensinar ambos os tipos de reduções e enfatizar esse aspecto das reduções de Karp às vezes parece um formalismo desnecessário e ocupa um tempo desnecessário nas aulas e a atenção dos alunos sobre o que parece ser um detalhe técnico não essencial; não é evidente por que usamos essa noção mais restrita de redução.
Entendo a diferença entre reduções de Karp e reduções de Turing (Cook), e como elas levam a diferentes noções de completude de NP. Percebo que as reduções de Karp nos dão uma granularidade mais fina de distinções entre classes de complexidade. Portanto, para um estudo sério da teoria da complexidade, as reduções de Karp são obviamente a ferramenta certa. Mas para os estudantes de ciência da computação que estão apenas aprendendo isso e nunca vão entrar na teoria da complexidade, não tenho certeza se essa distinção mais fina é crítica é fundamental para que eles sejam expostos.
Por fim, como estudante, lembro-me de ficar confuso ao encontrar um problema como "tautologia" - por exemplo, dada uma fórmula booleana, verifique se é uma tautologia. O que foi confuso foi que esse problema é claramente difícil: qualquer algoritmo de tempo polinomial implicaria que ; e resolver esse problema é obviamente tão difícil quanto resolver o problema da tautologia. No entanto, embora a tautologia intuitivamente seja tão difícil quanto a satisfação, a tautologia não é difícil para o NP. Sim, entendo hoje por que esse é o caso, mas na época me lembro de ficar intrigado com isso. (O que passou pela minha cabeça uma vez que finalmente entendi foi: Por que traçamos essa distinção entre NP-hard e co-NP-hard, afinal? Isso parece artificial e não é muito bem motivado pela prática. Por que nos concentramos em NP Eles parecem igualmente naturais. De uma perspectiva prática, a dureza da co-NP parece ter essencialmente as mesmas conseqüências práticas que a dureza da NP, então por que ficamos todos presos nessa distinção? Sim, eu sei o respostas, mas como estudante, lembro que isso apenas fez o sujeito parecer mais misterioso e pouco motivado.)
Então, minha pergunta é essa. Quando ensinamos NP-completude aos alunos, é melhor ensinar usando reduções de Karp ou reduções de Turing? Alguém já tentou ensinar o conceito de completude NP usando reduções de Turing? Se sim, como foi? Haveria armadilhas ou desvantagens não óbvias se ensinássemos os conceitos usando reduções de Turing e pulássemos as questões conceituais associadas às reduções de Karp?
Relacionado: veja aqui e aqui , que menciona que a razão pela qual usamos reduções de Karp na literatura é porque ela nos permite distinguir entre dureza NP e dureza co-NP. No entanto, parece não dar nenhuma resposta focada em uma perspectiva pedagógica sobre se essa capacidade é crítica para os objetivos de aprendizagem de uma classe de algoritmos que devem ser adotados por todos os principais especialistas em CS. Veja também aqui no cstheory.SE , que tem uma discussão semelhante.
Respostas:
Eu diria muito definitivamente ensinar usando reduções de Karp (muitos-um). Independentemente dos benefícios do uso de reduções de Turing no tempo poli (Cook), as reduções de Karp são o modelo padrão.
Todo mundo usa Karp e a principal armadilha de ensinar Cook é que você acabará com toda uma classe de alunos que se tornam patologicamente confusos sempre que lêem um livro ou tentam discutir o assunto com alguém que não foi ensinado por você.
Concordo que as reduções de Cook são, de várias maneiras, mais sensíveis e que não há distinção entre dureza NP e dureza CoNP em termos práticos, no sentido de que ambos significam "Esse problema é muito difícil e você não terá uma algoritmo geral, eficiente e exato que pode lidar com grandes instâncias ". Por outro lado, a distinção entre NP e coNP não é inteiramente um artefato de uma teoria baseada em reduções de Karp: você não costuma falar sobre gráficos que não são de 3 cores ou nos quais cada conjunto de vértices contém pelo menos uma aresta. De alguma forma, a versão "natural" do problema geralmente parece estar no NP e não no coNP.k
fonte
É melhor ensinar os dois ! Um especialista em ciência da computação deve saber sobre os dois.
Eu não conheço ninguém que use reduções de Cook para ensinar a completude a PN, obviamente, os teóricos da complexidade não seguem; os teóricos da não complexidade normalmente seguem a definição padrão desde o artigo de Karp e são usados em todos os livros didáticos (que eu conheço). Isso causará muita confusão para eles posteriormente, se você não seguir a terminologia padrão.
As reduções de cozimento estão basicamente resolvendo problemas usando sub-rotinas de caixa preta. Eles são fáceis de explicar e motivar se seus alunos tiverem alguma experiência em programação. Eles são essenciais, pois sem as reduções do Cook, você não pode discutir reduções entre problemas de pesquisa, problemas de otimização etc.
fonte
Uma maneira interessante de abordar essa questão de ensino em particular é perceber que a completude do PE tem semelhanças e analogias com a indecidibilidade, o que também é pouco intuitivo. os alunos entram na aula apenas tendo ouvido falar em algoritmos que são interrompidos. mas o teorema do princípio do TCS é que existem problemas para os quais não há solução garantida, ou seja, o problema de parada. e, de fato, problemas indecidíveis podem começar a parecer longe de ser inventados e aparentemente são um tanto onipresentes.
portanto, a teoria está nos dizendo a maneira de ver a computação fundamentalmente como um processo que pode retornar uma resposta sob algumas circunstâncias. em outras circunstâncias, talvez não. para completude e decidibilidade de NP, a questão fundamental e mais geral é: "existe um algoritmo que retorna
Y
no tempo P". mas isso não diz nada sobre um algoritmo que retornaN
no tempo P. um algoritmo pode retornarY
no tempo P para uma instância, mas não retornar uma resposta em outras instâncias. a teoria está nos dizendo que realmente há uma diferença distinta aqui à qual devemos prestar muita atenção. se não for intuitivo, significa que nossas intuições fundamentais precisam ser reajustadas (como costuma acontecer no ensino teórico).fonte
Y
no tempo P, mas também levam "mais tempo" do que o tempo P para retornarN
e a teoria é baseada / orientada / focada no tempo que leva para responderY
.