Hòa giải Flocking và A * (Lý thuyết)


7

Đối với trò chơi RTS của tôi, tôi đã có A * pathfinding hoạt động, và điều đó tốt. Phát hiện va chạm cơ bản tồn tại quá. Khi một đơn vị đang di chuyển, nó sẽ kiểm tra xem vị trí mà nó sẽ chiếm giữ di chuyển tiếp theo là một nút bị chiếm bởi một đơn vị khác, và nếu vậy nó sẽ tìm một cách khác để đến đích. Tôi cũng nghĩ rằng tôi hiểu những điều cơ bản của việc đổ xô; rằng trong quá trình di chuyển, chỉ cần đảm bảo rằng các con thuyền đang kiểm tra khoảng cách với những người bạn trong đàn của chúng, và sau đó sửa lỗi này.

Nhưng tôi hơi bối rối. Ngay bây giờ, hệ thống tìm đường của tôi hoạt động trên một lưới các nút vuông, nhưng nếu tôi tạo ra một hệ thống đổ xô hoạt động bằng cách tính đến dấu chân tròn của boid thì điều này sẽ làm phức tạp vấn đề, bởi vì trong một đàn được đóng gói chặt chẽ, hoặc thực sự là một đàn một số thành viên có kích thước dấu chân khác nhau, sau đó vị trí của họ sẽ không khớp với lưới nút vuông được thiết kế cho A *.

Về lý thuyết, làm thế nào để một loạt các con thuyền tập hợp lại với nhau trong một quả bóng, hoặc chảy qua các nút cổ chai địa hình (một số nút được gắn cờ không thể truy cập, v.v.) một cách có trật tự? Là loại hành vi này xuất hiện từ một hệ thống đổ xô chức năng?

Nhưng tôi chắc chắn rằng tôi đang hiểu nhầm hệ thống này và muốn ai đó hiểu cách thực hiện nó để giải thích lý thuyết để tôi có thể tự thực hiện điều này. Tôi cho rằng việc đổ xô không thực sự phù hợp với A *: điều đó chỉ được sử dụng để tìm đường và trong quá trình di chuyển, cách duy nhất là nó quản lý phát hiện va chạm và tránh va chạm cho các đơn vị? Nhưng những gì về những trở ngại có thể tạo ra nút cổ chai? Làm thế nào là A * và đổ xô hòa giải? Tránh boids và chướng ngại vật địa hình là các hệ thống khác nhau.

Câu trả lời:


9

Mâu thuẫn

Thật vậy, hai hệ thống khá độc quyền với nhau. Theo như bạn đã đề cập:

A *: chỉ được sử dụng để tìm đường và trong quá trình di chuyển đổ xô là cách duy nhất> nó quản lý phát hiện va chạm và tránh cho các đơn vị

Dưới đây là những điểm khác biệt, ưu và nhược điểm chính cần ghi nhớ:

+---------------------+-------------------------------------+
| A* Algorithm        | Flocking                            |
+---------------------+-------------------------------------+
| Abstract overlay    | Real-world representation           |
+---------------------+-------------------------------------+
| Graph-Based (Nodes) | Free-Form (float coordinates)       |
+---------------------+-------------------------------------+
| Optimal trajectory  | Physical Trajectory (speed, inertia)|
+---------------------+-------------------------------------+
| Individual          | Group dynamics                      |
+---------------------+-------------------------------------+
| Global knowledge    | Local knowledge                     |
+---------------------+-------------------------------------+

Nếu bạn muốn kết hợp cả hai, thì tôi phải giả sử bạn có cách để làm cho cả hai hoạt động (nhưng bạn muốn lời khuyên về cách làm cho chúng hoạt động cùng nhau ). Điều này có nghĩa là bạn đã có:

  • Một thế giới vật lý , nơi các con thuyền của bạn có thể di chuyển xung quanh, tương tác với nhau và va chạm với các ranh giới thế giới.
    Đây có thể là một tập hợp các phân đoạn 2D, đa giác, vòng tròn tạo thành các bức tường và chướng ngại vật, cũng như các đơn vị và tòa nhà thân thiện và thù địch, sườn dốc, loại địa hình, vật liệu, quyền sở hữu chính trị, v.v.
    Bây giờ các con thuyền của bạn có thể di chuyển trong đại diện này, có quán tính, phản ứng với các lực (lực thực sự như va chạm, hoặc lực hành vi như tìm kiếm, chạy trốn). Điều này có thể không chỉ là các tế bào rời rạc, bởi vì các lỗ thông thường không bị hạn chế đối với các tế bào, nhưng nó có thể.
    Cuối cùng, đây là thế giới mô phỏng / cơ học trò chơi của chúng tôi, vì vậy hãy làm cho nó những gì bạn muốn.
  • Một đại diện đồ thị của thế giới bạn , để A-Star hoạt động.
    Đây là một biểu diễn trừu tượng, cao cấp (biểu đồ với các nút và các cạnh có trọng số). Điều này không cần thông tin về loại địa hình hoặc bất kỳ thứ gì trong số đó: chỉ các nút và các cạnh có trọng số. Một AI hoàn toàn có thể dễ dàng xử lý biểu diễn trừu tượng này để điều hướng nó tới mục tiêu, thay vì thế giới vật lý trong tất cả sự phức tạp của nó.
  • Để cho hai đại diện tương tác, bạn cũng cần:
    • Một cách để ánh xạ bất kỳ vị trí thế giới nào đến một nút trong biểu đồ
    • Ngược lại, một cách, từ bất kỳ nút nào trong biểu đồ , để xác định vị trí phù hợp trong thế giới vật lý .
      (Lưu ý, đây không phải là ánh xạ một-một, vì vậy bạn có thể chọn ngẫu nhiên vị trí vật lý của điểm này trong ô để có các đường dẫn hữu cơ)

(Trong phần còn lại của câu trả lời này, tôi sẽ in nghiêng Flocking algo và tô điểm cho thuật toán A-Star như tôi đã làm ở trên).

Vậy làm thế nào chúng ta có thể để hai hệ thống này hợp tác để có được thứ tốt nhất của cả hai?


Hướng tới hợp tác

Phân chia trách nhiệm giữa các thuật toán của bạn.

  1. Hãy để A-Star tìm một con đường toàn cầu hợp lý (hệ thống hướng dẫn suy nghĩ) trong vương quốc trừu tượng. Nó sẽ tối ưu trong không gian đồ thị và đủ tốt trong không gian trong thế giới thực.
  2. Hãy để Flocking lái boids của bạn cục bộ dọc theo con đường.

Các A-Star sẽ tìm thấy một cách để khách quan của nó , bằng cách ăn thông minh mục tiêu 'tìm kiếm' tạm thời cho algo đổ xô .


Thực hiện chi tiết:

  • Trước đó, chuẩn bị một số boids mỗi trong số đó, mọi lúc:
    • Một mục tiêu vĩ mô, và một con đường toàn cầu đến mục tiêu đó
    • Một mục tiêu theo dõi cục bộ cho hành vi chỉ đạo , rằng chúng tôi sẽ di chuyển dọc theo con đường toàn cầu mong muốn
  • Ở mỗi bước thời gian, hãy làm như sau cho mỗi lần đun:
    • Di chuyển boid theo hành vi của nó (tìm kiếm điểm, cộng với va chạm, cộng với đổ xô, v.v.) trong thế giới vật lý
    • Ánh xạ vị trí hiện tại của boid đến đại diện của nó nút biểu đồ
    • Nếu boid đã rời khỏi nút trước đó, nó cần tính toán lại đường dẫn của nó! Bây giờ chúng tôi cung cấp cho nó một mục tiêu mới:
      • Thực hiện tìm kiếm A-Star, từ nút boid, đến nút mục tiêu macro bị rời rạc. Điều này trả về một con đường toàn cầu .
      • Cô lập một nút hơn nữa trong đường dẫn toàn cầu (Nút tiếp theo hoặc nút sau đó để có hành vi tìm kiếm trôi chảy hơn?)
      • Hủy bỏ giải thích nó (làm cho nó trở lại một vị trí thực tế ).
      • Chỉ định cho kẻ háo sắc hành vi Tìm kiếm đối với mục tiêu địa phương này

Lưu ý 1: Tách các mối quan tâm

Bạn đã thay đổi A-Star bằng cách cho mỗi đơn vị xem xét sự chiếm chỗ của các đơn vị khác. Điều này đã làm tổn hại nhiều lợi ích của A-Star:

  • Đường dẫn không còn tối ưu
  • Đường dẫn không còn được đảm bảo để đạt được mục tiêu do tương tác
  • Các đơn vị sẽ qua lại bất cứ khi nào một đường dẫn bị chặn / giải phóng

Điều này là do bạn đã trộn lẫn các mối quan tâm bằng cách để cả hai tìm thấy một đường dẫn tối ưu VÀ quản lý tương tác đơn vị. Điều tuyệt vời khi trộn hai thuật toán là điều này sẽ cho phép bạn giải quyết vấn đề này bằng cách A-Star chỉ cần tìm một đường dẫn (bất kể các đơn vị khác, đó là điều duy nhất phù hợp) và để Flocking giải quyết xung đột (một nhiệm vụ mà tại đó nó là tốt cho).

Lưu ý 2: Kẹt xe

Nếu bạn lo lắng về các nhóm đơn vị chặn nhau (như thế này (AAAA)--> <--(BB)) trong chế độ đổ xô, có nhiều cách để giảm thiểu điều này.

  • Hãy thử và nhận ra các nhóm đơn vị dựa trên ý định của chúng (nút mục tiêu) và phân phối lực đẩy trên mỗi đơn vị của các nhóm nhỏ hơn để "thực hiện" (nhóm lớn hơn = ưu tiên lớn hơn)
  • Nếu bạn đưa ra thứ tự hàng loạt cho các nhóm lớn, thì hãy tính đến điều đó trong quá trình phân rã của bạn: làm cho biểu đồ thô hơn khi xử lý với các nhóm lớn. A-Star thô sẽ chỉ tìm thấy đường đi qua các "lỗ" đủ lớn

Lưu ý 3 - Địa hình không thể di chuyển

Về đơn vị đi vào địa hình không thể vượt qua: Thuật toán không cho phép điều này.
Ở cấp độ cao, A-Star không bao giờ yêu cầu một đơn vị đi qua các cạnh không thể nhìn thấy, bởi vì các cạnh đó không nên tồn tại trong biểu đồ ở vị trí đầu tiên.
Ở cấp độ thấp hơn, hành vi chỉ đạo nên bao gồm các phản ứng va chạm để giữ cho bo bo ra khỏi tường.

Ví dụ làm việc

Tất cả các khoảng trắng trong thế giới vật chất là điều hướng, đồ thị trên thế giới là một tương ứng navmesh . Lưu ý rằng tôi cố tình không theo hình học trong biểu đồ, vì nó là một sự trừu tượng, vì vậy nó không quan trọng miễn là các cạnh có trọng lượng chính xác (không được hiển thị).
Các boid là trong Aa, mục tiêu là trong Ee, có một cánh cửa trong Dd.

Physical world             Graph world
+--------+------+          a---b          
|A      B|F    G|          |\ /|
|        |      |          | X |
|        |      |          |/ \| 
|        |      |          c---(d)---f
|        |      |               |\ / |
|        +      |               | X  |
|C       D     E|               |/ \ |
+---------------+               e----g

Vì vậy, boid là trong a, con đường A-Star của nó là a->b->d->e. Vì vậy, A-Star quyết định di chuyển cấp cao tiếp theo phải là d(cách hai đỉnh, để tạo ra quỹ đạo trơn tru). Kể từ khi dquyết tâm D, boid chấp nhận một hành vi tìm kiếm hướng tới D. Nhưng boid cũng rất sợ một kẻ thù trong B, vì vậy đây là những gì xảy ra (các dấu chấm cho thấy quỹ đạo):

Physical world             Graph world
+--------+------+          a---b          
|A      B|F    G|          |\ /|
|.       |      |          | X |
|.       |      |          |/ \| 
|.       |      |          c---(d)---f
| .      |      |               |\ / |
|  .     +      |               | X  |
|C       D     E|               |/ \ |
+---------------+               e----g

Các boid đã tránh xa B(kết hợp tìm kiếm + chạy trốn), thay đổi nút trong quá trình, và bây giờ là trên nút c! Chúng tôi tính toán lại đường dẫn, và bây giờ có được c->d->e. Các boid được chỉ định Enhư là một mục tiêu tìm kiếm. Vân vân.

Do đó, chúng tôi có được một con đường mạch lạc tự nhiên và đầy cảm xúc, đó là sự pha trộn giữa hành vi A-Star và Chỉ đạo.


Cảm ơn bạn rất nhiều, tôi chỉ muốn hỏi một điểm cần làm rõ: liên quan đến bản đồ vật lý và liệu các nút của nó có thể đi được hay không. "Hãy để boid theo các hành vi của nó (tìm kiếm điểm, cộng với tránh va chạm, cộng với đổ xô) cho đến khi nó thay đổi nút" Tôi giả sử hệ thống này kiểm tra trước khi di chuyển để xem liệu chuyển động có vào một nút mới hay không, và trong trường hợp đó, nó sẽ luôn tránh được các nút - bởi vì như bạn đã đề cập, nó luôn tìm kiếm đường dẫn tối ưu đến mục tiêu (thông qua A *), và theo mặc định sẽ chỉ chờ để di chuyển trừ khi đàn cừu đi trước di chuyển ra khỏi đường?
không phù hợp Mã

"Tôi giả sử hệ thống này kiểm tra [...] để xem liệu chuyển động có vào một nút mới không". Vâng, không, với mỗi của riêng mình. Tôi giả sử các boids của bạn là các đối tượng vật lý di chuyển tự do (gấp đôi x, gấp đôi y). Họ không quan tâm đến các nút. Đó là một đại diện trừu tượng của thế giới của bạn. Trên thực tế, bạn đã nói "liên quan đến bản đồ vật lý và liệu các nút của nó có thể đi được hay không" nhưng tôi không khuyến khích bạn sử dụng các lỗ hổng trong thế giới riêng biệt, vì vậy chúng không "trong một nút". Họ chỉ, tốt, ở đâu đó trong (x, y).
MrBrushy

Để thêm vào điều này, tôi sẽ giải quyết vấn đề cuối cùng của bạn: rằng boid có thể đi lang thang vào lãnh thổ 'không thể vượt qua'. Chà, boid của bạn sẽ va chạm với các ranh giới hình học của thế giới vật lý (đa giác, vòng tròn ...). Vì vậy, về mặt thể chất, họ không thể vào khu vực không thể kiểm soát.
MrBrushy

Oh! Va chạm vật lý, tôi thấy. Hấp dẫn. Tôi sẽ phải điều tra thêm về vấn đề này, nhưng cảm ơn bạn, thế là đủ để bắt đầu!
không phù hợp Mã

Sau khi xem xét kỹ hơn về lý thuyết, một điều tôi vẫn không hiểu là làm thế nào để điều hòa địa hình vuông không thể vượt qua với không gian bo tròn. Bạn có thể giải thích bất kỳ cách nào để đảm bảo, giả sử, các boids sẽ không vượt qua một chướng ngại vật hình vuông lớn, đây có phải là nơi tham chiếu bản đồ vật lý của bạn trở nên thiết yếu? Nhưng loại thuật toán nào là cần thiết để hiện thực hóa giải pháp?
không phù hợp Mã
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.