ความแตกต่างระหว่างคืออะไรค้นหากราฟและต้นไม้ค้นหารุ่นเกี่ยวกับ DFS, A * ค้นหาในปัญญาประดิษฐ์ ?
ความแตกต่างระหว่างคืออะไรค้นหากราฟและต้นไม้ค้นหารุ่นเกี่ยวกับ DFS, A * ค้นหาในปัญญาประดิษฐ์ ?
คำตอบ:
เมื่อพิจารณาจากคำตอบที่มีอยู่ดูเหมือนว่าจะมีความสับสนอย่างมากเกี่ยวกับแนวคิดนี้
ความแตกต่างระหว่างการค้นหาต้นไม้และการค้นหากราฟไม่ได้มีรากฐานมาจากความจริงที่ว่ากราฟปัญหาเป็นแบบต้นไม้หรือกราฟทั่วไป สมมติว่าคุณกำลังจัดการกับกราฟทั่วไปอยู่เสมอ ความแตกต่างอยู่ที่รูปแบบการข้ามผ่านที่ใช้ในการค้นหาผ่านกราฟซึ่งอาจเป็นรูปกราฟหรือรูปต้นไม้
หากคุณกำลังจัดการกับปัญหารูปต้นไม้อัลกอริทึมทั้งสองตัวแปรจะนำไปสู่ผลลัพธ์ที่เทียบเท่า คุณจึงสามารถเลือกรูปแบบการค้นหาต้นไม้ที่ง่ายกว่าได้
อัลกอริทึมการค้นหากราฟพื้นฐานของคุณมีลักษณะดังต่อไปนี้ ด้วยโหนดเริ่มต้นกำหนดstart
ขอบsuccessors
และgoal
ข้อกำหนดที่ใช้ในเงื่อนไขการวนซ้ำ open
เก็บโหนดไว้ในหน่วยความจำซึ่งอยู่ระหว่างการพิจารณารายการที่เปิดอยู่ โปรดทราบว่ารหัสหลอกต่อไปนี้ไม่ถูกต้องในทุกด้าน (2)
open <- []
next <- start
while next is not goal {
add all successors of next to open
next <- select one node from open
remove next from open
}
return next
ขึ้นอยู่กับวิธีที่คุณนำไปใช้select from open
คุณจะได้รับอัลกอริทึมการค้นหาที่แตกต่างกันเช่นการค้นหาแบบเจาะลึกก่อน (DFS) (เลือกองค์ประกอบใหม่ล่าสุด) การค้นหาแรกแบบกว้าง (BFS) (เลือกองค์ประกอบที่เก่าแก่ที่สุด) หรือการค้นหาต้นทุนสม่ำเสมอ (เลือกองค์ประกอบที่มีต้นทุนเส้นทางต่ำสุด ) การค้นหา A-star ยอดนิยมโดยการเลือกโหนดที่มีต้นทุนต่ำสุดบวกค่าฮิวริสติกและอื่น ๆ
ขั้นตอนวิธีการที่กล่าวข้างต้นเป็นจริงที่เรียกว่าการค้นหาต้นไม้ มันจะไปที่สถานะของกราฟปัญหาพื้นฐานหลาย ๆ ครั้งหากมีเส้นทางที่กำหนดเส้นทางหลายเส้นทางไปยังมันโดยการรูทในสถานะเริ่มต้น เป็นไปได้ที่จะเยี่ยมชมรัฐเป็นจำนวนครั้งไม่ จำกัด หากอยู่บนลูปนำทาง แต่การเข้าชมแต่ละครั้งจะสอดคล้องกับโหนดที่แตกต่างกันในโครงสร้างที่สร้างโดยอัลกอริทึมการค้นหาของเรา บางครั้งการขาดประสิทธิภาพที่เห็นได้ชัดนี้เป็นสิ่งที่ต้องการตามที่อธิบายไว้
อย่างที่เราเห็นการค้นหาต้นไม้สามารถเยี่ยมชมสถานะได้หลายครั้ง และด้วยเหตุนี้มันจะสำรวจ "ต้นไม้ย่อย" ที่พบหลังจากรัฐนี้หลายครั้งซึ่งอาจมีราคาแพง กราฟแก้ไขการค้นหานี้โดยการติดตามของรัฐที่เข้ามาเยี่ยมชมทั้งหมดในรายการปิด หากรู้จักผู้สืบทอดที่เพิ่งค้นพบnext
อยู่แล้วจะไม่ถูกแทรกลงในรายการที่เปิดอยู่:
open <- []
closed <- []
next <- start
while next is not goal {
add next to closed
add all successors of next to open, which are not in closed
remove next from open
next <- select from open
}
return next
เราสังเกตเห็นว่าการค้นหากราฟต้องใช้หน่วยความจำมากขึ้นเนื่องจากจะติดตามสถานะที่เยี่ยมชมทั้งหมด สิ่งนี้อาจได้รับการชดเชยด้วยรายการเปิดที่เล็กลงซึ่งส่งผลให้ประสิทธิภาพการค้นหาดีขึ้น
วิธีการใช้งานบางวิธีselect
สามารถรับประกันได้ว่าจะส่งคืนโซลูชันที่ดีที่สุดนั่นคือเส้นทางที่สั้นที่สุดหรือเส้นทางที่มีต้นทุนน้อยที่สุด (สำหรับกราฟที่มีต้นทุนติดกับขอบ) โดยทั่วไปจะถือเมื่อใดก็ตามที่โหนดขยายตามลำดับของต้นทุนที่เพิ่มขึ้นหรือเมื่อต้นทุนเป็นค่าคงที่ที่ไม่ใช่ศูนย์บวก ขั้นตอนวิธีการดำเนินการร่วมกันว่าชนิดของการเลือกนี้คือการค้นหาค่าใช้จ่ายในเครื่องแบบหรือถ้าค่าใช้จ่ายในขั้นตอนเหมือนกันBFSหรือIDDFS IDDFS หลีกเลี่ยงการใช้หน่วยความจำเชิงรุกของ BFS และโดยทั่วไปแนะนำสำหรับการค้นหาที่ไม่มีข้อมูล (aka brute force) เมื่อขนาดของขั้นตอนคงที่
นอกจากนี้อัลกอริทึมการค้นหาต้นไม้ A * (ที่ได้รับความนิยมมาก) ยังมอบโซลูชันที่ดีที่สุดเมื่อใช้กับฮิวริสติกส์ อย่างไรก็ตามอัลกอริทึมการค้นหากราฟ A * ให้การรับประกันนี้ก็ต่อเมื่อใช้กับฮิวริสติกที่สม่ำเสมอ (หรือ "โมโนโทนิค") (เงื่อนไขที่แข็งแกร่งกว่าการยอมรับ)
เพื่อความเรียบง่ายรหัสที่นำเสนอไม่:
state
หรือnode
จะเพียงพอสำหรับจุดยอดของกราฟปัญหาพื้นฐานในทางตรงกันข้ามกับกราฟการข้ามผ่านขึ้นอยู่กับบริบท แต่การใช้state
จุดยอดของกราฟปัญหาและnode
สำหรับกราฟการข้ามผ่านสามารถปรับปรุงความชัดเจนของคำตอบได้อย่างแน่นอน ฉันจะพยายามเขียนใหม่เร็ว ๆ นี้ ขอบคุณ.
ต้นไม้เป็นกรณีพิเศษของกราฟดังนั้นอะไรก็ตามที่ใช้ได้กับกราฟทั่วไปก็ใช้ได้กับต้นไม้ ต้นไม้คือกราฟที่มีเส้นทางเดียวระหว่างโหนดแต่ละคู่ นี่หมายความว่าไม่มีวัฏจักรใด ๆ เนื่องจากคำตอบก่อนหน้าระบุ แต่กราฟกำกับโดยไม่มีรอบ (DAG, กราฟ acyclic ที่กำหนดทิศทาง) ไม่จำเป็นต้องเป็นต้นไม้
อย่างไรก็ตามหากคุณรู้ว่ากราฟของคุณมีข้อ จำกัด บางอย่างเช่นเป็นแบบต้นไม้หรือ DAG คุณมักจะพบอัลกอริทึมการค้นหาที่มีประสิทธิภาพมากกว่ากราฟที่ไม่ จำกัด ตัวอย่างเช่นอาจไม่สมเหตุสมผลมากนักที่จะใช้ A * หรือ "อัลกอริทึมของ Dijkstra" ที่ไม่ใช่ฮิวริสติกบนต้นไม้ (ซึ่งมีเพียงเส้นทางเดียวให้เลือกต่อไปซึ่ง DFS หรือ BFS สามารถค้นหาได้) หรือ บน DAG (ซึ่งสามารถหาเส้นทางที่ดีที่สุดได้โดยพิจารณาจากจุดยอดตามลำดับที่ได้จากการเรียงลำดับโทโพโลยี)
สำหรับการกำหนดทิศทางและไม่ได้กำหนดทิศทางกราฟที่ไม่ได้บอกทิศทางเป็นกรณีพิเศษของกราฟที่กำหนดทิศทางกล่าวคือกรณีที่เป็นไปตามกฎ "ถ้ามีขอบ (ลิงก์การเปลี่ยนผ่าน) จากuไปยังvจะมีขอบจากvไปยังuด้วย
อัปเดต : โปรดทราบว่าหากสิ่งที่คุณสนใจคือรูปแบบการข้ามผ่านของการค้นหาแทนที่จะเป็นโครงสร้างของกราฟเองนี่ไม่ใช่คำตอบ ดูเช่นคำตอบของ @ ziggystar
ข้อแตกต่างระหว่างกราฟและต้นไม้เป็นวงจร กราฟอาจมีวัฏจักรต้นไม้ไม่สามารถทำได้ ดังนั้นเมื่อคุณจะใช้อัลกอริทึมการค้นหาบนต้นไม้คุณไม่จำเป็นต้องพิจารณาถึงการมีอยู่ของวัฏจักร แต่เมื่อทำงานกับกราฟโดยพลการคุณจะต้องพิจารณาถึงสิ่งเหล่านี้ หากคุณไม่จัดการกับวัฏจักรในที่สุดอัลกอริทึมอาจตกอยู่ในวงวนที่ไม่มีที่สิ้นสุดหรือการวนซ้ำไม่รู้จบ
อีกประเด็นหนึ่งที่ต้องคิดคือคุณสมบัติทิศทางของกราฟที่คุณกำลังจัดการอยู่ ในกรณีส่วนใหญ่เราจัดการกับต้นไม้ที่แสดงถึงความสัมพันธ์ระหว่างแม่ลูกที่ขอบแต่ละด้าน DAG (กราฟ acyclic ที่กำหนดทิศทาง) ยังแสดงลักษณะที่คล้ายคลึงกัน แต่กราฟสองทิศทางนั้นแตกต่างกัน แต่ละขอบในกราฟสองทิศทางแสดงถึงเพื่อนบ้านสองคน ดังนั้นวิธีการอัลกอริทึมควรแตกต่างกันเล็กน้อยสำหรับกราฟทั้งสองประเภทนี้
กราฟ VS ต้นไม้
แต่ในกรณีของ AI Graph-search เทียบกับ Tree-search
การค้นหากราฟมีคุณสมบัติที่ดีเมื่อใดก็ตามที่อัลกอริทึมสำรวจโหนดใหม่และทำเครื่องหมายว่าเยี่ยมชม "ไม่ว่าจะใช้อัลกอริทึมใดก็ตาม" โดยทั่วไปอัลกอริทึมจะสำรวจโหนดอื่น ๆ ทั้งหมดที่เข้าถึงได้จากโหนดปัจจุบัน
ตัวอย่างเช่นพิจารณากราฟต่อไปนี้ที่มีจุดยอด 3 จุด AB และ C และพิจารณาขอบต่อไปนี้
AB, BC และ CA ก็มีวัฏจักรจาก C ถึง A
และเมื่อใดที่ DFS เริ่มต้นจาก A, A จะสร้างสถานะใหม่ B, B จะสร้างสถานะใหม่ C แต่เมื่อ C ถูกสำรวจอัลกอริทึมจะพยายามสร้างสถานะใหม่ A แต่ A ถูกเยี่ยมชมแล้วดังนั้นจะถูกละเว้น เย็น!
แต่ต้นไม้ล่ะ? อัลกอริทึมต้นไม้ดีไม่ได้ทำเครื่องหมายโหนดที่เยี่ยมชมว่าเยี่ยมชมแล้ว แต่ต้นไม้ไม่มีวัฏจักรมันจะอยู่ในลูปที่ไม่มีที่สิ้นสุดได้อย่างไร?
พิจารณาต้นไม้นี้ด้วยจุดยอด 3 จุดและพิจารณาขอบต่อไปนี้
A - B - C หยั่งรากที่ A ลง สมมติว่าเราใช้อัลกอริทึม DFS
A จะสร้างสถานะใหม่ B, B จะสร้างสถานะ A & C สองสถานะเนื่องจากต้นไม้ไม่มี "ทำเครื่องหมายโหนดที่เยี่ยมชมหากมีการสำรวจ" ดังนั้นอัลกอริทึม DFS อาจสำรวจ A อีกครั้งจึงสร้างสถานะใหม่ B ขึ้นมา เราอยู่ในวงวนที่ไม่มีที่สิ้นสุด
แต่คุณสังเกตเห็นบางสิ่งบางอย่างเรากำลังดำเนินการกับขอบที่ไม่ได้บอกทิศทางเช่นมีการเชื่อมต่อระหว่าง AB และ BA แน่นอนว่านี่ไม่ใช่วัฏจักรเนื่องจากวัฏจักรหมายความว่าจุดยอดจะต้อง> = 3 และจุดยอดทั้งหมดจะแตกต่างกันยกเว้นโหนดแรกและโหนดสุดท้าย
ST A-> B-> A-> B-> A ไม่ใช่วัฏจักรเพราะละเมิดคุณสมบัติการขี่จักรยาน> = 3 แต่แท้จริงแล้ว A-> B-> C-> A เป็นวงจร> = 3 โหนดที่แตกต่างกันตรวจสอบแล้ว โหนดแรกและโหนดสุดท้ายเหมือนกัน
พิจารณาขอบต้นไม้อีกครั้ง A-> B-> C-> B-> A แน่นอนว่ามันไม่ใช่วัฏจักรเนื่องจากมี B สองตัวซึ่งหมายความว่าโหนดทั้งหมดไม่ได้แตกต่างกัน
สุดท้ายคุณสามารถใช้อัลกอริทึมการค้นหาแบบต้นไม้เพื่อป้องกันการสำรวจโหนดเดียวกันซ้ำสองครั้ง แต่นั่นก็มีผล
พูดง่ายๆคือต้นไม้ไม่มีวัฏจักรและตำแหน่งที่กราฟทำได้ ดังนั้นเมื่อเราทำการค้นหาเราควรหลีกเลี่ยงการวนรอบในกราฟเพื่อที่เราจะได้ไม่วนซ้ำ
อีกแง่หนึ่งคือต้นไม้มักจะมีการเรียงลำดับโทโพโลยีบางประเภทหรือคุณสมบัติเช่นต้นไม้ค้นหาแบบไบนารีซึ่งทำให้การค้นหารวดเร็วและง่ายดายเมื่อเทียบกับกราฟ