อะไรคือความแตกต่างระหว่างการค้นหากราฟและการค้นหาแบบต้นไม้?


คำตอบ:


187

เมื่อพิจารณาจากคำตอบที่มีอยู่ดูเหมือนว่าจะมีความสับสนอย่างมากเกี่ยวกับแนวคิดนี้

ปัญหาคือกราฟเสมอ

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

หากคุณกำลังจัดการกับปัญหารูปต้นไม้อัลกอริทึมทั้งสองตัวแปรจะนำไปสู่ผลลัพธ์ที่เทียบเท่า คุณจึงสามารถเลือกรูปแบบการค้นหาต้นไม้ที่ง่ายกว่าได้

ความแตกต่างระหว่างการค้นหากราฟและต้นไม้

อัลกอริทึมการค้นหากราฟพื้นฐานของคุณมีลักษณะดังต่อไปนี้ ด้วยโหนดเริ่มต้นกำหนด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 * ให้การรับประกันนี้ก็ต่อเมื่อใช้กับฮิวริสติกที่สม่ำเสมอ (หรือ "โมโนโทนิค") (เงื่อนไขที่แข็งแกร่งกว่าการยอมรับ)

(2) ข้อบกพร่องของรหัสหลอก

เพื่อความเรียบง่ายรหัสที่นำเสนอไม่:

  • จัดการการค้นหาที่ล้มเหลวกล่าวคือจะใช้งานได้ก็ต่อเมื่อพบวิธีแก้ไข

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

1
@ ไบรอันปัญหารูปต้นไม้หมายถึงกราฟที่คุณกำลังค้นหาคือต้นไม้ และสำหรับคำถามที่สองของคุณ: ขึ้นอยู่กับปัญหา ความเป็นไปได้อย่างหนึ่งคือการจัดเก็บเส้นทางไปยังโหนดพร้อมกับโหนดที่ขยายแต่ละโหนดหากเป็นไปได้
ziggystar

6
เป็นทางการมากกว่าที่จะกล่าวว่า 'สถานะเดียว' สามารถเข้าชมได้หลายครั้งโดยการค้นหาแบบทรีและไม่ใช่โหนด เนื่องจากทุกโหนดในแผนผังการค้นหาสอดคล้องกับเส้นทางเดียวในกราฟพื้นที่สถานะและมีการเข้าชมมากที่สุดพร้อมกันโดยการค้นหาแบบต้นไม้ (แม้ว่านี่จะไม่เป็นความจริงสำหรับ Iterative Deepening Search ซึ่งเคลื่อนที่ข้ามต้นไม้ด้วยขีดจำกัดความลึกที่เพิ่มขึ้น แต่ในกรณีนั้นในทุก ๆ การวนซ้ำทุกโหนดจะเข้าชมเพียงครั้งเดียว)
Nader Ghanbari

1
@NaderhadjiGhanbari stateหรือnodeจะเพียงพอสำหรับจุดยอดของกราฟปัญหาพื้นฐานในทางตรงกันข้ามกับกราฟการข้ามผ่านขึ้นอยู่กับบริบท แต่การใช้stateจุดยอดของกราฟปัญหาและnodeสำหรับกราฟการข้ามผ่านสามารถปรับปรุงความชัดเจนของคำตอบได้อย่างแน่นอน ฉันจะพยายามเขียนใหม่เร็ว ๆ นี้ ขอบคุณ.
ziggystar

TL; DR: การค้นหากราฟใช้โครงสร้างข้อมูลแบบปิดในขณะที่การค้นหาแบบต้นไม้ไม่ทำ
shinzou

8

ต้นไม้เป็นกรณีพิเศษของกราฟดังนั้นอะไรก็ตามที่ใช้ได้กับกราฟทั่วไปก็ใช้ได้กับต้นไม้ ต้นไม้คือกราฟที่มีเส้นทางเดียวระหว่างโหนดแต่ละคู่ นี่หมายความว่าไม่มีวัฏจักรใด ๆ เนื่องจากคำตอบก่อนหน้าระบุ แต่กราฟกำกับโดยไม่มีรอบ (DAG, กราฟ acyclic ที่กำหนดทิศทาง) ไม่จำเป็นต้องเป็นต้นไม้

อย่างไรก็ตามหากคุณรู้ว่ากราฟของคุณมีข้อ จำกัด บางอย่างเช่นเป็นแบบต้นไม้หรือ DAG คุณมักจะพบอัลกอริทึมการค้นหาที่มีประสิทธิภาพมากกว่ากราฟที่ไม่ จำกัด ตัวอย่างเช่นอาจไม่สมเหตุสมผลมากนักที่จะใช้ A * หรือ "อัลกอริทึมของ Dijkstra" ที่ไม่ใช่ฮิวริสติกบนต้นไม้ (ซึ่งมีเพียงเส้นทางเดียวให้เลือกต่อไปซึ่ง DFS หรือ BFS สามารถค้นหาได้) หรือ บน DAG (ซึ่งสามารถหาเส้นทางที่ดีที่สุดได้โดยพิจารณาจากจุดยอดตามลำดับที่ได้จากการเรียงลำดับโทโพโลยี)

สำหรับการกำหนดทิศทางและไม่ได้กำหนดทิศทางกราฟที่ไม่ได้บอกทิศทางเป็นกรณีพิเศษของกราฟที่กำหนดทิศทางกล่าวคือกรณีที่เป็นไปตามกฎ "ถ้ามีขอบ (ลิงก์การเปลี่ยนผ่าน) จากuไปยังvจะมีขอบจากvไปยังuด้วย

อัปเดต : โปรดทราบว่าหากสิ่งที่คุณสนใจคือรูปแบบการข้ามผ่านของการค้นหาแทนที่จะเป็นโครงสร้างของกราฟเองนี่ไม่ใช่คำตอบ ดูเช่นคำตอบของ @ ziggystar


อืมบริบทของคำถามยังไม่ชัดเจนสำหรับฉัน แต่เมื่อมองอีกครั้งหลังจากเห็นคำตอบของคุณ @ziggystar ฉันรู้สึกว่าการเอ่ยถึง A * และ AI บ่งบอกว่าคุณอาจจะถูกและคำตอบของฉัน นอกบริบท ฉันตีความ "การค้นหาต้นไม้" ว่า "การค้นหาต้นไม้" ไม่ใช่ "การค้นหากราฟทั่วไปโดยใช้รูปแบบการเดินทางที่เป็นรูปต้นไม้" ซึ่งเป็นความหมายของคำตอบของคุณ
njlarsson

@njlarsson ฉันได้ใส่วลีของคุณไว้ในคำตอบของฉัน เป็นเรื่องดีสำหรับการชี้แจง
ziggystar

เพิ่มหมายเหตุนี้ในคำตอบ ฉันสงสัยว่าคำตอบของฉันเป็นคำตอบที่ถูกต้องสำหรับหลาย ๆ คนที่หาทางมาที่นี่ผ่าน Google ฯลฯ แม้ว่ามันอาจจะไม่ตรงกับบริบทของสิ่งที่ Rayhanur Rahman ตามมาก็ตาม
njlarsson

ฉันเคยเห็นนักเรียนหลายคนมีปัญหาในการศึกษาอัลกอริทึมการค้นหาและคำตอบของคุณทำให้พวกเขาเข้าใจผิด
Nader Ghanbari

1
คำตอบคือเกี่ยวกับอัลกอริทึมการค้นหาเช่นกัน แต่ความจริงไม่ใช่สิ่งที่ผู้โพสต์ถาม ดู "อัปเดต" ในคำตอบ - ฉันตระหนักในเดือนมีนาคม 2014 ว่าฉันเข้าใจคำถามผิด เหตุผลของฉันที่ไม่ลบคำตอบก็คือมันอาจยังมีประโยชน์สำหรับคนที่มาที่นี่ผ่านการค้นหา
njlarsson

3

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

อีกประเด็นหนึ่งที่ต้องคิดคือคุณสมบัติทิศทางของกราฟที่คุณกำลังจัดการอยู่ ในกรณีส่วนใหญ่เราจัดการกับต้นไม้ที่แสดงถึงความสัมพันธ์ระหว่างแม่ลูกที่ขอบแต่ละด้าน DAG (กราฟ acyclic ที่กำหนดทิศทาง) ยังแสดงลักษณะที่คล้ายคลึงกัน แต่กราฟสองทิศทางนั้นแตกต่างกัน แต่ละขอบในกราฟสองทิศทางแสดงถึงเพื่อนบ้านสองคน ดังนั้นวิธีการอัลกอริทึมควรแตกต่างกันเล็กน้อยสำหรับกราฟทั้งสองประเภทนี้


3
หากต้องการเพิ่มสิ่งนี้หากคุณมีต้นไม้จริงๆคุณไม่จำเป็นต้องทำการตรวจจับซ้ำใน A * คุณยังต้องการวิธีแยกเส้นทางสุดท้ายดังนั้นคุณอาจยังมีรายการปิดอยู่
Nathan S.

ตามปกติต้นไม้คือกราฟกำกับโดยมีเส้นทางมากที่สุดหนึ่งเส้นทางระหว่างจุดยอดสองจุด นั่นคือมีความแตกต่างสองประการระหว่างกราฟและต้นไม้: กำกับและเส้นทางที่ไม่เหมือนใคร อัลกอริทึมที่ทำงานบน DAG ไม่จำเป็นต้องตรวจสอบรอบและอัลกอริทึมที่ทำงานบนต้นไม้ไม่จำเป็นต้องตรวจสอบรายการที่ซ้ำกัน
thiton

1
คำศัพท์แตกต่างกันไป แต่ไม่ได้นำต้นไม้มากำกับเสมอไป สำหรับฝังรากต้นไม้คือเมื่อหนึ่งโหนดที่ระบุไว้จะเป็นรากที่มีทิศทางโดยนัย แต่ต้นไม้จะได้ไม่ต้องถูกฝัง นอกจากนี้กราฟทั่วไปสามารถกำหนดทิศทางหรือไม่กำหนดทิศทางได้ นอกจากนี้ถ้าคุณมีความต้องการเฉพาะที่มากที่สุดเส้นทางหนึ่งระหว่างสองจุดที่คุณ ได้แก่ป่า โดยปกติต้นไม้ถูกกำหนดให้เป็นกราฟที่เชื่อมต่อกันกล่าวคือต้องมีเส้นทางเดียวอย่างแม่นยำ
njlarsson

คำตอบนี้ได้รับความแตกต่างระหว่างต้นไม้และกราฟในทฤษฎีกราฟมากขึ้น แต่ไม่ตรงกับอัลกอริทึมการค้นหาประเภทต่างๆ
mlibby

1

กราฟ 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 สองตัวซึ่งหมายความว่าโหนดทั้งหมดไม่ได้แตกต่างกัน

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


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

1

พูดง่ายๆคือต้นไม้ไม่มีวัฏจักรและตำแหน่งที่กราฟทำได้ ดังนั้นเมื่อเราทำการค้นหาเราควรหลีกเลี่ยงการวนรอบในกราฟเพื่อที่เราจะได้ไม่วนซ้ำ

อีกแง่หนึ่งคือต้นไม้มักจะมีการเรียงลำดับโทโพโลยีบางประเภทหรือคุณสมบัติเช่นต้นไม้ค้นหาแบบไบนารีซึ่งทำให้การค้นหารวดเร็วและง่ายดายเมื่อเทียบกับกราฟ

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