อัลกอริทึมสำหรับการแปลง NFA ที่มีขนาดใหญ่มากเป็น DFA


12

ฉันมีหุ่นยนต์ จำกัด ที่ไม่ จำกัด ขนาดใหญ่จริง ๆ และฉันต้องการแปลงเป็น DFA

โดยขนาดใหญ่ฉันหมายถึง 40 000+ รัฐ จนถึงตอนนี้ฉันได้ทำการทดลองและตั้งโปรแกรมอัลกอริทึมเริ่มต้นที่ค้นหาในตาราง (ตามที่อธิบายไว้ที่นี่ ) แต่แม้หลังจากการปรับให้เหมาะสมค่อนข้างช้าและใช้หน่วยความจำมาก ฉันตระหนักถึงความจริงที่ว่าจำนวนของรัฐสามารถเพิ่มขึ้นชี้แจง แต่หลังจากลดลง DFA ที่เกิดขึ้นมีประมาณ 9,000 รัฐและเป็นที่ยอมรับได้

ดังนั้นคำถามของฉันคือมีอัลกอริทึมบางอย่างที่จะเร็วขึ้นหรือมากขึ้นเป็นมิตรกับความจำ


เห็นได้ชัดว่าวิดีโออยู่บนอัลกอริทึมการกำหนดมาตรฐาน ดูเช่นการลด NFA โดยไม่มีการกำหนด stackoverflow
vzn

หากคุณทำการแปลง NFA ที่ไร้เดียงสา -> DFA (โดยใช้การสร้างผลิตภัณฑ์) DFA ที่ได้จะมีขนาดใหญ่เพียงใด (ก่อนย่อขนาดเล็กสุด)
DW

2
คุณต้องการทำอะไรกับ DFA หากคุณสนใจในการตรวจสอบการรวมมีขั้นตอนวิธีการทำเช่นนั้นโดยตรง
วีเจย์ D

ขอบคุณสำหรับคำตอบที่รวดเร็วมาก สำหรับขนาดฉันไม่สามารถบอกได้อย่างแน่นอนตั้งแต่ RAM ของฉันหมด แต่ฉันจะให้มันดูใกล้กว่าและขยายคำถาม สำหรับสิ่งที่ฉันต้องการจะทำฉันไม่แน่ใจว่าฉันสามารถพูดคุยอย่างเปิดเผยเกี่ยวกับเรื่องนี้ได้หรือไม่เพราะมันเป็นความรู้ที่แน่นแฟ้นของฉัน แต่ฉันสามารถระบุได้อย่างแน่นอนว่าฉันต้องการ DFA จริง ๆ
Jendas

1
คุณได้ลองใช้อัลกอริทึมของ Angluin ในการเรียนรู้ DFA จากการเป็นสมาชิกและการสืบค้นที่เทียบเท่าหรือไม่ ส่วนสมาชิกเป็นเรื่องง่าย (เพียงเรียกใช้ DFA ของคุณบนสตริงที่จำเป็น); เพื่อความเท่าเทียมกันคุณสามารถวาดสตริงสุ่มจำนวนมากหรือลองสตริงทั้งหมดจนถึงความยาวที่แน่นอน นี่เป็นเพียงฮิวริสติกตามที่คุณไม่เคยรู้จริง ๆ เมื่อคุณทำเสร็จ แต่ฉันพบว่าเคล็ดลับนี้ใช้งานได้ดีในทางปฏิบัติ ...
Aryeh

คำตอบ:


6

คุณลองใช้อัลกอริทึมของ Brzozowskiหรือไม่? มันเป็นเวลาที่เลวร้ายที่สุดในการรันคือ exponential แต่ฉันเห็นการอ้างอิงบางอย่างบอกว่ามันมักจะทำงานได้ดีมากโดยเฉพาะเมื่อเริ่มต้นด้วย NFA ที่คุณต้องการแปลงเป็น DFA และย่อให้เล็กสุด

เอกสารต่อไปนี้ดูเหมือนเกี่ยวข้อง:

มันประเมินจำนวนอัลกอริทึมที่แตกต่างกันสำหรับการย่อขนาด DFA รวมถึงการประยุกต์ใช้กับสถานการณ์ของคุณที่เราเริ่มต้นด้วย NFA และต้องการแปลงเป็น DFA และย่อให้เล็กสุด

การแยกส่วนประกอบที่เชื่อมต่ออย่างยิ่ง (SCC) ของ NFA ของคุณ (พิจารณาเป็นกราฟกำกับ) เป็นอย่างไร มันมีส่วนประกอบมากมายหรือไม่ไม่มีส่วนประกอบใดใหญ่เกินไป? ถ้าเป็นเช่นนั้นฉันสงสัยว่ามันอาจเป็นไปได้ที่จะสร้างอัลกอริธึมการหารและการยึดครองที่ซึ่งคุณใช้องค์ประกอบเดียวแปลงจาก NFA เป็น DFA แล้วย่อให้เล็กสุดแล้วแทนที่ต้นฉบับด้วยเวอร์ชันที่กำหนดใหม่ สิ่งนี้ควรเป็นไปได้สำหรับองค์ประกอบรายการเดี่ยว (ที่ขอบทั้งหมดในองค์ประกอบนั้นนำไปสู่จุดสุดยอดเดียวจุดยอดรายการ) ฉันไม่เห็นว่ามันจะเป็นไปได้หรือไม่ที่จะทำอะไรแบบนี้กับ NFA โดยพลการ แต่ถ้าคุณตรวจสอบว่าโครงสร้างของ SCC นั้นเป็นอย่างไรคุณอาจสามารถระบุได้ว่าทิศทางแบบนี้คุ้มค่าหรือไม่ .


อัลกอริทึมของ Brzozowski ดูเหมือนจะมีแนวโน้ม แต่เทคนิคการหารและการพิชิตมากยิ่งขึ้น! ในกรณีของฉันนี้เป็นเรื่องง่ายที่จะทำและไม่จำเป็นต้องมีการเปลี่ยนแปลงรหัสขนาดใหญ่ ฉันจะทำอย่างนั้นและถ้าได้ผลฉันจะยอมรับคำตอบของคุณ
Jendas

2
ฉันมาฉันถามฉันแบ่งฉันเอาชนะ
Jendas

2

เห็นได้ชัดว่านี่ไม่ใช่ปัญหาที่ได้รับการศึกษาเป็นอย่างดีในแง่ของอัลกอริทึมที่รู้จัก / มีอยู่นอกเหนือจากกลยุทธ์ดั้งเดิม / ที่ผ่านมานานของ "กำหนดให้เป็น DFA / ย่อ DFA" ดูเหมือนว่าคุณจะระบุขั้นตอนการกำหนดว่าเป็นปัญหา แต่นี่เป็นเรื่องปกติโดยทั่วไปเนื่องจากมันมีตัวพิมพ์ใหญ่ - อวกาศ / เวลาแย่ลง โปรดทราบว่ามีอัลกอริธึมการลดขนาด DFAหลายอย่างซึ่งอาจแตกต่างกันอย่างมากในประสิทธิภาพโดยเฉลี่ย

ก็ยังเป็นที่รู้จักกันมากขึ้นไม่เป็นทางการว่า"NFA ลดโดยไม่ต้อง determinization" มันเป็นที่รู้กันดีว่าในแง่ที่ว่าไม่มีแม้แต่อัลกอริธึมประมาณเว้นแต่ P = Pspace ดังที่แสดงในบทความนี้:

แต่บทความนี้จะพิจารณากรณีทั่วไปไม่ค่อยสำรวจของขั้นตอนวิธีการบางอย่างที่ยังไม่ได้ขึ้นอยู่กับการหา determinized DFA 1 เซนต์ :

เรานำเสนอเทคนิคที่แตกต่างกันสำหรับการลดจำนวนสถานะและช่วงการเปลี่ยนภาพใน nondeterministic automata เทคนิคเหล่านี้มีพื้นฐานมาจากสองคำสั่งในชุดของรัฐที่เกี่ยวข้องกับการรวมของภาษาซ้ายและขวา เนื่องจากการคำนวณที่แน่นอนของพวกเขาคือ NP-hard เราจึงมุ่งเน้นไปที่การประมาณพหุนามซึ่งเปิดใช้งานการลดลงของ NFA เหมือนกันทั้งหมด

ทราบเป็นแพคเกจที่มีอยู่ทั่วไป / การดำเนินงานที่สามารถจัดการขนาดใหญ่ NFA / แปลง DFA / minimizations ฯลฯ โดยทั่วไปมีประสิทธิภาพที่สุดคือห้องสมุดของ AT & T FSM

มันมีกลยุทธ์fsmcompactที่บางครั้งก็พอเพียง:

ในกรณีที่มีตัวแปลงสัญญาณหรือใบเสร็จถ่วงน้ำหนักไม่สามารถ determinized หรือเติบโตมีขนาดใหญ่มากการเพิ่มประสิทธิภาพที่แตกต่างกันอาจจะมีประโยชน์ fsmcompact- การดำเนินการนี้เข้ารหัสแต่ละฉลากสามรายการฉลากผลลัพธ์และค่าใช้จ่ายลงในฉลากใหม่เดียวดำเนินการกำหนดและการย่อขนาดแบบคลาสสิก (ตัวรับแบบไม่ถ่วง) และถอดรหัสฉลากกลับไปเป็นค่าดั้งเดิม นี่เป็นข้อดีที่กำหนดไว้เสมอและไม่ย้ายป้ายกำกับผลลัพธ์หรือต้นทุนตามเส้นทาง มันมีข้อเสียที่ผลลัพธ์ไม่สามารถกำหนดได้หรือน้อยที่สุด


ดูที่การลด NFA ของ Ilie, Navarro, Yu
vzn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.