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?

Jendas
fonte
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 .

DW
fonte
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.

vzn
fonte
veja também Sobre reduções da NFA Ilie, Navarro, Yu
vzn 17/07/2013