A * pathfinding ทำงานอย่างไร


67

ฉันต้องการที่จะเข้าใจในระดับพื้นฐานว่า A * pathfinding ทำงานอย่างไร การใช้รหัสหรือรหัส psuedo ใด ๆ รวมถึงการสร้างภาพข้อมูลจะเป็นประโยชน์


นี่คือบทความเล็ก ๆ น้อย ๆ ที่มี GIF แบบเคลื่อนไหวที่แสดงอัลกอริทึมของ Dijkstra ในการเคลื่อนไหว
Ólafur Waage

A * Pages ของ Amitเป็นการแนะนำที่ดีสำหรับฉัน คุณสามารถค้นหาการสร้างภาพข้อมูลที่ดีจำนวนมากที่กำลังค้นหาอัลกอริทึม AStarบน youtube
jdeseno

ฉันสับสนด้วยคำอธิบายจำนวนหนึ่งของ A * ก่อนที่ฉันจะพบการสอนที่ยอดเยี่ยมนี้: policyalmanac.org/games/aStarTutorial.htmฉันมักจะพูดถึงเรื่องนี้เมื่อฉันเขียนการใช้งาน A * ใน ActionScript: newarteest.com/flash /astar.html
jhocking

4
-1 วิกิพีเดียมีบทความเกี่ยวกับ A * ที่มีคำอธิบายซอร์สโค้ดและการสร้างภาพ ... คำตอบบางส่วนที่นี่มีลิงก์ภายนอกจากหน้าวิกินั้น
user712092

4
นอกจากนี้เนื่องจากนี่เป็นเรื่องที่ค่อนข้างซับซ้อนและน่าสนใจอย่างมากสำหรับนักพัฒนาเกมฉันคิดว่าเราต้องการข้อมูลที่นี่ ฉันจำได้ว่า Joel เคยบอกว่าเขาต้องการให้ StackOverflow เป็นที่นิยมสูงสุดเมื่อมีคนตั้งคำถามกับ Google
jhocking

คำตอบ:


63

คำปฏิเสธ

มีตัวอย่างโค้ดจำนวนมากและคำอธิบายของ A * ที่สามารถพบได้ทางออนไลน์ คำถามนี้ยังได้รับคำตอบที่ยอดเยี่ยมพร้อมลิงก์ที่มีประโยชน์มากมาย ในคำตอบของฉันฉันจะพยายามแสดงตัวอย่างของอัลกอริทึมซึ่งอาจเข้าใจง่ายกว่าโค้ดหรือคำอธิบาย


อัลกอริทึมของ Dijkstra

เพื่อทำความเข้าใจ A * ฉันขอแนะนำให้คุณดูขั้นตอนวิธีของ Dijkstraก่อน ให้ฉันแนะนำคุณผ่านขั้นตอนวิธีอัลกอริทึมของ Dijkstra จะทำการค้นหา

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

ภาพประกอบของ Dijkstra ตอนที่ 1

นี่คือจุดเริ่มต้นของเรา เรามีลิสต์ของโหนดเพื่อตรวจสอบรายการนี้คือ:

{ A(0) }

Aมีค่าใช้จ่าย0โหนดอื่น ๆ ทั้งหมดถูกตั้งค่าเป็นอนันต์ (ในการนำไปใช้โดยทั่วไปสิ่งนี้จะคล้ายint.MAX_VALUEหรือคล้ายกัน)

ภาพประกอบของ Dijkstra ตอนที่ 2

เรารับโหนดด้วยราคาที่ต่ำที่สุดจากรายการโหนดของเรา (เนื่องจากรายการของเรามีเฉพาะAนี่คือผู้สมัครของเรา) และเยี่ยมชมเพื่อนบ้านทั้งหมด เรากำหนดค่าใช้จ่ายของแต่ละเพื่อนบ้านเป็น:

Cost_of_Edge + Cost_of_previous_Node

และติดตามโหนดก่อนหน้า (แสดงเป็นตัวอักษรสีชมพูเล็ก ๆ ด้านล่างโหนด) Aสามารถทำเครื่องหมายว่าแก้ไขแล้ว (สีแดง) ได้ในขณะนี้เพื่อที่เราจะไม่ไปดูอีก รายชื่อผู้สมัครของเราตอนนี้มีลักษณะดังนี้:

{ B(2), D(3), C(4) }

ภาพประกอบของ Dijkstra ตอนที่ 3

อีกครั้งเรานำโหนดที่มีต้นทุนต่ำที่สุดจากรายการของเรา ( B) และประเมินเพื่อนบ้าน เส้นทางที่จะDมีราคาแพงกว่าค่าใช้จ่ายในปัจจุบันของDดังนั้นเส้นทางนี้สามารถทิ้ง Eจะถูกเพิ่มในรายชื่อผู้สมัครของเราซึ่งตอนนี้มีลักษณะดังนี้:

{ D(3), C(4), E(4) }

ภาพประกอบของ Dijkstra ตอนที่ 4

Dโหนดต่อไปเพื่อตรวจสอบอยู่ในขณะนี้ การเชื่อมต่อที่Cสามารถยกเลิกได้เนื่องจากเส้นทางไม่สั้นกว่าค่าใช้จ่ายที่มีอยู่ เราพบเส้นทางที่สั้นกว่าEแต่ค่าใช้จ่ายEและโหนดก่อนหน้านี้จะได้รับการอัปเดต รายการของเราตอนนี้ดูเหมือนว่านี้:

{ E(3), C(4) }

ภาพประกอบของ Dijkstra ตอนที่ 5

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

{ C(4), F(10) }

ภาพประกอบของ Dijkstra ตอนที่ 6

Cต่อไปเราจะตรวจสอบ Fเราสามารถปรับปรุงค่าใช้จ่ายและโหนดก่อนหน้านี้สำหรับ เนื่องจากรายการของเราตอนนี้มีFโหนดเป็นค่าใช้จ่ายต่ำสุดที่เราทำ เส้นทางของเราสามารถสร้างได้โดยการย้อนรอยโหนดที่สั้นที่สุดก่อนหน้า


อัลกอริทึม *

ดังนั้นคุณอาจสงสัยว่าทำไมฉันอธิบาย Dijkstra ให้คุณแทนอัลกอริทึม A * ? ความแตกต่างเพียงอย่างเดียวคือวิธีที่คุณชั่งน้ำหนัก (หรือเรียงลำดับ) ผู้สมัครของคุณ ด้วย Dijkstra มัน:

Cost_of_Edge + Cost_of_previous_Node

ด้วย A * มันคือ:

Cost_of_Edge + Cost_of_previous_Node + Estimated_Cost_to_reach_Target_from(Node)

ที่ไหนEstimated_Cost_to_reach_Target_fromกันทั่วไปจะเรียกว่าHeuristicฟังก์ชั่น นี่คือฟังก์ชั่นที่จะพยายามประมาณการค่าใช้จ่ายเพื่อให้ถึงเป้าหมายโหนด ฟังก์ชั่นการแก้ปัญหาที่ดีจะประสบความสำเร็จได้ว่าจะต้องมีการเยี่ยมชมโหนดน้อยกว่าเพื่อค้นหาเป้าหมาย ในขณะที่อัลกอริธึมของ Dijkstra จะขยายออกไปทุกด้าน A * จะค้นหาด้วยวิธีฮิวริสติกในทิศทางของเป้าหมาย

หน้า Amit เกี่ยวกับการวิเคราะห์พฤติกรรมมีภาพรวมที่ดีเกี่ยวกับการวิเคราะห์พฤติกรรมทั่วไป


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

2
@AsherEinhorn มันจะยังคงดีกว่า (หรือในกรณีที่แย่ที่สุดเท่ากัน) กว่าการค้นหาที่ไม่มีข้อมูลอย่าง Djikstra's
bummzack

ใช่แล้วคุณพูดถูก บางทีฉันอาจจะไม่ชัดเจนตัวอย่างเช่นที่ฉันพูดถึงในความคิดเห็นข้างต้นเป็นทฤษฎี 'กรณีที่เลวร้ายที่สุด' สำหรับ A * ด้วยทฤษฎีฮิวริสติก แต่เป็นสิ่งที่ Dijkstra ทำทุกครั้ง เวลาส่วนใหญ่ A * จะดีขึ้นแม้ว่าจะมีฮิวริสติกแบบง่าย ๆ ประเด็นของฉันคือฮิวริสติกสามารถสร้างความสับสนได้ในตอนแรกเพราะ 'ระยะทางไปยังเป้าหมาย' ไม่ได้เหมาะสมเสมอไปสำหรับทุกสถานการณ์ - ประเด็นก็คือมันทำเพื่อที่สุด
SirYakalot

นอกจากนี้ดูสิ่งนี้: qiao.github.io/PathFinding.js/visual
David Chouinard

คำตอบนี้สามารถใช้การกล่าวถึงสิ่งที่ทำให้ยอมรับฮิวริสติกได้ในแง่ของการรับประกันว่า A * จะพบเส้นทางที่สั้นที่สุด (สั้น ๆ : เพื่อให้ยอมรับการแก้ปัญหาจะต้องไม่เคยประเมินค่าสูงระยะทางจริงในการกำหนดเป้าหมายการวิเคราะห์พฤติกรรมไม่ยอมรับบางครั้งอาจจะมีประโยชน์ แต่พวกเขาสามารถทำให้เกิด A * เพื่อกลับเส้นทางด้อย..)
Ilmari Karonen

26

การค้นหาเส้นทาง * เป็นการค้นหาประเภทที่ดีที่สุดซึ่งใช้การวิเคราะห์พฤติกรรมเพิ่มเติม

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

อย่างไรก็ตามเริ่มต้นที่ไทล์เริ่มต้นที่ระบุ:

  • ไพ่ 8 ใบรอบ ๆ ไพ่เริ่มต้นคือ "คะแนน" ตาม) ค่าใช้จ่ายในการเคลื่อนย้ายจากไทล์ปัจจุบันไปยังไทล์ถัดไป (โดยทั่วไป 1 สำหรับการเคลื่อนไหวในแนวนอนหรือแนวตั้ง

  • แต่ละไทล์จะได้รับคะแนน "ฮิวริสติก" เพิ่มเติม - การประมาณมูลค่าสัมพัทธ์ของการย้ายไปยังไทล์แต่ละอัน ฮิวริสติกที่แตกต่างกันจะใช้วิธีที่ง่ายที่สุดคือระยะทางเส้นตรงระหว่างจุดกึ่งกลางของไทล์ที่กำหนดและไทล์เอนด์

  • ไทล์ปัจจุบันคือ "ปิด" และเอเจนต์ย้ายไปที่ไทล์ข้างเคียงที่เปิดอยู่มีคะแนนการเคลื่อนไหวต่ำสุดและคะแนนฮิวริสติกต่ำสุด

  • กระบวนการนี้จะทำซ้ำจนกว่าจะถึงโหนดเป้าหมายหรือไม่มีโหนดเปิดอีกต่อไป (หมายถึงเอเจนต์ถูกบล็อก)

สำหรับแผนภาพแสดงขั้นตอนเหล่านี้อ้างถึงนี้กวดวิชาเริ่มต้นที่ดีของ

มีการปรับปรุงบางอย่างที่สามารถทำได้ส่วนใหญ่ในการปรับปรุงการแก้ปัญหา:

  • คำนึงถึงความแตกต่างของภูมิประเทศความหยาบความสูง ฯลฯ

  • บางครั้งมันก็มีประโยชน์ที่จะทำการ "กวาด" ข้ามเส้นตารางเพื่อสกัดกั้นพื้นที่ของแผนที่ที่ไม่ใช่เส้นทางที่มีประสิทธิภาพเช่นรูปตัว U ที่หันหน้าไปหาตัวแทน หากไม่มีการทดสอบการกวาดตัวเอเจนต์จะเข้าสู่ U ก่อนหันหลังจากนั้นออกไปและเดินไปรอบ ๆ ขอบของเอเจนต์อัจฉริยะที่แท้จริงของแท้จะสังเกตเห็นกับดักรูปตัวยูและหลีกเลี่ยงมัน การกวาดสามารถช่วยจำลองสิ่งนี้


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

ฉันจะยืนยันว่าจะชัดเจนน้อยกว่าจริงเพราะมันยากที่จะเห็นภาพ แต่ใช่คำอธิบายนี้ควรพูดถึงว่าไม่จำเป็นต้องใช้กริดไทล์ อันที่จริงแล้วฉันจะแก้ไขจุดนั้นใน
jhocking

14

มันไกลจากสิ่งที่ดีที่สุด แต่นี่เป็นการนำไปใช้ที่ฉันทำในA * ใน C ++เมื่อไม่กี่ปีก่อน

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

  1. A * บนวิกิพีเดีย
  2. การสาธิต * Java

4
ตัวอย่างไพ ธ อนของคุณเป็น C ++
Buns of Aluminium

@finish - ดีที่เห็นคนจับได้! กิจกรรมวันต่อวันหมุนรอบ Python วันนี้ ขอบคุณ!
David McGraw

3
ตัวอย่าง C ++ ของคุณอาจเป็น C.
deceleratedcaviar

4
ตัวอย่างอาจรวมอยู่ในแอสเซมเบลอร์สำหรับโครงสร้างทั้งหมดที่มี มันไม่ได้เป็น A * คำตอบนี้เป็นที่ยอมรับได้อย่างไร

4
ขออภัยมันไม่ได้ขึ้นอยู่กับเพื่อนมันเป็นหนึ่งในความพยายามครั้งแรกในการเขียนโค้ดของฉันเมื่อฉันเริ่ม อย่าลังเลที่จะมีส่วนร่วมในความคิดเห็น / แก้ไขโพสต์เพื่อแบ่งปันโซลูชันของคุณเอง
David McGraw

6

คุณอาจพบบทความของ ActiveTut ในการค้นหาเส้นทางที่มีประโยชน์ มันครอบคลุมทั้งอัลกอริทึมของ A * และ Dijkstra และความแตกต่างระหว่างพวกเขา มันมุ่งไปที่นักพัฒนา Flash แต่ควรให้ข้อมูลเชิงลึกเกี่ยวกับทฤษฎีที่ดีแม้ว่าคุณจะไม่ใช้ Flash


4

สิ่งหนึ่งที่สำคัญในการมองเห็นเมื่อต้องรับมือกับอัลกอริทึมของ A * และ Dijkstra คือ A * ถูกนำมาใช้ มันพยายามค้นหาเส้นทางที่สั้นที่สุดไปยังจุดใดจุดหนึ่งโดย "คาดเดา" ซึ่งทิศทางที่จะมอง อัลกอริทึมของ Dijkstra ค้นหาเส้นทางที่สั้นที่สุดไปยัง / ทุกๆ / จุด


1
นี่ไม่ใช่คำอธิบายที่ถูกต้องจริงๆเกี่ยวกับความแตกต่างระหว่าง A * และ Dijkstra มันเป็นความจริงที่ Dijkstra แก้ปัญหาแหล่งเดียวทุกจุด แต่เมื่อใช้ในเกมมักจะถูกตัดออกทันทีที่คุณพบเส้นทางไปยังเป้าหมาย ความแตกต่างที่แท้จริงระหว่างสองสิ่งนี้คือการแจ้งให้ทราบโดยฮิวริสติกและสามารถค้นหาเป้าหมายนั้นที่มีสาขาน้อยลง

หากต้องการเพิ่มคำอธิบายของ Joe: A * จะค้นหาเส้นทางไปยังทุกจุดเช่นกันหากคุณปล่อยให้มันเป็นไปได้ แต่ในเกมเรามักจะต้องการหยุดก่อน A * ทำงานเหมือนกับอัลกอริธึมของ Dijsktra ยกเว้นการเรียนรู้ด้วยตนเองจะช่วยจัดลำดับโหนดใหม่เพื่อสำรวจเส้นทางที่มีแนวโน้มมากที่สุดก่อน ด้วยวิธีนี้คุณสามารถหยุดได้เร็วกว่าอัลกอริธึมของ Dijkstra ตัวอย่างเช่นหากคุณต้องการหาเส้นทางจากศูนย์กลางของแผนที่ไปทางด้านตะวันออกอัลกอริทึมของ Dijkstra จะสำรวจอย่างเท่าเทียมกันในทุกทิศทางและหยุดเมื่อพบทางด้านตะวันออก A * จะใช้เวลาไปทางตะวันออกมากกว่าตะวันตกและไปที่นั่นเร็วกว่า
amitp

3

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


3

ในระดับนามธรรม A * ทำงานได้ดังนี้:

  • คุณปฏิบัติต่อโลกในฐานะจำนวนโหนดเชื่อมต่อที่ไม่ต่อเนื่องเช่น กริดหรือกราฟ
  • ในการค้นหาเส้นทางทั่วโลกนั้นคุณจะต้องค้นหารายการ 'โหนด' ที่อยู่ติดกันภายในพื้นที่นั้นซึ่งนำไปสู่ตั้งแต่เริ่มต้นจนถึงเป้าหมาย
  • วิธีการไร้เดียงสาจะเป็นเช่นนี้: คำนวณการเรียงสับเปลี่ยนที่เป็นไปได้ของโหนดที่ขึ้นต้นด้วยโหนดเริ่มต้นและสิ้นสุดที่โหนดสุดท้ายและเลือกวิธีที่ถูกที่สุด เห็นได้ชัดว่าสิ่งนี้จะใช้เวลาตลอดไปในทุกที่ยกเว้นพื้นที่ที่เล็กที่สุด
  • ดังนั้นวิธีการทางเลือกพยายามที่จะใช้ความรู้บางอย่างเกี่ยวกับโลกที่จะเดาว่าพีชคณิตแบบใดที่ควรพิจารณาก่อน การประมาณนี้เรียกว่าการวิเคราะห์พฤติกรรม
  • A * ต้องการฮิวริสติกที่ยอมรับได้ ซึ่งหมายความว่าไม่เคยประเมินค่าสูงไป
    • ฮิวริสติกที่ดีสำหรับปัญหาการค้นพบคือระยะทางแบบยุคลิดเพราะเรารู้ว่าเส้นทางที่สั้นที่สุดระหว่าง 2 จุดเป็นเส้นตรง สิ่งนี้ไม่เคยประเมินระยะทางมากเกินไปในการจำลองสถานการณ์จริง
  • A * เริ่มต้นด้วยโหนดเริ่มต้นและลองเปลี่ยนลำดับต่อเนื่องของโหนดนั้นรวมถึงแต่ละเพื่อนบ้านและเพื่อนบ้านของเพื่อนบ้าน ฯลฯ โดยใช้ฮิวริสติกเพื่อตัดสินใจว่าการเปลี่ยนรูปแบบใดจะลองอีกครั้ง
  • ในแต่ละขั้นตอน A * จะมองไปที่เส้นทางที่มีแนวโน้มมากที่สุดและเลือกโหนดใกล้เคียงถัดไปซึ่งดูเหมือนว่าจะ 'ดีที่สุด' โดยขึ้นอยู่กับระยะทางที่เดินทางไปไกลและการประเมินโดยฮิวริสติก ปม
  • เนื่องจากฮิวริสติกไม่เคยประเมินค่าสูงเกินไปและระยะทางที่เดินทางไปไกลนั้นถูกต้องแม่นยำจึงมักเลือกขั้นตอนต่อไปในแง่ดีที่สุดเสมอ
    • หากขั้นตอนถัดไปถึงเป้าหมายคุณจะรู้ว่าพบเส้นทางที่สั้นที่สุดจากตำแหน่งสุดท้ายเพราะนี่เป็นการคาดเดาในแง่ดีที่สุดของสิ่งที่เหลืออยู่
    • หากไม่ถึงเป้าหมายก็จะเหลือจุดให้สำรวจในภายหลัง อัลกอริทึมตอนนี้เลือกความเป็นไปได้ที่มีแนวโน้มมากที่สุดต่อไปดังนั้นตรรกะข้างต้นยังคงใช้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.