การค้นหาแบบจำกัดความลึก

การค้นแบบจำกัดความลึก หรือ การค้นหาแบบจำกัดความลึก  เป็นขั้นตอนวิธีทางวิทยาการคอมพิวเตอร์ที่ใช้ในการหาปมบนกราฟซึ่งได้ปรับปรุงจากการค้นหาเชิงลึก (depth first search) เพื่อใช้ในงานค้นหากราฟ ที่ต้องการประสิทธิภาพสูงขึ้น โดยขั้นตอนวิธีนี้ เป็นพื้นฐานของ Iterative deepening depth-first search ซึ่งเป็นขั้นตอนวิธีสำหรับการค้นหาสถานะ (state space search) ที่อาศัยการค้นหาเชิงลึกจำกัดแบบวนเพิ่มความลึกไปเรื่อยๆ เพื่อหาคำตอบที่ดีที่สุด
ลักษณะโดยทั่วไป.
การค้นหาแบบจำกัดความลึกนั้น จะคล้ายกับการค้นหาเชิงลึก แต่จะมีการกำหนดขีดจำกัดของการค้นหาว่าจะค้นหาไม่เกินความลึกเท่าไร หากเกินก็จะหยุดเพื่อป้องกันการค้นลึกไปเรื่อยๆ ซึ่งจะเป็นการหลีกเลี่ยงจุดอ่อนของการค้นหาเชิงลึก ที่อาจเกิดจากการวนไปไม่มีที่สิ้นสุดหากกราฟนั้นมีวังวนอยู่
รหัสเทียม.
 DLS(node, goal, depth) {
 if (depth >= 0) {
 if (node == goal)
 return node
 for each child in expand(node)
 DLS(child, goal, depth-1)
คุณสมบัติ.
ความซับซ้อนด้านพื้นที่.
จะมีความซับซ้อนด้านพื้นที่เป็น O(<math>\vert V \vert</math>) (โดย <math>\vert V \vert</math> คือจำนวนจุดยอดบนกราฟ) เนื่องจากใช้โครงสร้างแบบเดียวกันกับการค้นหาเชิงลึก
ความซับซ้อนด้านเวลา.
จะมีความซับซ้อนด้านเวลาเป็น O(<math> \vert V \vert + \vert E \vert </math>) (<math>\vert V \vert</math> คือจำนวนจุดยอดบนกราฟ และ <math>\vert E \vert</math> คือจำนวนเส้นเชื่อมบนกราฟ) โดยเท่ากับกับแบบการค้นหาเชิงลึก เนื่องจากใช้โครงสร้างแบบเดียวกัน แต่ทว่าการค้นแบบด้วยกระบวนการนี้จะค้นหากราฟภายในระยะที่กำหนดไว้ ไม่ได้ค้นหากราฟทั้งหมด
ความสมบูรณ์ (Completeness).
ถึงแม้ว่าการค้นหาแบบนี้จะทำไม่สามารถเดินตามเส้นเชื่อมของกราฟไปอย่างไม่มีที่สิ้นสุด หรือติดอยู่ในวังวนของกราฟเนื่องจากมีการกำหนดขอบเขตก็ตาม ความสมบูรณ์ของคำตอบนั้นจะขึ้นอยู่กับการกำหนดขอบเขตของความลึก หากกำหนดค่าความลึกไว้น้อยเกินไปก็อาจจะไม่ได้คำตอบ หรือหากกำหนดมากไป ก็อาจจะได้คำตอบที่ไม่ดีที่สุด
การได้คำตอบเหมาะสมที่สุด (Optimality).
คำตอบที่ได้จากการค้นหาแบบนี้อาจจะยังไม่เหมาะสมที่สุด เนื่องจากยังคงมีปัญหาจากการค้นหาเชิงลึก ที่บางกรณีที่หากการไล่ค้นหากราฟนั้นเริ่มเดินทางจากเส้นเชื่อมที่ไม่ใช่เส้นเชื่อมที่ดีที่สุด แล้วค้นเจอคำตอบที่ต้องการ
ตัวอย่าง.
พิจารณากราฟ
จากกราฟ หากเราเริ่มค้นหาจากจุดยอด A และต้องการค้นหาจุดยอด C การค้นหาด้วย Depth First Search โดยไม่ได้มีการจำว่าแวะผ่านจุดยอดใดไปแล้วบ้าง นั้นจะทำการค้นหาในวิถี A -> B -> D -> F -> E -> A -> B -> D -> F -> E -> A -> และวนไปเรื่อยๆ หาจุดยอดที่ต้องการไม่พบ แต่หากกำหนดว่าความลึกของเราจะไม่เกิน 3 เราจะได้การค้นหาเป็น A -> B -> D -> F -> E -> C ซึ่งเป็นจุดยอดที่ต้องการ โดยมีวิถีคือ A -> C
แต่อย่างไรก็ตาม หากเรากำหนดความลึกไว้ไม่เหมาะสม ก็อาจจะทำให้คำตอบที่ได้นั้นไม่เป็นคำตอบที่ดีที่สุด เช่น กำหนดความลึกไว้ที่ 3 และหาจุดยอด E เราจะได้การค้นว่าเป็น A -> B -> D -> F -> E ซึ่งจะได้วิถีของคำตอบคือ A -> B -> F -> E ซึ่งไม่ใช่วิถีที่ดีที่สุด (A -> E) เป็นต้น
การประยุกต์ใช้.
การค้นหาแบบจำกัดความลึก ใช้ในงานหลายๆ ด้าน แต่ส่วนมากนั้นจะใช้ในเรื่องเกี่ยวกับการทำปัญญาประดิษฐ์ (Artificial Intelligence) เช่นการจำลองการเล่นหมากรุก โดยใช้งานร่วมที่ใช้ขั้นตอนวิธีอื่นๆ เพิ่มเติม เช่น minimax (วิธีการหาวิธีที่ดีที่สุด) หรือ alpha-beta (ขั้นตอนวิธีที่ใช้ลดการหาที่ไม่จำเป็น)
ขั้นตอนวิธีหนึ่งที่เกี่ยวข้องคือ Iterative deepening depth-first search ซึ่งเป็นขั้นตอนวิธีสำหรับการค้นหาสถานะ (state space search) ที่อาศัยการค้นหาแบบจำกัดความลึก โดยเพิ่มจำนวนความลึก ไปเรื่อยๆ จนกระทั่งเจอคำตอบ ซึ่งวิธีนี้จะทำให้สามารถรับประกันได้ว่าคำตอบที่เราได้มานั้นเป็นคำตอบที่ดีที่สุด (จะได้วิถีผ่านที่น้อยที่สุด เนื่องจากเราพิจารณาจากวิถีน้อยไปมากขึ้นเรื่อยๆ)
สรุป.
ขั้นตอนวิธีนี้ เกิดจากปรับปรุงแก้ไขจากการค้นหาเชิงลึก เพื่อทำให้ประสิทธิภาพของขั้นตอนวิธีดีขึ้น กล่าวคือ ไม่เกิดการวนซ้ำไปเรื่อยๆ จนไม่มีที่สิ้นสุด แต่อย่างไรก็ตาม ยังมีข้อจำกัดอยู่ที่ว่าเราจะต้องเลือกความลึกของการค้นหาให้เหมาะสม จึงจะทำให้เกิดประสิทธิภาพ กำหนดความลึกไว้น้อย ก็อาจไม่เจอคำตอบ หรือกำหนดความลึกมาก ก็อาจจะได้คำตอบที่ยังไม่ดีที่สุด ซึ่งขั้นตอนวิธีนี้ได้ถูกแก้ไขปรับปรุงเป็น Iterative deepening depth-first search โดยอาศัยหลักการของขั้นตอนวิธีเชิงละโมบ ที่ค่อยๆ หาจากการกำหนดขีดความลึกไว้ที่ 0 แล้วเพิ่มขึ้นเรื่อยๆ จนกว่าเราจะเจอคำตอบต้องการได้