Algoritmo para convertir NFA muy grande a DFA


12

Tengo un autómata finito no determinista realmente grande y necesito convertirlo al DFA.

Por grande me refiero a más de 40 000 estados. Hasta ahora he realizado algunos experimentos y programado el algoritmo predeterminado que busca en la tabla (como se describe aquí ), pero incluso después de la optimización es bastante lento y consume mucha memoria. Soy consciente del hecho de que el número de estados puede crecer exponencialmente, pero después de la minimización, el DFA resultante tiene aproximadamente 9 000 estados y eso es soportable.

Entonces mi pregunta es, ¿hay algún algoritmo que sea más rápido o más amigable con la memoria?


el video aparentemente está en el algoritmo de determinación estándar. ver, por ejemplo, minimización de NFA sin determinación, stackoverflow
vzn

Si realiza la conversión ingeniosa de NFA-> DFA (usando la construcción del producto), ¿qué tan grande es el DFA resultante? (antes de la minimización)
DW

2
¿Qué quieres hacer con el DFA? Si está interesado en las comprobaciones de inclusión, existen algoritmos para hacerlo directamente.
Vijay D

Gracias por respuestas muy rápidas. Para el tamaño, no puedo decir exactamente ya que mi RAM se agotó, pero lo examinaré más de cerca y luego extenderé la pregunta. Por lo que quiero hacer, no estoy seguro de si puedo hablar abiertamente sobre eso, ya que es un poco de mi firme conocimiento. Pero seguramente puedo afirmar que realmente necesito el DFA resultante.
Jendas

1
¿Ha intentado ejecutar el algoritmo de Angluin para aprender DFA a partir de consultas de membresía y equivalencia? La parte de membresía es fácil (solo ejecute su DFA en la cadena requerida); para equivalencia, puede dibujar muchas cadenas aleatorias o probar todas las cadenas hasta una cierta longitud. Esto es sólo una heurística como usted nunca sabe realmente cuando haya terminado, pero me he dado cuenta que este truco funciona bien en la práctica ...
Aryeh

Respuestas:


6

¿Has probado el algoritmo de Brzozowski ? El peor tiempo de ejecución es exponencial, pero veo algunas referencias que sugieren que a menudo funciona muy bien, especialmente al comenzar con un NFA que desea convertir a DFA y minimizar.

El siguiente artículo parece relevante:

Evalúa varios algoritmos diferentes para la minimización de DFA, incluida su aplicación a su situación en la que comenzamos con un NFA y queremos convertirlo en un DFA y minimizarlo.

¿Cómo se ve la descomposición de componentes fuertemente conectados (SCC) de su NFA (considerándolo como un gráfico dirigido)? ¿Tiene muchos componentes, donde ninguno de los componentes es demasiado grande? Si es así, me pregunto si sería posible idear un algoritmo de divide y vencerás, donde tomas un solo componente, lo conviertes de NFA a DFA y luego lo minimizas, y luego reemplazas el original con la nueva versión determinada. Esto debería ser posible para los componentes de entrada única (donde todos los bordes en ese componente conducen a un único vértice, el vértice de entrada). No veo de inmediato si sería posible hacer algo así para los NFA arbitrarios, pero si verifica la estructura del SCC, entonces podría determinar si vale la pena explorar este tipo de dirección o no. .


El algoritmo de Brzozowski parece prometedor, ¡pero la técnica de dividir y conquistar aún más! En mi caso, esto es realmente fácil de hacer y no requiere grandes cambios de código. Lo haré y si eso funciona, aceptaré tu respuesta.
Jendas

2
Vine, pregunté,
dividí

2

aparentemente este no es un problema muy bien estudiado en el sentido de algoritmos conocidos / disponibles que no sean la estrategia original / de hace mucho tiempo de "determinar a DFA / minimizar DFA". parece indicar que el paso de determinación es el problemático, pero esto es típico, por supuesto, dado que tiene un peor caso exponencial de espacio / tiempo. tenga en cuenta que hay varios algoritmos de minimización de DFA que pueden variar significativamente en rendimiento en promedio.

también se conoce más informalmente como "minimización de NFA sin determinación" . se sabe que es difícil en el sentido de que, básicamente, ni siquiera hay algoritmos de aproximación a menos que P = Pspace como se muestra en este documento:

sin embargo, este documento considera el caso generalmente poco explorado de algunos algoritmos que no se basan en encontrar el DFA 1 st determinado :

Presentamos diferentes técnicas para reducir el número de estados y transiciones en autómatas no deterministas. Estas técnicas se basan en los dos pedidos anticipados sobre el conjunto de estados, relacionados con la inclusión de los idiomas izquierdo y derecho. Dado que su cálculo exacto es NP-hard, nos enfocamos en aproximaciones polinómicas que permiten una reducción del NFA de todos modos.

tenga en cuenta que un paquete / implementación disponible públicamente que puede manejar grandes conversiones / minimizaciones de NFA / DFA, etc. generalmente de la manera más eficiente posible es la biblioteca AT&T FSM .

Tiene una estrategia fsmcompactque a veces puede ser suficiente:

En los casos en que un transductor o un aceptador ponderado no se puede determinar o crece demasiado, puede ser útil una optimización diferente fsmcompact. Esta operación codifica cada triple de una etiqueta de entrada, etiqueta de salida y costo en una sola etiqueta nueva, realiza la determinación y minimización clásicas (aceptador no ponderado) y luego decodifica las etiquetas codificadas nuevamente en sus valores originales. Esto tiene la ventaja de que siempre está definido y que no mueve etiquetas de salida o costos a lo largo de las rutas. Tiene la desventaja de que el resultado no puede ser ni determinista ni mínimo.


ver también Sobre reducciones de la NFA Ilie, Navarro, Yu
vzn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.