Làm thế nào để đạt được một phần tìm đường?


6

Giả sử tôi đã có thuật toán A *.

Làm cách nào tôi có thể xử lý các trường hợp khi không thể đạt được mục tiêu và vẫn cố gắng đạt được điều đó?

Ví dụ về ví dụ sau:

bản đồ gạch Lưu ý các kỹ năng GIMP tuyệt vời!

Đơn vị màu vàng cần tiếp cận điểm xanh, nhưng nó ở trên đảo và thực sự không thể tiếp cận được.

Tuy nhiên, trên một RTS điển hình, đơn vị sẽ cố gắng đi càng gần càng tốt.

Vấn đề của tôi là tôi không biết làm thế nào để nói với A * rằng viên gạch gần nhất với mục tiêu là quảng trường gần biển.

Làm thế nào tôi có thể có đường dẫn một phần này? A * vẫn là một lựa chọn tốt?


Tôi nghĩ rằng RTS chỉ cần tìm điểm gần nhất bên ngoài địa hình và tính toán đường dẫn đến đó thay vì thực hiện tìm đường đi một phần.
API-Beast

@ API-Beast Vì vậy, 1. họ vẫn thực hiện tìm đường để biết mục tiêu không thể đạt được và 2. làm thế nào để bạn tìm thấy điểm gần nhất?
Pierre Arlaud

Không, không phải mục tiêu không thể đạt được, đó là điểm bạn nhấp vào là "vững chắc", ví dụ: nó chặn chuyển động của đơn vị. RTS có xu hướng không có bất kỳ mục tiêu không thể tiếp cận.
API-Beast

Bạn không cần phải sửa đổi bất cứ điều gì. Chỉ cần nhớ điểm gần nhất bạn từng đến. Ví dụ A * sẽ cố gắng tìm đường dẫn và sẽ thất bại cho bạn, nhưng điều đó không có nghĩa là trước tiên nó sẽ không thiết lập đường dẫn bạn đã vẽ, bạn chỉ phải nhớ đường dẫn đến điểm gần nhất mà A * từng đến.
wonderra

1
Không bao giờ kiểm tra nó thực sự, hãy chắc chắn để chia sẻ nếu nó hoạt động trong thực tế. (đây chỉ là giả định hợp lý về cách A * hoạt động).
wonderra

Câu trả lời:


3

Về lý thuyết, bạn không cần phải sửa đổi bất cứ điều gì. Chỉ cần nhớ điểm gần nhất bạn từng đến. Ví dụ A * sẽ cố gắng tìm đường dẫn và sẽ thất bại cho bạn, nhưng điều đó không có nghĩa là trước tiên nó sẽ không thiết lập đường dẫn bạn đã vẽ, bạn chỉ phải nhớ đường dẫn đến điểm gần nhất mà A * từng đến.


A * hoạt động kém - thực tế là trường hợp xấu nhất của nó - nếu đích không thể truy cập được, bởi vì nó sẽ truy cập vào tất cả các nút tiếp giáp. Tôi nghĩ rằng một số sửa đổi ít nhất sẽ giúp đỡ?
congusbongus

3
Vấn đề là trừ khi bạn cạn kiệt A *, bạn không biết rằng điểm cuối của bạn không thể truy cập được. Nếu bạn thỏa hiệp với việc giới hạn cách thức hoạt động của A *, bạn sẽ mất nhiều thời gian hơn để sửa chữa các trường hợp khi "tại sao con đường đó lại thất bại?" xảy ra.
Patrick Hughes

@PatrickHughes congusbongus có thể có một điểm. Thông thường, các công cụ RTS có thuật toán tìm đường không hoàn hảo, không tìm thấy đường đi ngắn nhất (và hầu như không theo một heuristic) nếu đường dẫn ngắn nhất quá phức tạp.
Pierre Arlaud

Chỉ cần làm cho mã hoạt động, sau đó nếu nó quá chậm, HỒ SƠ nó. Đừng để mọi người khiến bạn bị mắc kẹt trong bùn bởi vì điều gì đó MIGHT quá chậm. Chỉ cần làm cho nó hoạt động và chuyển từ đó sang điều quan trọng nhất tiếp theo - điều có lẽ không cải thiện hiệu suất của thuật toán này.
xaxxon

0

Sử dụng A * một mình (và đi đến điểm tìm kiếm gần nhất) là ổn đối với các bản đồ nhỏ, nhưng nó sẽ hoạt động kém nếu bản đồ lớn hơn. Nếu mục tiêu không thể truy cập được, A * sẽ tìm kiếm toàn bộ không gian có thể tiếp cận trước khi nhận ra rằng mục tiêu không thể truy cập được. Điều này có thể liên quan đến rất nhiều điểm tìm kiếm và có thể rất chậm. Trong tình huống này, A * không có lợi thế hơn các thuật toán như Dijkstra.

Để có giải pháp hiệu quả hơn, bạn cần ba phần:

  • Tìm tất cả các nhóm khu vực không thể truy cập lẫn nhau
  • Tìm vị trí có thể tiếp cận gần nhất
  • Tìm đường đến vị trí này

Bước đầu tiên có thể được tính toán trước để bạn có thể tìm thấy điểm đến của mình với giá rẻ. Lũ lụt (hay còn gọi là BFS) sẽ đủ.

Thứ hai thường sẽ là Dijkstra hoặc một thuật toán tìm kiếm tương tự. Bạn thậm chí có thể tính toán trước nó (đối với từng vị trí không thể truy cập, tìm kiếm vị trí có thể tiếp cận gần nhất và lưu nó trước khi trò chơi bắt đầu).

Sau đó, bạn có thể sử dụng A * cho bước thứ ba.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.