Algoritmo per la conversione di NFA di grandi dimensioni in DFA


12

Ho un automa finito non deterministico veramente grande e devo convertirlo in DFA.

In generale intendo oltre 40.000 stati. Finora ho fatto alcuni esperimenti e programmato l'algoritmo predefinito che cerca nella tabella (come descritto qui ), ma anche dopo l'ottimizzazione è piuttosto lenta e richiede molta memoria. Sono consapevole del fatto che il numero di stati può crescere in modo esponenziale, ma dopo la minimizzazione, il DFA risultante ha circa 9000 stati ed è sopportabile.

Quindi la mia domanda è: esiste qualche algoritmo che sarebbe più veloce o più adatto alla memoria?


il video è apparentemente sull'algoritmo determinante standard. vedi ad es. minimizzazione NFA senza determinazione,
stackoverflow

Se esegui l'ingenua conversione NFA-> DFA (utilizzando la costruzione del prodotto), quanto è grande il DFA risultante? (prima della minimizzazione)
DW,

2
Che cosa vuoi fare con il DFA? Se sei interessato ai controlli di inclusione, ci sono algoritmi per farlo direttamente.
Vijay D,

Grazie per le risposte molto veloci. Per quanto riguarda le dimensioni, non posso dire esattamente da quando la mia RAM si è esaurita, ma darò un'occhiata più da vicino e che estenderò la domanda. Per quello che voglio fare, non sono sicuro se posso parlarne apertamente, poiché è un po 'del mio solido know-how. Ma posso sicuramente affermare che in realtà ho bisogno del DFA risultante.
Jendas,

1
Hai provato a eseguire l'algoritmo di Angluin per l'apprendimento dei DFA dalle richieste di appartenenza e di equivalenza? La parte di appartenenza è semplice (basta eseguire il tuo DFA sulla stringa richiesta); per equivalenza, potresti disegnare molte stringhe casuali o provare tutte le stringhe fino a una certa lunghezza. Questo è solo un euristico in quanto non saprai mai veramente quando hai finito, ma ho scoperto che questo trucco funziona bene in pratica ...
Aryeh,

Risposte:


6

Hai provato l'algoritmo di Brzozowski ? Il tempo di esecuzione nel caso peggiore è esponenziale, ma vedo alcuni riferimenti che suggeriscono che spesso si comporta molto bene, soprattutto quando si inizia con un NFA che si desidera convertire in DFA e minimizzare.

Il seguente documento sembra rilevante:

Valuta una serie di algoritmi diversi per la minimizzazione di DFA, inclusa la loro applicazione alla tua situazione in cui iniziamo con un NFA e vogliamo convertirlo in un DFA e minimizzarlo.

Che aspetto ha la decomposizione dei componenti fortemente connessi (SCC) del tuo NFA (considerandolo come un grafico diretto)? Ha molti componenti, dove nessuno dei componenti è troppo grande? In tal caso, mi chiedo se potrebbe essere possibile escogitare un algoritmo di divisione e conquista, in cui si prende un singolo componente, lo converte da NFA a DFA e quindi lo minimizza, quindi sostituisce l'originale con la nuova versione determinata. Ciò dovrebbe essere possibile per i componenti a voce singola (in cui tutti i bordi in quel componente portano a un singolo vertice, il vertice di entrata). Non vedo immediatamente se sarebbe possibile fare qualcosa del genere per NFA arbitrari, ma se controlli l'aspetto della struttura dell'SCC, potresti essere in grado di determinare se vale la pena esplorare questo tipo di direzione o meno .


L'algoritmo di Brzozowski sembra promettente, ma la tecnica di divisione e conquista ancora di più! Nel mio caso questo è davvero facile da fare e non richiede grandi modifiche al codice. Lo farò e se funziona, accetterò la tua risposta.
Jendas,

2
Sono venuto, ho chiesto, ho diviso, ho conquistato
Jendas il

2

questo apparentemente non è un problema molto ben studiato nel senso di algoritmi conosciuti / disponibili diversi dalla strategia originale / molto tempo fa di "determinare in DFA / minimizzare DFA". sembri indicare che la fase di determinazione è quella problematica, ma questo è ovviamente tipico dato che ha un caso peggiore di spazio esponenziale / tempo. tieni presente che esistono diversi algoritmi di minimizzazione di DFA che possono variare in modo significativo nelle prestazioni in media.

è anche noto in modo più informale come "minimizzazione della NFA senza determinazione" . è noto per essere difficile nel senso che sostanzialmente non esistono nemmeno algoritmi di approssimazione a meno che P = Pspace come mostrato in questo documento:

tuttavia questo documento non si consideri il caso in generale raramente esplorato di alcuni algoritmi che non sono basati sulla ricerca del determinized DFA 1 ° :

Presentiamo diverse tecniche per ridurre il numero di stati e transizioni in automi non deterministici. Queste tecniche si basano sui due preordini dell'insieme di stati, relativi all'inclusione delle lingue sinistra e destra. Poiché il loro calcolo esatto è NP-difficile, ci concentriamo su approssimazioni polinomiali che consentono comunque una riduzione dell'NFA.

notare che un pacchetto / implementazione disponibile al pubblico in grado di gestire grandi conversioni / minimizzazioni NFA / DFA, ecc., nel modo più efficiente possibile, è la libreria FSM AT&T .

ha una strategia fsmcompactche a volte può bastare:

Nei casi in cui un trasduttore o un accettore ponderato non può essere determinato o diventa molto grande, può essere utile una diversa ottimizzazione - fsmcompact. Questa operazione codifica ogni tripla di un'etichetta di input, un'etichetta di output e un costo in un'unica nuova etichetta, esegue la determinazione e la minimizzazione classiche (accettore non ponderato), quindi decodifica le etichette codificate nei loro valori originali. Ciò ha il vantaggio di essere sempre definito e di non spostare etichette o costi di output lungo i percorsi. Ha lo svantaggio che il risultato non può essere né deterministico né minimo.


vedi anche sulle riduzioni della NFA Ilie, Navarro, Yu
vzn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.