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.
- 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.
- 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 A
và a
, mục tiêu là trong E
và e
, có một cánh cửa trong D
và d
.
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 d
quyế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 E
như 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.