O que você está procurando além do que a Wikipedia tem a dizer sobre o assunto?
Minhas contribuições sobre este assunto: um , dois .
Não sei se concordo com a forma dessa tentativa de uma pergunta de referência (bastante ampla). Além disso, não está claro para mim o que além da definição é esperado aqui. (Se mais pessoas iria ler a definição, haveria menos confusão em torno.)
Aqui estão várias maneiras de pensar sobre o não-determinismo (copiado desta resposta ).
O gênio. Sempre que a máquina tem escolha, um gênio diz a ela que caminho seguir. Se a entrada estiver no idioma, o gênio poderá direcionar a máquina de tal maneira que eventualmente aceite. Por outro lado, se a entrada não estiver no idioma, o que quer que o gênio diga à máquina para fazer, ela sempre será rejeitada.
Dicas. A máquina calcula uma função bivariada. A primeira entrada é uma palavraWwe a segunda entrada é uma "dica" xx. Sempre que a máquina enfrenta uma escolha não determinística, ela consulta o próximo símbolo de dica e opera em conformidade. Nos é prometido o seguinte:
Completude: sew ∈ Lw∈L então há alguma dica xx o que faz com que a máquina aceite.
Solidez: sew ∉ Lw∉L então a máquina rejeita todas as dicas.
Aceitando cálculos. Um cálculo de aceitação é um cálculo legal (aquele em que a máquina sempre opera de acordo com uma das opções com que se depara) que termina em um estado de aceitação. Uma palavra está no idioma se tiver um cálculo aceitável.
Podemos formalizar a noção de aceitar computação usando configurações . Uma configuração é uma descrição instantânea de todo o estado da máquina. Podemos definir uma relaçãoσ⊢σ′σ⊢σ′ são configurações, que são mantidas quando σσ pode levar a σ′σ′ por cada σσ, enquanto que em uma máquina não determinística, pode haver mais de uma. Um cálculo de aceitação para uma palavraww é aquele que inicia na configuração inicial (a fita contém ww, a cabeça aponta no início de ww, o estado é o estado inicial) e termina em uma configuração de aceitação.
Outra descrição equivalente é em termos de acessibilidade. Considere um gráfico direcionado no qual os vértices são configurações e existe uma arestaσσ para σ′σ′. Um cálculo de aceitação é um caminho da configuração inicial para uma configuração de aceitação.
A diferença entre as máquinas de Turing determinística e não determinística está na função de transição. Em máquinas determinísticas de Turingδδ a função de transição é uma função parcial:
δ:Q×B→Q×B×{left,right}δ:Q×B→Q×B×{left,right}
o que significa que, dado um estado e um símbolo de fita, você tem um ou nenhum estado, insira o símbolo à direita e a direção a se mover. No entanto, em máquinas de Turing não determinísticas, isso se parece (aquiPP é o conjunto de subconjuntos de um conjunto):
δ:Q×B→P(Q×B×{left,right})δ:Q×B→P(Q×B×{left,right})
significando que você tem um ou vários estados, símbolos de fita para escrever ou direção para a qual mover. Isso dá à sua máquina a possibilidade de escolher efetivamente nesse estado e símbolo de fita entre os diferentes "ramos" da computação possíveis.
Na prática, isso significa que podemos calcular saídas diferentes para a mesma entrada. Portanto, a linguagem de uma máquina de Turing não determinística é o conjunto de palavras para as quais encontramos uma derivação nas transições definidas. Uma execução específica pode não encontrar essa derivação, mas o importante é que ela possa ocorrer. Então, quando você "adivinha", está apenas escolhendo um dos possíveis ramos da computação.
L={(M1,M2):there exists at least one word accepted by both TM at the same time}L={(M1,M2):there exists at least one word accepted by both TM at the same time}
Nesse caso, é possível "adivinhar" uma palavra ww e executar M1M1 e M2M2 em wwverificando se ambos aceitam, eles aceitam ao mesmo tempo. A suposição poderia funcionar introduzindo um estadoqq com transições que escrevem em alguma fita 00se / ou 11se sai lendo qualquer símbolo na máquina geral.
Para ser honesto, não encontrei nenhum exemplo de mau uso desse "palpite", mas verificar se cada vez que essa frase é usada corretamente é reduzido, para verificar se você pode construir um autômato com essa estrutura que simula o palpite.
"Na prática, isso significa que podemos calcular resultados diferentes para a mesma entrada". - isso parece sugerir que poderíamos realmente construir uma máquina não determinística. Isso é falso.
@ Rafael, você quer dizer que não é possível construir uma máquina não determinística? porque é esse o caso?
— Rodrigo Rodrigo
Porque o não determinismo é um conceito matemático que não tem um equivalente físico (tanto quanto eu sei).
Aceitação da sequência de entrada no NTM
deixe-me acrescentar mais sobre máquinas de Turing determinísticas e não determinísticas. Vamos considerar que, para algum idiomaLL, projetamos uma máquina de Turing determinística e não determinística, respectivamente. Em alguma entradaxx, haverá apenas um caminho de configurações no caso da máquina determinística de Turing, ou seja, c0⟶c1⟶⋯⟶ckc0⟶c1⟶⋯⟶ck (onde cada cici representa uma configuração em iipasso). Agora com base na configuraçãockck, podemos aceitar e rejeitar facilmente a sequência de entrada xx.
No caso do NTM, precisamos ter cuidado, pois pode acontecer que em alguns caminhos de configuração, entremos no estado de rejeição. Portanto, para máquinas de Turing não determinísticas, dizemos que uma string é aceita se pelo menos um dos caminhos de configuração levar ao estado de aceitação . Rejeitaremos a sequência de entrada se todos os caminhos de configuração levarem ao estado de rejeição.
Por exemplo, considere a árvore de configuração fornecida acima para a máquina de Turing não determinística, digamos, alguma string de entrada xxNesse caso, aceitaremos a string de entrada porque existe um caminho de aceitação.
Referência : http://cs.umw.edu/~finlayson/class/fall14/cpsc326/notes/24-complexity2.html
Aumento com um módulo de adivinhação.
Encontrei esse modelo em " Computers and Intratability ", de MR Garey e DS Johnson.
O NDTM tem exatamente a mesma estrutura que um DTM, exceto pelo fato de ser aumentado com um módulo de adivinhação que possui seu próprio cabeçote de gravação. O módulo de adivinhação fornece os meios para anotar a "adivinhação" e é usado apenas para esse fim.
O primeiro estágio é o estágio de adivinhação. Inicialmente, a sequência de entradaxx está escrito em quadrados de fita 11 através |x||x| (enquanto todos os outros quadrados estão em branco), a cabeça de leitura / gravação está digitalizando 11, a cabeça de gravação está digitalizando −1−1, e o controle de estado finito é "inativo". O módulo de adivinhação então direciona a cabeça somente para gravação, um passo de cada vez, para escrever algum símbolo do alfabeto da fita ΓΓ no quadrado da fita sendo digitalizado e mova um quadrado para a esquerda ou para parar, quando o módulo de adivinhação se torna inativo e o controle de estado finito é ativado no estado q0q0. A escolha de permanecer ativo e, em caso afirmativo, qual símbolo deΓΓescrever, é feita pelo módulo de adivinhação de maneira totalmente arbitrária. Assim, o módulo de adivinhação pode escrever qualquer string deΓ∗Γ∗ antes que pare e, de fato, nunca precise parar.
O estágio de "verificação" começa quando o controle de estado finito é ativado no estado q0q0. A partir deste ponto, o cálculo prossegue apenas sob a direção do programa NDTM, de acordo com exatamente as mesmas regras de um DTM. O módulo de adivinhação e seu cabeçote somente para gravação não estão mais envolvidos, tendo cumprido seu papel escrevendo a sequência de caracteres adivinhada na fita. Obviamente, a corda adivinhada pode (e geralmente será) examinada durante o estágio de verificação. A computação cessa quando e se o controle de estado de estado finito entra em um dos dois estados de parada (qYqY ou qNqN) e diz-se estar aceitando computação se parar no estadoqYqY. Todos os outros cálculos, parando ou não, são classificados juntos simplesmente como cálculos que não aceitam .
Observe que qualquer programa NDTMMM terá um número infinito de cálculos possíveis para uma determinada sequência de entrada xx, um para cada sequência de caracteres possível Γ∗Γ∗. Dizemos que o programa NDTMMM aceita xx se pelo menos um deles for um cálculo aceitável.
O tempo necessário para um programa NDTMMM para aceitar a string x∈LMx∈LM é definido como o mínimo, considerando todos os cálculos de MM para xx , do número de etapas que ocorrem nas etapas de adivinhação e verificação até o estado de parada qYqY é introduzido.
O único ponto que merece menção especial é que, em que geralmente imaginamos um algoritmo não determinístico como adivinhar uma estrutura SS que de alguma forma depende da instância [problem] especificada II, o módulo de adivinhação de um NDTM desconsidera completamente a entrada fornecida. No entanto, uma vez que cada string deΓ∗Γ∗Como um palpite possível, sempre podemos projetar nosso programa NDTM para que o estágio de verificação comece verificando se a string adivinhada corresponde (sob a interpretação implícita que nosso programa coloca nas cordas) a uma palpite apropriada para a entrada fornecida. Caso contrário, o programa pode entrar imediatamente no estado de paradaqNqN.
A classe NPNP é definido informalmente para ser a classe de todos os problemas de decisão ΠΠ que, sob esquemas de codificação razoáveis, pode ser resolvido por algoritmos não determinísticos de tempo polinomial.
O uso do termo "resolver" nessas definições informais deve, é claro, ser tomado com um grão de sal. Deve ser evidente que um "algoritmo não determinístico de tempo polinomial" é basicamente um dispositivo de definição para capturar a noção de verificabilidade do tempo polinomial, em vez de um método realista de solução de problemas de decisão. Em vez de ter apenas um cálculo possível em uma determinada entrada, ele tem muitos diferentes, um para cada palpite possível.
É essa noção de "verificabilidade" do tempo polinomial que a classe NPNPdestina-se a isolar. Observe que a verificabilidade do tempo polinomial não implica solvabilidade polinomial.