ฉันจำเป็นต้องแก้ปัญหาที่คล้ายกัน: ค้นหาเส้นทางบนกริดเหมือนเขาวงกตขนาดใหญ่ที่มี "ต้นทุน" และอุปสรรคที่เปลี่ยนแปลงตลอดเวลา
สิ่งที่เป็นในเกมป้องกันหอจำนวนหน่วยงานที่ต้องมีการแก้ไขเส้นทางสำหรับพวกเขามักจะมีขนาดใหญ่กว่าจำนวนโหนดในกราฟ A * ไม่ใช่อัลกอริทึมที่เหมาะสมที่สุดในการจัดการกับสิ่งนี้เพราะคุณจะต้องแก้ปัญหาใหม่ทุกครั้งที่มีการเปลี่ยนแปลง เป็นเรื่องที่เหมาะสมหากคุณต้องการค้นหาเส้นทางเดียว แต่ในกรณีของฉันฉันต้องสามารถจัดการเอนทิตีที่สามารถปรากฏในสถานที่ต่างกันและแต่ละเส้นทางมีเส้นทางของตัวเอง
ฟลอยด์-Warshallอัลกอริทึมที่อยู่ไกลที่เหมาะสมมากขึ้น แต่สำหรับกรณีของฉันฉันเขียนขั้นตอนวิธีการที่กำหนดเองว่าเมื่อใดก็ตามโหนดเปลี่ยนแปลงมันอีกครั้งคำนวณค่าใช้จ่ายไปยังโหนดจากเพื่อนบ้านทุกคนว่าแล้วถ้าเพื่อนบ้านมีการเปลี่ยนแปลงก็จะเรียก พวกเขาซ้ำ ๆ
ดังนั้นในการเริ่มต้นเกมฉันเพิ่งยิงอัลกอริธึมนี้ในโหนด "เป้าหมาย" ทั้งหมดของฉัน จากนั้นเมื่อใดก็ตามที่มีการเปลี่ยนแปลงโหนดเดียว (ตัวอย่างเช่นกลายเป็นไม่สามารถผ่านได้) ฉันเพิ่งจะเปิดมันบนโหนดนั้นและการเปลี่ยนแปลงจะแพร่กระจายไปยังโหนดทั้งหมดที่จะได้รับผลกระทบแล้วหยุด ดังนั้นจึงไม่จำเป็นต้องคำนวณซ้ำทั่วโลกและอัลกอริทึมนั้นไม่ขึ้นอยู่กับจำนวนของเอนทิตีที่จะต้องใช้การค้นหาเส้นทาง
อัลกอริทึมของฉันเป็นพื้นคล้าย (รหัสหลอก):
update_node method in Node class:
$old <- $my_score
find $neighbor node among all neighbors such that
$neighbor.score + distance_to($neighbor) is minimal
$my_score <- $neighbor.score + distance_to($neighbor)
$next_node <- $neighbor
if ($my_score != $old)
for each $neighbor
$neighbor.update_node()
ด้วยคะแนนเริ่มต้นขึ้นอยู่กับว่าโหนดนั้นเป็นเป้าหมายหรือสิ่งกีดขวางบางประเภท