Diferenças entre edições de "Algoritmo probabilístico"
(→Modelos) |
(→Máquinas de Turing probabilísticas) |
||
(5 edições intermédias não estão a ser mostradas.) | |||
Linha 1: | Linha 1: | ||
− | Um '''algoritmo probabilístico''' é um [[algoritmo]] que utiliza a [[probabilidade]] como parte | + | Um '''algoritmo probabilístico''' é um [[algoritmo]] que utiliza a [[probabilidade]] como parte da sua lógica. Na prática, isso significa que a máquina que implementa o algoritmo deve ter acesso a um [[gerador de números pseudo-aleatórios]]. O algoritmo utiliza bits aleatórios como um guia para o seu comportamento. Diferente dos algoritmos convencionais, um algoritmo probabilístico, dada uma mesma sequência de entrada, não resulta necessariamente no mesmo estado final. |
== Definição == | == Definição == | ||
+ | Para demonstrar os exemplos a seguir deve-se assumir um modelo. Um computador inicia o seu trabalho sempre num estado inicial ''Q<sub>0</sub>'' e, dada uma sequência de símbolos de entrada, esta máquina passará a outros estados. Numa máquina clássica não-probabilística, as transições dependem apenas da sequência de símbolos, ou seja, dado um estado ''Q<sub>n</sub>'', a transição deste para um outro estado é sempre a mesma ao receber o mesmo símbolo. | ||
− | + | Num algoritmo probabilístico, uma mesma sequência de entrada não leva sempre a um mesmo estado final. Isso acontece porque as transições entre estados dependem além do estado actual e do símbolo recebido, também de uma ''escolha aleatória''. Imagine-se, num caso simplificado que, além de ler um símbolo para decidir o próximo passo de computação, a máquina ainda "lance uma [[moeda]]" para decidir se passa ou não ao próximo estado. | |
− | + | ||
− | + | ||
== Motivação == | == Motivação == | ||
− | O estudo de algoritmos computacionais geralmente busca soluções baseadas nos resultados do pior caso. Isso significa que uma solução é classificada dado o seu desempenho na execução de uma tarefa no seu pior caso. Mas em vários outros problemas, o estudo do desempenho no caso médio já é o suficiente. Ou seja, quando um algoritmo ''geralmente'' resolve um problema melhor que qualquer outro. Estas soluções podem até mesmo ter uma probabilidade pequena de | + | O estudo de algoritmos computacionais geralmente busca soluções baseadas nos resultados do pior caso. Isso significa que uma solução é classificada dado o seu desempenho na execução de uma tarefa no seu pior caso. Mas em vários outros problemas, o estudo do desempenho no caso médio já é o suficiente. Ou seja, quando um algoritmo ''geralmente'' resolve um problema melhor que qualquer outro. Estas soluções podem até mesmo ter uma probabilidade pequena de dar respostas erradas. Para esses casos os algoritmos probabilísticos podem ser bastante úteis. |
− | Para ilustrar esta motivação pode-se usar o exemplo de um busca. Dado um [[array| | + | Para ilustrar esta motivação pode-se usar o exemplo de um busca. Dado um [[array|vector]] de tamanho ''n'' preenchido uniformemente com os elementos {''a, b''}, o problema consiste em encontrar um ''a'' dentro do mesmo. A forma mais óbvia de executar esta busca é verificar cada uma das posições do vector. Usando este algoritmo são verificadas, no pior caso da entrada (vector ordenado), ''n''/2 posições. A verdade é que nenhum algoritmo determinístico termina esta tarefa mais rapidamente para todos os casos de entrada. |
− | Neste mesmo problema, pode-se fazer uso de um algoritmo probabilístico muito simples para melhorar este resultado. Caso pesquisemos aleatoriamente as posições do | + | Neste mesmo problema, pode-se fazer uso de um algoritmo probabilístico muito simples para melhorar este resultado. Caso pesquisemos aleatoriamente as posições do vector, teremos uma alta probabilidade de encontrar rapidamente o valor desejado para qualquer que seja a entrada. Resta apenas uma pequena probabilidade de que o factor aleatório demore para terminar a busca, mas isso não depende da entrada. |
== Programação == | == Programação == | ||
+ | Uma máquina probabilística pode ser vista como uma particularidade das máquinas não determinísticas. O não-determinismo implica que a máquina pode seguir vários caminhos dados o par: estado ''S<sub>n</sub>'' e símbolo de entrada ''X''. A diferença deste modelo para o da máquina probabilística é que este último escolhe aleatoriamente o caminho a seguir, enquanto aquele, ao menos teoricamente, busca o melhor caminho dentro de todas as possibilidades. | ||
− | + | Para a implementação de algoritmos probabilísticos uma importante definição é a ''instrução de atribuição aleatória'', ''x := random(S)''. Esta instrução diz respeito à escolha aleatória de um elemento do conjunto ''S'' para a atribuição da variável ''x''. | |
− | + | ||
− | Para a implementação de algoritmos probabilísticos uma importante definição é a ''instrução de atribuição aleatória'', ''x := random(S)''. Esta instrução diz respeito | + | |
== Modelos == | == Modelos == | ||
Linha 25: | Linha 23: | ||
* Para cada símbolo <tex>x</tex> do [[alfabeto]] existe uma matriz de transição <tex>M_x</tex> que expressa as ''probabilidades'' de transição entre estados dado a leitura do símbolo <tex>x</tex>; | * Para cada símbolo <tex>x</tex> do [[alfabeto]] existe uma matriz de transição <tex>M_x</tex> que expressa as ''probabilidades'' de transição entre estados dado a leitura do símbolo <tex>x</tex>; | ||
− | * Os estados são representados através de [[Array| | + | * Os estados são representados através de [[Array|vectores]] coluna; |
* Pode-se calcular a aceitabilidade de uma palavra ''xyz'' com a seguinte fórmula: <tex>P_{(xyz)} = q_{inicial}^T \cdot M_x \cdot M_y \cdot M_z \cdot q_{final}</tex>. | * Pode-se calcular a aceitabilidade de uma palavra ''xyz'' com a seguinte fórmula: <tex>P_{(xyz)} = q_{inicial}^T \cdot M_x \cdot M_y \cdot M_z \cdot q_{final}</tex>. | ||
Linha 31: | Linha 29: | ||
; No caso do autómato finito | ; No caso do autómato finito | ||
− | Um | + | Um autómato que reconhece as palavras binárias com o formato ''00*11*00*'' pode ser escrito assim: |
Os estados: | Os estados: | ||
Linha 98: | Linha 96: | ||
; No caso do autómato finito probabilístico | ; No caso do autómato finito probabilístico | ||
− | O mesmo modelo acima pode ser modificado para um autómato finito probabilístico mudando apenas as matrizes de ''possibilidades'' para que seja de ''probabilidades''. Com isso ao invés de receber apenas os valores 0 e 1, podem existir valores no intervalo [0,1] desde que as linhas somem sempre 1, ou seja, as probabilidades de execução | + | O mesmo modelo acima pode ser modificado para um autómato finito probabilístico mudando apenas as matrizes de ''possibilidades'' para que seja de ''probabilidades''. Com isso ao invés de receber apenas os valores 0 e 1, podem existir valores no intervalo [0,1] desde que as linhas somem sempre 1, ou seja, as probabilidades de execução num dado estado e recebido um símbolo é sempre 1. |
Podemos modificar as matrizes de transição da seguinte forma: | Podemos modificar as matrizes de transição da seguinte forma: | ||
Linha 118: | Linha 116: | ||
</tex> | </tex> | ||
− | Os | + | Os exemplos de aceitação e rejeição passam a não ser mais exactos, mas sim, a retornar uma probabilidade de aceitação: |
PROBABILIDADE DE ACEITAÇÃO: | PROBABILIDADE DE ACEITAÇÃO: | ||
Linha 135: | Linha 133: | ||
=== Máquinas de Turing probabilísticas === | === Máquinas de Turing probabilísticas === | ||
− | Uma Máquina de Turing | + | Uma Máquina de Turing probabilística <tex>M</tex> é um tipo de [[Máquina de Turing não-determinística]] que possui passos de transição chamados de ''lançamento-de-moeda'', dando a máquina duas possibilidades a cada transição. |
− | Se na computação de uma entrada <tex>w</tex> é gerado o caminho de execução (ramificação) <tex>b</tex> | + | Se na computação de uma entrada <tex>w</tex> é gerado o caminho de execução (ramificação) <tex>b</tex> e, neste, foram dados <tex>k</tex> lançamentos de moeda, então a probabilidade do caminho é dada por: <tex>P[b] = 2^{-k}</tex>. Já a probabilidade de aceitação da entrada <tex>w</tex> é dada por: <tex>P[M aceita w] = \sum P[b]</tex>, ou seja, a soma de todos os caminhos de execução que aceitam a palavra <tex>w</tex>. Adicionalmente, temos que: <tex>P[M rejeita w] = 1 - P[M aceita w]</tex>. |
A máquina <tex>M</tex> continua reconhecendo linguagens apenas quando aceita todas as palavras da mesma e rejeita no caso contrário. Mas a uma Máquina de Turing Probabilística é permitido uma pequena probabilidade de erro: <tex>0 \le \epsilon < 0.5</tex>. Desta forma, diz-se que <tex>M</tex> reconhece uma linguagem <tex>A</tex> com probabilidade de erro <tex>\epsilon</tex> se: | A máquina <tex>M</tex> continua reconhecendo linguagens apenas quando aceita todas as palavras da mesma e rejeita no caso contrário. Mas a uma Máquina de Turing Probabilística é permitido uma pequena probabilidade de erro: <tex>0 \le \epsilon < 0.5</tex>. Desta forma, diz-se que <tex>M</tex> reconhece uma linguagem <tex>A</tex> com probabilidade de erro <tex>\epsilon</tex> se: | ||
Linha 208: | Linha 206: | ||
[[Categoria:Estatística]] | [[Categoria:Estatística]] | ||
− | |||
[[Categoria:Teoria das probabilidades]] | [[Categoria:Teoria das probabilidades]] |
Edição atual desde as 08h00min de 18 de fevereiro de 2008
Um algoritmo probabilístico é um algoritmo que utiliza a probabilidade como parte da sua lógica. Na prática, isso significa que a máquina que implementa o algoritmo deve ter acesso a um gerador de números pseudo-aleatórios. O algoritmo utiliza bits aleatórios como um guia para o seu comportamento. Diferente dos algoritmos convencionais, um algoritmo probabilístico, dada uma mesma sequência de entrada, não resulta necessariamente no mesmo estado final.
Índice
Definição
Para demonstrar os exemplos a seguir deve-se assumir um modelo. Um computador inicia o seu trabalho sempre num estado inicial Q0 e, dada uma sequência de símbolos de entrada, esta máquina passará a outros estados. Numa máquina clássica não-probabilística, as transições dependem apenas da sequência de símbolos, ou seja, dado um estado Qn, a transição deste para um outro estado é sempre a mesma ao receber o mesmo símbolo.
Num algoritmo probabilístico, uma mesma sequência de entrada não leva sempre a um mesmo estado final. Isso acontece porque as transições entre estados dependem além do estado actual e do símbolo recebido, também de uma escolha aleatória. Imagine-se, num caso simplificado que, além de ler um símbolo para decidir o próximo passo de computação, a máquina ainda "lance uma moeda" para decidir se passa ou não ao próximo estado.
Motivação
O estudo de algoritmos computacionais geralmente busca soluções baseadas nos resultados do pior caso. Isso significa que uma solução é classificada dado o seu desempenho na execução de uma tarefa no seu pior caso. Mas em vários outros problemas, o estudo do desempenho no caso médio já é o suficiente. Ou seja, quando um algoritmo geralmente resolve um problema melhor que qualquer outro. Estas soluções podem até mesmo ter uma probabilidade pequena de dar respostas erradas. Para esses casos os algoritmos probabilísticos podem ser bastante úteis.
Para ilustrar esta motivação pode-se usar o exemplo de um busca. Dado um vector de tamanho n preenchido uniformemente com os elementos {a, b}, o problema consiste em encontrar um a dentro do mesmo. A forma mais óbvia de executar esta busca é verificar cada uma das posições do vector. Usando este algoritmo são verificadas, no pior caso da entrada (vector ordenado), n/2 posições. A verdade é que nenhum algoritmo determinístico termina esta tarefa mais rapidamente para todos os casos de entrada.
Neste mesmo problema, pode-se fazer uso de um algoritmo probabilístico muito simples para melhorar este resultado. Caso pesquisemos aleatoriamente as posições do vector, teremos uma alta probabilidade de encontrar rapidamente o valor desejado para qualquer que seja a entrada. Resta apenas uma pequena probabilidade de que o factor aleatório demore para terminar a busca, mas isso não depende da entrada.
Programação
Uma máquina probabilística pode ser vista como uma particularidade das máquinas não determinísticas. O não-determinismo implica que a máquina pode seguir vários caminhos dados o par: estado Sn e símbolo de entrada X. A diferença deste modelo para o da máquina probabilística é que este último escolhe aleatoriamente o caminho a seguir, enquanto aquele, ao menos teoricamente, busca o melhor caminho dentro de todas as possibilidades.
Para a implementação de algoritmos probabilísticos uma importante definição é a instrução de atribuição aleatória, x := random(S). Esta instrução diz respeito à escolha aleatória de um elemento do conjunto S para a atribuição da variável x.
Modelos
Autómatos finitos probabilísticos
Não existe apenas uma representação para a teoria de autómato finito. Uma delas apresenta um modelo baseado em matrizes que é particularmente interessante, neste caso, pois a evolução da representação de autómatos finitos para autómatos finitos probabilísticos é muito clara. Seguem as três principais características:
- Para cada símbolo do alfabeto existe uma matriz de transição que expressa as probabilidades de transição entre estados dado a leitura do símbolo ;
- Os estados são representados através de vectores coluna;
- Pode-se calcular a aceitabilidade de uma palavra xyz com a seguinte fórmula: .
Os autómatos finitos são um caso particular dos autómatos finitos probabilísticos para transições com probabilidade 0 (para transição não possível) ou 1 (para transição possível). Ou seja, a decisão é executada com 100% de certeza. Vejamos um exemplo:
- No caso do autómato finito
Um autómato que reconhece as palavras binárias com o formato 00*11*00* pode ser escrito assim:
Os estados:
As matrizes de transição:
Um exemplo de aceitação e rejeição:
ACEITAÇÃO:
REJEIÇÃO:
- No caso do autómato finito probabilístico
O mesmo modelo acima pode ser modificado para um autómato finito probabilístico mudando apenas as matrizes de possibilidades para que seja de probabilidades. Com isso ao invés de receber apenas os valores 0 e 1, podem existir valores no intervalo [0,1] desde que as linhas somem sempre 1, ou seja, as probabilidades de execução num dado estado e recebido um símbolo é sempre 1.
Podemos modificar as matrizes de transição da seguinte forma:
Os exemplos de aceitação e rejeição passam a não ser mais exactos, mas sim, a retornar uma probabilidade de aceitação:
PROBABILIDADE DE ACEITAÇÃO:
PROBABILIDADE DE ACEITAÇÃO:
E agora passamos a ter uma possibilidade de erro na aceitação da linguagem inicialmente descrita 00*11*00*
Máquinas de Turing probabilísticas
Uma Máquina de Turing probabilística é um tipo de Máquina de Turing não-determinística que possui passos de transição chamados de lançamento-de-moeda, dando a máquina duas possibilidades a cada transição.
Se na computação de uma entrada é gerado o caminho de execução (ramificação) e, neste, foram dados lançamentos de moeda, então a probabilidade do caminho é dada por: . Já a probabilidade de aceitação da entrada é dada por: , ou seja, a soma de todos os caminhos de execução que aceitam a palavra . Adicionalmente, temos que: .
A máquina continua reconhecendo linguagens apenas quando aceita todas as palavras da mesma e rejeita no caso contrário. Mas a uma Máquina de Turing Probabilística é permitido uma pequena probabilidade de erro: . Desta forma, diz-se que reconhece uma linguagem com probabilidade de erro se:
Ganhos (complexidade)
- BPP
Classe das linguagens que são reconhecidas por uma máquina de Turing probabilística (em tempo polinomial) com um erro no interval [0, 0.5). Este erro pode ser diminuído exponencialmente utilizando o lema da aplicaficação. Este lema diz que para toda máquina de Turing probabilística (em tempo polinomial = ) que opera com erro , existe uma máquina equivalente que opera com uma probabilidade de erro de . Isto pode ser provado dado que pode simular a máquina , executá-la um número polinomial de vezes e fazer uma escolha majoritária entre as respostas computadas. Existe um algoritmo probabilístico para teste de primalidade pertencente a BPP.
- RP
Classe das linguagens que são reconhecidas por uma máquina de Turing probabilística (em tempo polinomial) no qual as entradas pertencentes a linguagem são aceitas com probabilidade de no mínimo 0.5 e entradas não pertencentes a linguagem são rejeitadas com probabilidade 1. Este tipo de erro, denominado erro de um único lado, é muito comum nos algoritmos probabilísticos. Nesta classe também é possível a redução exponencial do erro cometido.
Engloba os problemas que possuem algoritmos que resolvem em tempo polinomial (no caso médio) e dão sempre uma resposta correta, mesmo que possam não parar em alguns casos.
Aplicações
- Sistemas
- Problemas
Referências
- David Deutsch e Artur Ekert (19 de novembro de 1999). "Machine, Logic and Quantum Physics" (PDF).
- Eitan Gurari. An Introduction to the Theory of Computation. Computer Science Press, 1989. ISBN 0-7167-8182-4
- Michael Sipser. Introduction to the Theory of Computation. 2.ed. Course Technology, 2005. 416 p. ISBN 978-0534947286
Esta página usa conteúdo da Wikipedia. O artigo original estava em Algoritmo_probabilístico. Tal como o Think Finance neste artigo, o texto da Wikipedia está disponível segundo a GNU Free Documentation License. |