Làm cách nào để tối ưu hóa tìm đường trên lưới 2d động rất lớn?


7

Tôi có một tilemap 2d lớn, có kích thước từ hàng trăm đến hàng ngàn. Bản đồ được hình thành bởi các khối 8x8. Tôi hiện đang sử dụng A * nhưng nó không hiệu quả lắm vì tôi có thể có hàng trăm đối tượng tìm đường cùng lúc. Con đường không nhất thiết phải ngắn nhất tuyệt đối, nhưng sẽ có một mức độ ngắn nhất định.

Tôi đã nhìn vào đây và thấy rằng HPA * có thể hoạt động với tôi vì bản đồ của tôi bị vỡ thành nhiều phần nhỏ hơn. Tuy nhiên, vì bản đồ rất năng động (giả sử rằng ít nhất hai khối được sửa đổi mỗi giây), có vẻ như có thể có các lựa chọn thay thế tốt hơn.

Ngoài ra, D * / Lite (được đề cập trong liên kết) có thể hoạt động, nhưng làm thế nào nó có thể được tối ưu hóa cho lưới dựa trên khối?

Câu hỏi của tôi không đặc biệt về HPA * hoặc D *, mà là về việc tìm kiếm một thuật toán tối ưu cho một tilemap lớn và năng động, dựa trên khối.

EDIT: Các đoạn chứa nội dung được tạo theo thủ tục. Hầu hết thời gian điều này có nghĩa là khối này trống rỗng, ngoại trừ khoảng 10-20% số gạch của nó, tuy nhiên đôi khi con số này có thể lên tới 90% (đó là trong trường hợp tạo ra các "đốm màu"). Các khối sẽ chứa dữ liệu gần tùy ý và hai khối sẽ hiếm khi giống nhau.

Hơn nữa, mỗi tác nhân sẽ có một đường dẫn độc lập, tuy nhiên vì bản đồ là động, nó có thể chứa các hành lang nhân tạo và các lối đi dài có thể dẫn đến việc chúng được chia sẻ thường xuyên bởi nhiều tác nhân.

Hầu hết các mục tiêu sẽ được đặt tùy ý, tuy nhiên cũng sẽ có một số mục tiêu được xác định trước (vị trí). Đối với những vị trí được xác định trước, tôi đang xem xét sử dụng trường vectơ (giống như bản đồ nhiệt) có thể được sử dụng để tiếp cận nó. Tuy nhiên, làm điều này cho mọi mục tiêu sẽ rất kém hiệu quả, đặc biệt là vì tôi chỉ sử dụng trường được tạo một lần (hoặc trong trường hợp tốt hơn, có thể một vài lần).


1
Bạn có thể cho chúng tôi một số chi tiết về những khối này là như thế nào? Chúng được chọn từ một nhóm cố định, hoặc chúng có thể có nội dung tùy ý? Hình ảnh ví dụ luôn hữu ích cho các câu hỏi với một thành phần hình học. :) Ngoài ra, bạn cần loại đường dẫn nào? Có phải mọi tác nhân sử dụng một mục tiêu / con đường độc lập, hoặc có bất kỳ mức độ nào của các mục tiêu chung hoặc chung?
DMGregory

@DMGregory Tôi đã giải thích chi tiết cụ thể. :)
Dave

Tôi sẽ đề nghị xem xét Jump Point Search , một tối ưu hóa tuyệt vời trên A * vì nó làm giảm số lượng nút cần tìm kiếm bằng cách loại bỏ các hướng mở rộng không thể tối ưu.
Draco18 không còn tin tưởng SE

@ Draco18s Thật thú vị, điều đó có thể rất hữu ích cho các hành lang! Cảm ơn vì tiền hỗ trợ.
Dave

1
@ BlueRaja-DannyPflughoeft Unique
Dave

Câu trả lời:


2

Tôi nghĩ rằng hàng trăm đối tượng thực hiện tìm đường tạo thành một "đám đông". Đối với điều này, bạn nên xem xét đám đông liên tục của Đại học Washington.

Những gì bạn làm, là giải quyết việc tìm đường từ bất cứ nơi nào trên bản đồ, đến một mục tiêu. Sau đó, mọi đại lý chia sẻ mục tiêu đó có thể sử dụng nó.

Điều này hoạt động tốt nếu bạn có nhiều đại lý, nhưng chỉ có một vài mục tiêu khác nhau.

Tôi đã sử dụng điều này trong sim xây dựng kim tự tháp của mình, có thể thực hiện hàng ngàn tác nhân thực hiện tìm đường ở tần số 60Hz.

Nó đi xuống để giải quyết cho toàn bộ bản đồ: khoảng cách từ đây đến mục tiêu là bao nhiêu. Từ bản đồ đó, tính toán một gradient và theo dõi gradient đó.

Nó đi kèm với một số tính năng tiện lợi, như "hình thành làn đường tự động" nếu hai luồng (với các mục tiêu khác nhau) va chạm với nhau. Các tác nhân sau đó sẽ hình thành các làn đường, vì việc di chuyển ngược lại dòng chảy chiếm ưu thế sẽ tốn kém hơn so với việc đi theo nó.

Hình ảnh bên dưới hiển thị "trường tiềm năng" này (khoảng cách đến một mục tiêu cụ thể) được hình dung dưới dạng màu sắc, và sau đó một trường vectơ gradient được đặt chồng lên nhau.

nhập mô tả hình ảnh ở đây


0

Bạn có thể không muốn chạy một đơn vị PER thuật toán tìm đường dẫn đầy đủ: đây có thể là nơi bạn đang tìm thấy sự không hiệu quả. Thay vào đó, bạn sẽ tạo một bản đồ đường dẫn đến mục tiêu ngắn nhất cho mỗi vị trí mục tiêu. Vì vậy, nếu nhiều đơn vị hướng đến một mục tiêu, họ sẽ chỉ cần tra cứu trong bản đồ này, ô nào là ô gần nhất tiếp theo để di chuyển đến.

Bản đồ như vậy sẽ là một lưới riêng được tính toán dựa trên lưới chính mà bạn đang làm việc. Nhưng không chỉ là những bức tường, bất kỳ gạch "mở" nào cũng sẽ chứa các số được tính toán trước là khoảng cách ngắn nhất đến mục tiêu từ vị trí đó.

Một ví dụ bản đồ được tính toán sẽ trông như thế nào (X biểu thị một bức tường, 0 biểu thị mục tiêu)

6 5 4 3 2 3
7 X 3 2 1 2
8 X 2 1 0 1
X X X X X 2

Bất kỳ đơn vị nào hướng đến mục tiêu (0) sẽ chỉ cần theo các số trong lưới này trở xuống. Bất kỳ thay đổi nào đối với lưới sẽ buộc bạn phải tính toán lại bản đồ này (và cách bạn thực hiện hiệu quả này phụ thuộc vào thuật toán cụ thể của bạn). Một cách tiếp cận đơn giản để tạo ra một bản đồ như vậy sẽ là sử dụng aa Breadth First traverse từ vị trí mục tiêu.

Ý tưởng chính là bạn có thể có hàng trăm đơn vị sử dụng cùng một bản đồ đường dẫn để tìm đường đến một mục tiêu mà không cần tính toán một đường dẫn riêng cho mỗi đơn vị.


Điều này sẽ hoạt động nếu chỉ có một vài điểm cuối. Có vẻ như đó không phải là trường hợp, mặc dù câu hỏi của anh ấy không hoàn toàn rõ ràng.
BlueRaja - Daniel Pflughoeft

Tôi có nhiều điểm cuối, nhưng những điểm cuối này thay đổi thường xuyên, vì vậy việc tạo bản đồ nhiệt có thể không phải là lựa chọn tốt nhất.
Dave

Bạn vẫn có thể muốn có một bản đồ nhiệt cho mỗi điểm cuối, thay vì chạy tìm đường trên mỗi đơn vị (mỗi khi mục tiêu thay đổi) Nếu bạn có 1000 đơn vị và chỉ 4/5 điểm cuối thay đổi, bạn vẫn muốn tạo điều này cách tiếp cận bản đồ nhiệt. Nếu bạn chạy tìm đường trên mỗi đơn vị trên mỗi thay đổi, bạn đang thực hiện 1000 * 4/5 lần chạy tìm đường, thay vì 4/5 cập nhật bản đồ nhiệt. Câu hỏi của bạn sau đó sẽ trở thành cách bạn sẽ sửa đổi một bản đồ nhiệt như thế này một cách nhanh chóng? Đây là cách nó được thực hiện với bất kỳ trò chơi nào mà bạn có hàng trăm đơn vị (sử dụng gạch hoặc điểm tham chiếu)
Danny Yaroslavski

@DannyYaroslavski Có Tôi đồng ý, nhưng tôi đã nói rằng tôi sẽ làm điều này cho các điểm được xác định trước / ít thay đổi, trong phần chính của câu hỏi.
Dave

Tôi chỉ không hiểu tại sao bạn chỉ sử dụng bản đồ vector một lần - như tôi đã nói, bạn sẽ có điểm cuối PER map map. Nếu nhiều đơn vị chia sẻ cùng một điểm cuối, đây là cách lý tưởng để thực hiện điều này. Mặt khác, nếu bạn có nhiều đơn vị chia sẻ cùng một bản đồ động và không chia sẻ điểm cuối, thì có, bạn sẽ không thể tối ưu hóa bất cứ điều gì.
Daniel Yaroslavski

0

Vì mỗi đơn vị có một điểm cuối duy nhất, nên đặt cược tốt nhất của bạn có thể sẽ là HPA *.

Khi một đoạn thay đổi, bạn sẽ cần cập nhật nút của nó ở mọi lớp trong cấu trúc phân cấp, sau đó chạy lại tìm đường trên mỗi đơn vị (nếu một bức tường được thêm vào, bạn có thể bỏ qua các đơn vị có đường dẫn tốt nhất không đi qua nút đó) . Do biểu đồ thay đổi thường xuyên, tôi khuyên bạn chỉ nên chạy tìm đường dẫn ở lớp cao nhất, sau đó chỉ khoan sâu khi cần thiết. Lớp trên cùng có vài nút, vì vậy điều này sẽ siêu nhanh.

Tại thời điểm đó, hồ sơ. Nếu bạn xác định rằng bạn cần làm cho việc tìm đường nhanh hơn, bạn có thể xem xét những thứ như JPS (đối với các lớp dưới cùng) , DynamicSWSF-FP (đối với các lớp cao hơn) , v.v. Bạn cũng có thể lưu trữ các truy vấn phổ biến nhất ở mỗi lớp . Một tối ưu hóa tốt khác là chỉ tính toán lại đường dẫn cho một số đơn vị mỗi khung.

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.