Algoritma untuk mengkonversi NFA yang sangat besar ke DFA

12

Saya memiliki otomat terbatas non-deterministik yang sangat besar dan saya perlu mengubahnya ke DFA.

Secara umum saya maksudkan 40 000+ negara bagian. Sejauh ini saya telah melakukan beberapa percobaan dan memprogram algoritma default yang mencari melalui tabel (seperti dijelaskan di sini ), tetapi bahkan setelah optimasi cukup lambat dan sangat memakan memori. Saya menyadari fakta, bahwa jumlah negara dapat tumbuh secara eksponensial, tetapi setelah minimalisasi, DFA yang dihasilkan memiliki sekitar 9.000 negara dan itu dapat ditoleransi.

Jadi pertanyaan saya adalah, apakah ada beberapa algoritma, yang akan lebih cepat atau lebih ramah memori?

Jendas
sumber
video tersebut rupanya menggunakan algoritma penentuan standar. lihat mis. Minimisasi NFA tanpa determinasi, stackoverflow
vzn
Jika Anda melakukan konversi NFA-> DFA yang naif (menggunakan konstruksi produk), seberapa besar DFA yang dihasilkan? (sebelum minimisasi)
DW
2
Apa yang ingin Anda lakukan dengan DFA? Jika Anda tertarik pada pemeriksaan inklusi, ada algoritma untuk melakukannya secara langsung.
Vijay D
Terima kasih atas jawaban yang sangat cepat. Untuk ukurannya, saya tidak tahu persis karena RAM saya sudah habis, tapi saya akan memberikannya lebih dekat dan daripada memperpanjang pertanyaan. Untuk apa yang ingin saya lakukan, saya tidak yakin, apakah saya dapat berbicara secara terbuka tentang hal itu, karena itu adalah sedikit pengetahuan perusahaan saya. Tapi saya pasti bisa menyatakan, bahwa saya benar-benar membutuhkan DFA yang dihasilkan.
Jendas
1
Sudahkah Anda mencoba menjalankan algoritma Angluin untuk mempelajari DFA dari pertanyaan keanggotaan dan kesetaraan? Bagian keanggotaan mudah (jalankan DFA Anda pada string yang diperlukan); untuk kesetaraan, Anda bisa menggambar banyak string acak atau mencoba semua string hingga panjang tertentu. Ini hanya heuristik karena Anda tidak akan pernah benar-benar tahu kapan Anda selesai, tetapi saya telah menemukan bahwa trik ini bekerja dengan baik dalam praktik ...
Aryeh

Jawaban:

6

Sudahkah Anda mencoba algoritma Brzozowski ? Waktu berjalan terburuk adalah eksponensial, tetapi saya melihat beberapa referensi yang menunjukkan bahwa itu sering berkinerja sangat baik, terutama ketika memulai dengan NFA yang ingin Anda konversi ke DFA dan meminimalkan.

Makalah berikut ini tampaknya relevan:

Ini mengevaluasi sejumlah algoritma yang berbeda untuk minimalisasi DFA, termasuk aplikasi mereka untuk situasi Anda di mana kami mulai dengan NFA dan ingin mengubahnya menjadi DFA dan menguranginya.

Seperti apa dekomposisi komponen yang sangat terhubung (SCC) NFA Anda (menganggapnya sebagai grafik berarah)? Apakah ada banyak komponen, di mana tidak ada komponen yang terlalu besar? Jika demikian, saya bertanya-tanya apakah mungkin untuk merancang algoritma divide-and-conquer, di mana Anda mengambil satu komponen, mengonversinya dari NFA ke DFA dan kemudian menguranginya, dan kemudian mengganti yang asli dengan versi yang ditentukan baru. Ini harus dimungkinkan untuk komponen entri-tunggal (di mana semua tepi ke dalam komponen itu mengarah ke satu simpul, simpul entri). Saya tidak segera melihat apakah mungkin untuk melakukan sesuatu seperti ini untuk NFA sewenang-wenang, tetapi jika Anda memeriksa seperti apa struktur SCC, maka Anda mungkin dapat menentukan apakah arah semacam ini layak dijelajahi atau tidak .

DW
sumber
Algoritma Brzozowski tampaknya menjanjikan, tetapi teknik membagi dan menaklukkan lebih banyak lagi! Dalam kasus saya ini sangat mudah dilakukan dan tidak memerlukan perubahan kode besar. Saya akan melakukan itu dan jika itu berhasil, saya akan menerima jawaban Anda.
Jendas
2
Saya datang, saya bertanya, saya terbagi, saya menaklukkan
Jendas
2

ini tampaknya bukan masalah yang dipelajari dengan sangat baik dalam arti algoritma yang dikenal / tersedia selain dari strategi asli / lama dari "determinize to DFA / meminimalkan DFA". Anda tampaknya menunjukkan langkah determinisasi adalah yang bermasalah, tetapi ini khas tentu saja karena memiliki kasus eksponensial-ruang / waktu yang lebih buruk. perhatikan bahwa ada beberapa algoritma minimalisasi DFA yang dapat bervariasi secara signifikan dalam kinerja rata-rata.

itu juga dikenal lebih informal sebagai "minimalisasi NFA tanpa determinasi" . diketahui sulit dalam arti bahwa pada dasarnya bahkan tidak ada algoritma perkiraan kecuali P = Pspace seperti yang ditunjukkan dalam makalah ini:

Namun makalah ini tidak mempertimbangkan kasus yang umumnya jarang dieksplorasi dari beberapa algoritma yang tidak didasarkan pada penemuan DFA 1 st yang ditentukan :

Kami menyajikan berbagai teknik untuk mengurangi jumlah status dan transisi dalam automata non-deterministik. Teknik-teknik ini didasarkan pada dua preorder atas set negara, terkait dengan dimasukkannya bahasa kiri dan kanan. Karena perhitungan yang tepat adalah NP-hard, kami fokus pada pendekatan polinomial yang memungkinkan pengurangan NFA semua sama.

catat paket / implementasi yang tersedia untuk umum yang dapat menangani konversi / minimasi NFA / DFA besar dll secara umum seefisien mungkin adalah perpustakaan AT&T FSM .

ia memiliki strategi fsmcompactyang terkadang cukup:

Dalam kasus di mana transduser atau akseptor berbobot tidak dapat ditentukan atau tumbuh sangat besar, optimasi yang berbeda mungkin bermanfaat - fsmcompact. Operasi ini mengkodekan setiap tiga kali lipat dari label input, label output dan biaya menjadi satu label baru, melakukan determinasi klasikisasi dan minimalisasi, dan kemudian menerjemahkan kode label yang dikodekan kembali ke nilai aslinya. Ini memiliki keunggulan yang selalu didefinisikan dan tidak memindahkan label atau biaya output di sepanjang jalur. Ini memiliki kelemahan bahwa hasilnya tidak dapat menjadi deterministik atau minimal.

vzn
sumber
lihat juga Pada pengurangan NFA Ilie, Navarro, Yu
vzn