Tìm đường với quán tính


7

Tôi hiện đang làm việc để tìm đường cho một trò chơi nơi các đơn vị đang di chuyển, nhưng chúng có quán tính. Hầu hết các thuật toán tìm đường điển hình (A *, Djikastra, v.v.) được thiết kế đơn giản để giảm thiểu độ dài của đường dẫn.

Tuy nhiên, theo như tôi biết, các kỹ thuật này không áp dụng cho các trường hợp đơn vị có quán tính. Nếu đơn vị có quán tính, thì có một sự khác biệt đáng kể về chi phí để đặt một lát theo một hướng cụ thể dựa trên hướng bạn muốn đi.

Ví dụ: chi phí rời khỏi một lát gạch tiến lên phía Bắc cao hơn đáng kể nếu bạn nhập gạch từ phía Đông so với khi bạn nhập từ miền Nam. (Trong ví dụ trước, bạn sẽ phải giảm tốc độ để dừng vận tốc Đông-Tây, trong khi ở ví dụ sau, bạn có thể đi thẳng qua.)

Thực tế là hệ thống có quán tính đồng nghĩa với việc để rẽ, bạn có thể phải giảm tốc độ trước khi rẽ. Suy nghĩ tốt nhất của tôi cho đến nay là bạn tính toán thời gian bổ sung cần thiết để làm chậm, và sau đó thêm nó vào chi phí heuristic của việc di chuyển. Tuy nhiên, điều này dường như ngụ ý rằng bạn không bao giờ có thể thêm một ô vào danh sách đã đóng, vì việc nhập từ một hướng khác về cơ bản có thể thay đổi chi phí di chuyển.

Ngoài ra, dù sao thì khái niệm sử dụng lưới là một sự trừu tượng, bởi vì cả vị trí và vận tốc đều là các khái niệm dấu phẩy động. Có một số thuật toán có thể xử lý tìm đường trên một mặt phẳng mở có quán tính tốt hơn A *, hoặc tôi có thể sửa đổi gì cho một thuật toán có sẵn để làm cho nó phù hợp với loại chuyển động này?


1
Bạn không thể cố gắng tìm cách đưa ra một giá trị cho chi phí phát sinh theo quán tính và thêm nó vào các thuật toán tìm đường của bạn? Từ những gì tôi nhớ lại, chúng dựa trên chi phí từ biểu đồ nút di chuyển ngang, vậy quán tính có thể đóng vai trò là trọng lượng?
Vaillancourt

Câu trả lời:


2

Hạn chế mới duy nhất mà quán tính đặt vào việc tìm đường là sự liên tục , có nghĩa là không có sự đột ngột về vận tốc. Bắt đầu bằng cách tạo đường dẫn A *, nhưng với một bước ngoặt lớn. Lý do A * tự nó không phù hợp là vì nó vi phạm tính liên tục, vì vậy hãy tạo một cái mới.

A * chọn con đường tốt nhất là con đường ngắn nhất, nhưng với quán tính, con đường ngắn nhất không còn là con đường nhanh nhất. Con đường nhanh nhất sẽ là con đường đưa ra con đường ngắn nhất mà không phá vỡ sự liên tục .

A * bình thường cho phép mỗi lần lặp "nhảy" đến một ô liền kề bắt đầu với chi phí thấp nhất. Thay vì chỉ cho phép các ô liền kề, chúng tôi sẽ cho phép mọi ô nằm trong phạm vi chuyển động của chúng tôi cho lượt tiếp theo. Điều này có nghĩa là các ô duy nhất chúng ta có thể chọn tiếp theo là các ô sẽ yêu cầu chúng ta thay đổi động lượng một lượng vật thể có thể.

TLDR: Chúng tôi thay đổi các lựa chọn của A * theo động lượng của chúng tôi và thêm vào động lượng của chúng tôi.


Điều đó có nghĩa là chúng ta không bao giờ có thể ngừng đi theo hướng mà chúng ta bắt đầu đi? Ví dụ: nếu bạn bắt đầu tăng tốc sang trái và bạn tiếp tục rằng đối với một số ô, bạn không thể dừng lại chỉ trong 1 ô. Bạn sẽ phải liên tục chậm lại trong quá trình của một số gạch.
Stack Tracer

@StackTracer Nếu quán tính được thực hiện thì có làm chậm phải liên tục trừ khi một số hình thức làm chậm khác được thêm vào.
newton1212

2

Các thuật toán tìm đường như A * có thể xử lý quán tính (hoặc bất kỳ chiều nào khác mà bạn có thể ném vào nó) đều ổn. Điều quan trọng là coi chúng như một thứ nguyên bổ sung và tạo một biểu đồ tìm kiếm chiều cao hơn để tìm kiếm.

Để đơn giản, hãy giả sử chúng ta chỉ có hai tốc độ: chậmnhanh và đường dẫn này:

A --(sharp turn)-- B ----------- C --(ravine)-- D

Để thực hiện bước ngoặt sắc nét AB, chúng ta cần phải chậm; để nhảy qua khe núi, chúng ta cần phải nhanh và chúng ta chỉ có thể thay đổi tốc độ trên các đường dẫn. Đây là biểu đồ tìm kiếm kết quả:

(fast): A       B ----> C -----> D
                  \   ^
                    X
                  /   v
(slow): A ----> B ----> C        D

Vì vậy, bạn có thể thấy, con đường duy nhất từ A đến D trong trường hợp này là do Ađến Bchậm, Bđể Cđẩy nhanh tiến độ để nhanh chóng, và Cđể Dnhanh.

Chi phí đường dẫn cũng dễ dàng: nó phụ thuộc vào tốc độ. Vì vậy, nếu chúng ta tùy ý quyết định rằng chi phí nhanh-nhanh là 1, nhanh-chậm hoặc chậm-nhanh là 2 và chậm-chậm là 3, chi phí A->Dlà 3 + 2 + 1 = 6.

Vấn đề như bạn có thể đoán, đó là A * hoạt động trên các biểu đồ chứ không phải trên các phạm vi liên tục. Đó là, bạn cần đưa ra các tốc độ riêng biệt như tôi đã làm với tốc độ chậm / nhanh và mỗi cấp tốc độ bổ sung sẽ nhân kích thước của biểu đồ tìm kiếm của bạn. Trò chơi của bạn càng đòi hỏi nhiều về thể chất, bạn càng cần nhiều cấp tốc độ hơn và việc tìm đường sẽ tốn kém hơn, và tệ nhất là nó sẽ quá đắt cho các trò chơi. Nếu có, thì bạn có một số tùy chọn khác:

  • Làm cho AI của bạn gian lận để nó có thể làm mờ một số đường dẫn, ví dụ như có thể rẽ qua ngay cả khi nó đi hơi quá nhanh. Điều này có nghĩa là bạn có thể thoát khỏi mức tốc độ thấp hơn trong biểu đồ tìm kiếm A * của mình
  • Tương tự như các trò chơi đua xe, tính toán trước các đường cong lý tưởng và AI của bạn chỉ cần điều hướng đến nút tốt nhất trên đường cong đó và tiếp tục dọc theo nó
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.