คุณสามารถใช้set
(ในความหมายทางคณิตศาสตร์ของคำเช่นคอลเลกชันที่ไม่สามารถมีรายการที่ซ้ำกัน) เพื่อจัดเก็บสถานะที่คุณได้เห็นแล้ว การดำเนินการที่คุณจะต้องสามารถดำเนินการได้คือ:
- องค์ประกอบการแทรก
- ทดสอบว่ามีองค์ประกอบอยู่ในนั้นหรือไม่
ภาษาการเขียนโปรแกรมทุกภาษาน่าจะได้รับการสนับสนุนสำหรับโครงสร้างข้อมูลที่สามารถดำเนินการทั้งสองนี้ได้ในเวลาที่คงที่ ( ) ตัวอย่างเช่น:O ( 1 )
set
ใน Python
HashSet
ใน Java
เมื่อดูอย่างรวดเร็วครั้งแรกอาจดูเหมือนว่าการเพิ่มสถานะทั้งหมดที่คุณเคยเห็นในชุดนี้จะมีราคาแพงกว่าหน่วยความจำ แต่ก็ไม่ได้เลวร้ายเมื่อเทียบกับหน่วยความจำที่คุณต้องการสำหรับชายแดนของคุณ หากปัจจัยการแตกแขนงของคุณคือเขตแดนของคุณจะขยายตัวโดยองค์ประกอบต่อโหนดที่คุณเข้าชม (ลบโหนดจากชายแดนเพื่อ "เยี่ยมชม" มันเพิ่มผู้สืบทอดใหม่ / เด็ก ) ในขณะที่ชุดของคุณจะเพิ่มขึ้นพิเศษ โหนดต่อโหนดที่เข้าชมขb - 11ข1
ใน pseudocode ชุดดังกล่าว (ลองตั้งชื่อclosed_set
เพื่อให้สอดคล้องกับpseudocode บน wikipediaสามารถใช้ในการค้นหาแบบกว้างแรกได้ดังนี้:
frontier = First-In-First-Out Queue
frontier.add(initial_state)
closed_set = set()
while frontier not empty:
current = frontier.remove_next()
if current == goal_state:
return something
for each child in current.generate_children()
if child not in closed_set: // This operation should be supported in O(1) time regardless of closed_set's current size
frontier.add(child)
closed_set.add(current) // this should also run in O(1) time
(รูปแบบบางส่วนของรหัสเทียมนี้อาจทำงานได้เช่นกันและมีประสิทธิภาพมากหรือน้อยขึ้นอยู่กับสถานการณ์ตัวอย่างเช่นคุณสามารถใช้closed_set
เพื่อรวมโหนดทั้งหมดที่คุณได้เพิ่มลูก ๆ ลงในแนวชายแดนแล้วหลีกเลี่ยงการgenerate_children()
โทรทั้งหมด หากcurrent
อยู่ในclosed_set
.)
สิ่งที่ฉันอธิบายข้างต้นจะเป็นวิธีมาตรฐานในการจัดการปัญหานี้ โดยสังหรณ์ใจฉันสงสัยว่า "วิธีแก้ปัญหา" ที่แตกต่างกันอาจเป็นการสุ่มลำดับของรายการสถานะผู้สืบทอดใหม่ก่อนที่จะเพิ่มลงในเขตแดน ด้วยวิธีนี้คุณจะไม่หลีกเลี่ยงปัญหาของการเพิ่มสถานะเป็นครั้งคราวว่าคุณได้ขยายไปยังชายแดนแล้ว แต่ฉันคิดว่ามันควรลดความเสี่ยงของการติดขัดในวงจรที่ไม่มีที่สิ้นสุด
ระวัง : ฉันไม่รู้การวิเคราะห์อย่างเป็นทางการของโซลูชันนี้ที่พิสูจน์ว่ามันหลีกเลี่ยงวงจรที่ไม่มีที่สิ้นสุดเสมอ ถ้าฉันพยายาม "เรียกใช้" สิ่งนี้ผ่านหัวของฉันอย่างสังหรณ์ใจฉันคิดว่ามันควรจะทำงานได้ดีและไม่ต้องการหน่วยความจำเพิ่มเติม อาจมีบางกรณีที่ฉันไม่ได้คิดในตอนนี้ดังนั้นมันอาจใช้งานไม่ได้โซลูชันมาตรฐานที่อธิบายไว้ข้างต้นจะปลอดภัยกว่า (ราคาหน่วยความจำเพิ่มเติม)