Saya perlu memecahkan masalah yang sama: mencari jalan di kotak besar seperti labirin dengan "biaya" dan penghalang yang terus berubah.
Masalahnya adalah, dalam permainan menara pertahanan jumlah entitas yang perlu diselesaikan jalurnya untuk mereka biasanya jauh lebih besar daripada jumlah node dalam grafik. A * bukan algoritma yang paling tepat untuk menangani ini, karena Anda harus menyelesaikannya lagi setiap kali ada perubahan. Yah itu tepat jika Anda hanya perlu menemukan satu jalur, tetapi dalam kasus saya, saya harus dapat menangani entitas yang dapat muncul di lokasi yang berbeda dan masing-masing memiliki jalurnya sendiri.
The Floyd-Warshall algoritma jauh lebih tepat, meskipun untuk kasus saya saya menulis algoritma kustom yang setiap kali perubahan node, itu kembali menghitung biaya untuk node yang dari semua tetangganya, dan kemudian jika tetangga telah diubah itu dipanggil secara rekursif pada mereka.
Jadi di awal permainan, saya hanya menjalankan algoritma ini di semua "tujuan" node saya. Kemudian, setiap kali satu node berubah (misalnya, menjadi tidak bisa dilewati), saya hanya menjalankannya pada node itu dan perubahan tersebut disebarkan ke semua node yang akan terpengaruh, dan kemudian berhenti. Jadi tidak perlu perhitungan ulang global, dan algoritme sepenuhnya independen dari jumlah entitas yang akan memerlukan pencarian jalan.
Algoritma saya pada dasarnya adalah sesuatu seperti (pseudo-code):
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()
Dengan skor awal tergantung pada apakah node adalah target atau semacam penghalang.