मुझे एक समान समस्या को हल करने की आवश्यकता थी: लगातार "लागत" और बाधाओं को बदलने के साथ एक बड़े भूलभुलैया जैसे ग्रिड पर पाथफाइंग करना।
बात यह है कि, टॉवर डिफेंस गेम में, उन संस्थाओं की संख्या, जिनके लिए पथ को हल करने की आवश्यकता होती है, आमतौर पर ग्राफ में नोड्स की संख्या से बहुत बड़ा होता है। इसे संभालने के लिए 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()
प्रारंभिक अंक के आधार पर कि नोड एक लक्ष्य है या किसी प्रकार का अवरोध है।