บริบท
Old Lucas Arts (ScummVM era) ชี้และคลิกเกมผจญภัยกราฟิกที่ใช้การคำนวณเส้นทางก่อน นี่คือคร่าวๆของเทคนิค
ขั้นตอนที่ 1
พื้นในแต่ละห้องถูกแบ่งออกเป็นสิ่งที่พวกเขาเรียกว่า "กล่องเดิน" ซึ่งค่อนข้างคล้ายกับโหนดในตาข่ายนำทาง แต่ จำกัด รูปร่างรูปสี่เหลี่ยมคางหมู เช่น:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
ขั้นตอนที่ 2
อัลกอริทึมออฟไลน์ (เช่น Dijkstra หรือ A *) จะคำนวณเส้นทางที่สั้นที่สุดระหว่างแต่ละโหนดและทุกคู่ของโหนดและเก็บขั้นตอนแรกของเส้นทางในเมทริกซ์ 2D โดยสร้างดัชนีในแต่ละมิติโดยใช้โหนดเริ่มต้นและสิ้นสุด เช่นใช้กล่องเดินด้านบน:
___ ___ ___ ___
| A | B | C | D | <- Start Node
___|___|___|___|___|
| A | A | A | B | C | ---
|___|___|___|___|___| |
| B | B | B | B | C | |
|___|___|___|___|___| |-- Next node in shortest path
| C | B | C | C | C | | from Start to End
|___|___|___|___|___| |
| D | B | C | D | D | ---
|___|___|___|___|___|
^
|
End Node
ในขณะที่คุณอาจเดาว่าความต้องการหน่วยความจำเพิ่มขึ้นอย่างรวดเร็วเมื่อจำนวนโหนดเพิ่มขึ้น (N ^ 2) เนื่องจากสั้นมักจะมีขนาดใหญ่พอที่จะเก็บแต่ละรายการในเมทริกซ์ด้วยแผนที่ที่ซับซ้อนของ 300 โหนดที่จะส่งผลในการจัดเก็บพิเศษ:
300^2 * sizeof(short) = 176 kilobytes
ขั้นตอนที่ 3
ในทางกลับกันการคำนวณเส้นทางที่สั้นที่สุดระหว่างสองโหนดนั้นเร็วมากและไม่สำคัญเพียงแค่มีการค้นหาต่อเนื่องเป็นชุด สิ่งที่ต้องการ:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
ใช้อัลกอริทึมง่าย ๆ นี้เพื่อค้นหาเส้นทางที่สั้นที่สุดจาก C ถึง A:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
คำถาม
ฉันสงสัยว่าด้วยฮาร์ดแวร์ที่มีประสิทธิภาพในปัจจุบันประกอบกับความต้องการด้านหน่วยความจำของการทำสิ่งนี้ในทุกระดับผลประโยชน์ใด ๆ ที่เทคนิคนี้เคยได้รับนั้นมีน้ำหนักเกินเพียงแค่แสดง A * ที่รันไทม์
ฉันเคยได้ยินว่าทุกวันนี้การค้นหาหน่วยความจำอาจช้ากว่าการคำนวณทั่วไปซึ่งเป็นสาเหตุที่การสร้างตารางค้นหาแบบไซน์และโคไซน์จึงไม่เป็นที่นิยมอีกต่อไป
แต่ฉันต้องยอมรับว่าฉันยังไม่มีความรู้ในเรื่องของประสิทธิภาพฮาร์ดแวร์ระดับต่ำเหล่านี้ดังนั้นฉันจึงใช้โอกาสนี้ถามความคิดเห็นของผู้ที่คุ้นเคยกับเรื่องนี้มากขึ้น
ในเครื่องยนต์ของฉันฉันยังต้องการความสามารถในการเพิ่มและลบโหนดในกราฟแบบไดนามิก ( ดูที่นี่ ) ดังนั้นเส้นทางที่กำหนดไว้ล่วงหน้าทำให้สิ่งที่ซับซ้อนมากขึ้นเท่านั้นดังนั้นฉันจึงทิ้งมันไว้ ) ถึงกระนั้นฉันก็ยังสงสัยว่า ...
บรรทัดล่างเทคนิคนี้ยังคงมีความเกี่ยวข้องในทุกสถานการณ์หรือไม่?