Tôi cần phải giải quyết một vấn đề tương tự: tìm đường trên một lưới giống như mê cung lớn với "chi phí" và rào cản thay đổi liên tục.
Vấn đề là, trong trò chơi phòng thủ tháp, số lượng thực thể cần giải quyết đường dẫn cho chúng thường lớn hơn nhiều so với số nút trong biểu đồ. A * không phải là thuật toán thích hợp nhất để xử lý việc này, bởi vì bạn sẽ cần giải quyết nó một lần nữa mỗi khi có gì đó thay đổi. Vâng, nó phù hợp nếu bạn chỉ cần tìm một đường dẫn, nhưng trong trường hợp của tôi, tôi cần có khả năng xử lý các thực thể có thể xuất hiện ở các vị trí khác nhau và mỗi đường dẫn có một đường dẫn riêng.
Các Floyd-Warshall thuật toán là xa thích hợp hơn, mặc dù đối với trường hợp của tôi, tôi đã viết một thuật toán tùy chỉnh mà bất cứ khi nào một thay đổi nút, nó lại tính toán chi phí để mà nút từ tất cả các nước láng giềng, và sau đó nếu những người hàng xóm đã được thay đổi nó được gọi đệ quy về chúng.
Vì vậy, vào đầu trò chơi, tôi chỉ kích hoạt thuật toán này trên tất cả các nút "mục tiêu" của mình. Sau đó, bất cứ khi nào một nút duy nhất thay đổi (ví dụ, trở nên không thể vượt qua), tôi chỉ cần kích hoạt nó trên nút đó và thay đổi được truyền đến tất cả các nút sẽ bị ảnh hưởng và sau đó dừng lại. Vì vậy, không cần tính toán lại toàn cầu và thuật toán hoàn toàn độc lập với số lượng thực thể sẽ yêu cầu tìm đường.
Thuật toán của tôi về cơ bản là một cái gì đó giống như (mã giả):
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()
Với số điểm ban đầu tùy thuộc vào việc nút là mục tiêu hay một loại rào cản nào đó.