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?
Réponses:
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 .
la source
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 :
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
fsmcompact
qui peut parfois suffire:la source