Algorithme de conversion de très gros NFA en DFA

12

J'ai un très gros automate fini non déterministe et je dois le convertir en DFA.

En gros, je veux dire 40 000+ états. Jusqu'à présent, j'ai fait quelques expériences et programmé l'algorithme par défaut qui recherche dans la table (comme décrit ici ), mais même après l'optimisation est assez lente et très consommatrice de mémoire. Je suis conscient du fait que le nombre d'états peut croître de façon exponentielle, mais après minimisation, le DFA résultant a environ 9 000 états et c'est supportable.

Ma question est donc la suivante: existe-t-il un algorithme qui serait plus rapide ou plus convivial en mémoire?

Jendas
la source
la vidéo est apparemment sur l'algorithme de détermination standard. voir par exemple la minimisation NFA sans détermination, stackoverflow
vzn
Si vous effectuez la conversion NFA-> DFA naïf (en utilisant la construction du produit), quelle est la taille du DFA résultant? (avant minimisation)
DW
2
Que voulez-vous faire avec le DFA? Si vous êtes intéressé par les vérifications d'inclusion, il existe des algorithmes pour le faire directement.
Vijay D
Merci pour les réponses très rapides. Pour la taille, je ne peux pas dire exactement depuis que ma mémoire RAM est épuisée, mais je vais y regarder de plus près et prolonger la question. Pour ce que je veux faire, je ne sais pas si je peux en parler ouvertement, car c'est un peu mon savoir-faire. Mais je peux certainement affirmer que j'ai réellement besoin du DFA résultant.
Jendas
1
Avez-vous essayé d'exécuter l'algorithme d'Angluin pour apprendre les DFA à partir des requêtes d'appartenance et d'équivalence? La partie abonnement est simple (il suffit d'exécuter votre DFA sur la chaîne requise); pour l'équivalence, vous pouvez dessiner beaucoup de chaînes aléatoires ou essayer toutes les chaînes jusqu'à une certaine longueur. Ce n'est qu'une heuristique car vous ne saurez jamais vraiment quand vous avez terminé, mais j'ai trouvé que cette astuce fonctionne bien dans la pratique ...
Aryeh

Réponses:

6

Avez-vous essayé l'algorithme de Brzozowski ? Le pire des cas, le temps d'exécution est exponentiel, mais je vois des références suggérant qu'il fonctionne souvent très bien, en particulier lors du démarrage avec un NFA que vous souhaitez convertir en DFA et minimiser.

L'article suivant semble pertinent:

Il évalue un certain nombre d'algorithmes différents pour la minimisation DFA, y compris leur application à votre situation où nous commençons par un NFA et que nous voulons convertir en DFA et le minimiser.

À quoi ressemble la décomposition en composants fortement connectés (SCC) de votre NFA (en la considérant comme un graphe orienté)? At-il de nombreux composants, où aucun des composants n'est trop grand? Dans l'affirmative, je me demande s'il serait possible de concevoir un algorithme de division et de conquête, où vous prenez un seul composant, le convertissez de NFA en DFA, puis le minimisez, puis remplacez l'original par la nouvelle version déterminée. Cela devrait être possible pour les composants à entrée unique (où toutes les arêtes de ce composant mènent à un seul sommet, le sommet d'entrée). Je ne vois pas immédiatement s'il serait possible de faire quelque chose comme ça pour les NFA arbitraires, mais si vous vérifiez à quoi ressemble la structure du SCC, alors vous pourrez peut-être déterminer si ce type de direction mérite d'être exploré ou non .

DW
la source
L'algorithme de Brzozowski semble prometteur, mais la technique du diviser pour mieux régner encore plus! Dans mon cas, cela est vraiment facile à faire et ne nécessite pas de modifications importantes du code. Je le ferai et si cela fonctionne, j'accepterai votre réponse.
Jendas
2
Je suis venu, j'ai demandé, j'ai divisé, j'ai conquis
Jendas
2

ce n'est apparemment pas un problème très bien étudié au sens d'algorithmes connus / disponibles autres que la stratégie originale / il y a longtemps de "déterminer pour DFA / minimiser DFA". vous semblez indiquer que l'étape de détermination est problématique mais cela est typique bien sûr étant donné qu'elle a un cas exponentiel espace / temps pire. notez qu'il existe plusieurs algorithmes de minimisation DFA dont les performances peuvent varier considérablement en moyenne.

il est également connu de manière plus informelle sous le nom de "minimisation NFA sans détermination" . il est connu pour être difficile dans le sens où il n'y a fondamentalement même pas d'algorithmes d'approximation à moins que P = Pspace comme indiqué dans cet article:

Cependant, cet article considère le cas généralement rarement exploré de certains algorithmes qui ne sont pas basés sur la recherche du DFA déterminé 1 er :

Nous présentons différentes techniques pour réduire le nombre d'états et de transitions dans les automates non déterministes. Ces techniques sont basées sur les deux précommandes sur l'ensemble des états, liées à l'inclusion des langues gauche et droite. Comme leur calcul exact est NP-difficile, nous nous concentrons sur les approximations polynomiales qui permettent tout de même une réduction du NFA.

Notez que la bibliothèque AT&T FSM est un package / implémentation accessible au public qui peut gérer les grandes conversions / minimisations NFA / DFA, etc., de manière aussi efficace que possible .

il a une stratégie fsmcompactqui peut parfois suffire:

Dans les cas où un transducteur ou un accepteur pondéré ne peut pas être déterminé ou devient très grand, une optimisation différente peut être utile - fsmcompact. Cette opération code chaque triple d'une étiquette d'entrée, d'une étiquette de sortie et d'un coût en une seule nouvelle étiquette, effectue une détermination et une minimisation classiques (accepteur non pondéré), puis décode les étiquettes codées dans leurs valeurs d'origine. Cela a l'avantage qu'il est toujours défini et qu'il ne déplace pas les étiquettes de sortie ou les coûts le long des chemins. Il présente l'inconvénient que le résultat ne peut être ni déterministe ni minimal.

vzn
la source
voir aussi sur les réductions NFA Ilie, Navarro, Yu
vzn