Algoritmo para converter NFA muito grande em DFA


12

Eu tenho um autômato finito não determinístico muito grande e preciso convertê-lo no DFA.

Em geral, quero dizer 40.000 estados. Até agora, fiz alguns experimentos e programei o algoritmo padrão que pesquisa na tabela (como descrito aqui ), mas mesmo após a otimização é muito lento e consome muita memória. Estou ciente do fato de que o número de estados pode crescer exponencialmente, mas após a minimização, o DFA resultante tem cerca de 9.000 estados e isso é suportável.

Então, minha pergunta é: existe algum algoritmo que seria mais rápido ou mais amigável à memória?


aparentemente, o vídeo está no algoritmo de determinação padrão. ver, por exemplo NFA minimização sem determinization, stackoverflow
— vzn

Se você fizer a conversão ingênua de NFA-> DFA (usando a construção do produto), qual é o tamanho do DFA resultante? (antes da minimização)
— DW

2
O que você quer fazer com o DFA? Se você estiver interessado em verificações de inclusão, existem algoritmos para fazer isso diretamente.
— precisa

Obrigado por respostas muito rápidas. Quanto ao tamanho, não sei exatamente desde que minha RAM acabou, mas vou dar uma olhada mais de perto e estender a pergunta. Pelo que eu quero fazer, não tenho certeza se posso conversar abertamente sobre isso, pois é um pouco do meu firme conhecimento. Mas certamente posso afirmar que realmente preciso do DFA resultante.
— Jendas

1
Você já tentou executar o algoritmo da Angluin para aprender DFAs a partir de consultas de associação e equivalência? A parte da associação é fácil (basta executar o DFA na sequência necessária); por equivalência, você pode desenhar muitas seqüências aleatórias ou tentar todas as seqüências até um determinado comprimento. Esta é apenas uma heurística como você nunca realmente sabe quando você está feito, mas eu descobri que este truque funciona bem na prática ...
— Aryeh

Respostas:


6

Você já experimentou o algoritmo de Brzozowski ? No pior dos casos, o tempo de execução é exponencial, mas vejo algumas referências sugerindo que ele costuma ter um desempenho muito bom, especialmente ao iniciar com um NFA que você deseja converter em um DFA e minimizar.

O documento a seguir parece relevante:

Ele avalia vários algoritmos diferentes para a minimização do DFA, incluindo a aplicação deles à sua situação em que começamos com um NFA e queremos convertê-lo em um DFA e minimizá-lo.

Como é a decomposição dos componentes fortemente conectados (SCC) do seu NFA (considerando-o como um gráfico direcionado)? Possui muitos componentes, onde nenhum deles é muito grande? Nesse caso, gostaria de saber se seria possível criar um algoritmo de dividir e conquistar, no qual você pega um único componente, converte-o do NFA para o DFA, minimiza-o e depois o substitui pelo original pela nova versão determinada. Isso deve ser possível para componentes de entrada única (onde todas as arestas desse componente levam a um único vértice, o vértice de entrada). Não vejo imediatamente se seria possível fazer algo assim para NFAs arbitrárias, mas se você verificar como é a estrutura do SCC, poderá determinar se vale a pena explorar ou não esse tipo de direção .


O algoritmo de Brzozowski parece promissor, mas a técnica de dividir e conquistar ainda mais! No meu caso, isso é realmente fácil de fazer e não requer grandes alterações de código. Farei isso e, se funcionar, aceitarei sua resposta.
— Jendas

2
Eu vim, eu perguntei, eu dividido, eu conquistei
— Jendas

2

aparentemente, esse não é um problema muito estudado no sentido de algoritmos conhecidos / disponíveis, além da estratégia original / de muito tempo atrás de "determinar o DFA / minimizar o DFA". você parece indicar que a etapa de determinação é a problemática, mas isso é típico, é claro, uma vez que possui uma situação exponencial de espaço / tempo. observe que existem vários algoritmos de minimização do DFA que podem variar significativamente em desempenho em média.

também é conhecido mais informalmente como "minimização de NFA sem determinação" . sabe-se que é difícil no sentido de que basicamente não existem algoritmos de aproximação, a menos que P = Pspace, como mostrado neste artigo:

no entanto, este papel não considerar o caso em geral pouco explorado de alguns algoritmos que não são baseadas em encontrar o determinized DFA 1 st :

Apresentamos diferentes técnicas para reduzir o número de estados e transições em autômatos não determinísticos. Essas técnicas são baseadas nas duas pré-ordenações do conjunto de estados, relacionadas à inclusão dos idiomas esquerdo e direito. Como o cálculo exato é NP-difícil, nos concentramos em aproximações polinomiais que permitem uma redução da NFA da mesma forma.

observe que um pacote / implementação disponível ao público que pode lidar com grandes conversões / minimizações de NFA / DFA etc. geralmente de maneira mais eficiente possível é a biblioteca AT&T FSM .

tem uma estratégia fsmcompactque às vezes é suficiente:

Nos casos em que um transdutor ou aceitador ponderado não pode ser determinado ou cresce muito, uma otimização diferente pode ser útil - fsmcompact. Esta operação codifica cada triplo de um rótulo de entrada, rótulo de saída e custo em um único rótulo novo, executa a determinação e minimização clássicas (aceitador não ponderado) e, em seguida, decodifica os rótulos codificados de volta aos seus valores originais. Isso tem a vantagem de estar sempre definido e de não mover rótulos ou custos de saída pelos caminhos. Tem a desvantagem de que o resultado não pode ser determinístico nem mínimo.


veja também Sobre reduções da NFA Ilie, Navarro, Yu
— vzn 17/07/2013
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.