Làm cho AI có những con đường khác nhau


16

Tôi có một trò chơi 2d từ trên xuống, nơi AI sinh ra ở rìa bản đồ và chạy về phía trung tâm.

Tôi đang sử dụng A * và một nút lưới để thực hiện tìm đường.

Ngay bây giờ, AI sinh sản tại một điểm trên rìa bản đồ và tất cả đều đi theo cùng một con đường là con đường ngắn nhất đến trung tâm.

Bây giờ tôi muốn họ trở nên đáng ngạc nhiên và thú vị hơn và đi những con đường khác nhau.

Tôi có thể nghĩ ngay đến hai ý tưởng để làm việc này nhưng muốn biết liệu có cách nào khác hay cách tốt hơn mà mọi người thường sử dụng không?

  1. Khi một kẻ thù sinh sản và tạo một đường dẫn đến trung tâm, tạm thời tăng chi phí của tất cả các nút trên đường dẫn đó, sau đó giảm dần chúng xuống theo thời gian. Sau đó, AI của kẻ thù sinh sản sau này sẽ buộc phải đi một con đường rộng hơn.

  2. Cách tiếp cận trên sẽ dẫn đến AI chỉ cần đi một con đường rộng hơn và rộng hơn và vẫn rất dễ đoán. Vì vậy, tôi nghĩ rằng tôi cũng sẽ giới thiệu một số nút mục tiêu trung gian trên bản đồ. Khi AI sinh sản, chúng ngẫu nhiên chọn một trong những mục tiêu trung gian và đến đó trước khi đến trung tâm bản đồ. Kết hợp điều này với phương pháp tăng chi phí ở trên có vẻ khá tốt?

Những cách tiếp cận nào mà mọi người tìm thấy có hiệu quả nhất để khiến AI thay đổi con đường họ đi, trông có vẻ thuyết phục và đáng ngạc nhiên?

Câu trả lời:


7

Tùy chọn thứ hai của bạn gợi ý về cách tiếp cận cơ bản hơn: đảm bảo kẻ thù tiếp cận người chơi của bạn từ các hướng khác nhau. Câu hỏi là, họ phải đi bao xa để có được "xung quanh" người chơi của bạn? Lý tưởng cho điều này sẽ là một kết hợp của

  • tự động tạo các điểm bao quanh chặt chẽ (tức là theo dõi) vị trí của người chơi;
  • những gì Nevermind đã đề xuất về mặt ngẫu nhiên các đường dẫn đến các điểm xung quanh này, ở mức độ lớn hơn hoặc thấp hơn.

Theo cách này, bạn có thể đảm bảo rằng AI sẽ không mất các đường vòng dài một cách không cần thiết chỉ để có được sự thay đổi đường dẫn thực tế khi hội tụ vào trình phát.

Phổ biến hợp tác làm những gì bạn muốn hoàn toàn là một phần của thuật toán. Nhưng nó không tầm thường để thực hiện.


Khuếch tán hợp tác chỉ là một trận lụt với một số trọng số. Việc thực hiện nó không quan trọng, có thể dễ dàng hơn A *. Nó chỉ đòi hỏi một cái nhìn khác về thế giới của bạn - một sự thay đổi khái niệm không tầm thường, có thể, nhưng không có vấn đề thực hiện.

Việc triển khai nó không phải là chuyện nhỏ vì nó là một quan điểm không chuẩn về mặt quản lý các thực thể AI :)
Kỹ sư

Cảm ơn Nick. Tôi nghĩ rằng thiết lập một số điểm mốc bao quanh người chơi ở trung tâm bản đồ sẽ là cách chính để đi. Không chắc chắn trong giai đoạn này liệu chúng sẽ được tạo động hay một số thủ công liên quan đến từng cấp độ cho tình huống cụ thể của tôi. Cảm ơn một lần nữa!
TerryB

12

Như một ý tưởng đầu tiên, hãy thử thêm một giá trị ngẫu nhiên nhỏ vào trọng lượng của mỗi nút khi tìm đường. Bằng cách này, mọi tác nhân sẽ tìm kiếm một con đường trong một môi trường hơi khác nhau. Tôi không chắc chắn nếu điều này sẽ làm việc trong trường hợp của bạn, nhưng nó sẽ thực sự dễ dàng để thử.


Kẻ thù cuối cùng sẽ chạy như những con gà, và trong một môi trường tốt đẹp, các con đường sẽ không quá khác biệt. Đó là một bổ sung tốt cho các giải pháp khác, nhưng bản thân nó không phải là một giải pháp
Coyote

@Coyote Điều này phụ thuộc rất nhiều vào cấu trúc lưới điều hướng và mối quan hệ giữa trọng lượng nút, tốc độ và thành phần ngẫu nhiên. Đó là lý do tại sao tôi đóng khung câu trả lời như một gợi ý để thử, không phải là một câu trả lời chắc chắn.
Không bao giờ bắt đầu

Thật vậy :) Tôi thường là một fan hâm mộ của entropy. Nhưng kết quả cuối cùng hiếm khi tuyệt vời.
Coyote

Tôi thực sự tin rằng câu trả lời của Nick Wiggill tốt hơn tôi rất nhiều. Nhưng bằng cách nào đó nó không nhận được sự ủng hộ mà nó xứng đáng.
Không bao giờ bắt đầu

Đó là ... Nhưng của bạn là đầu tiên và đơn giản hơn ... chúng ta có thể cố gắng bỏ phiếu: P
Coyote

3

Tôi thích câu trả lời của Nevermind , tuy nhiên, đưa ra giới hạn được mô tả trong các bình luận, đây là điều tôi sẽ thử:

  1. Thuật toán cho một đơn vị đến trung tâm, ghi lại tổng quãng đường đã đi.
  2. Đối với mỗi đơn vị tiếp theo phân bổ cho nó một khoảng cách là một khoảng thời gian ngẫu nhiên và nhỏ hơn thời gian này.
  3. Trong khi thực hiện A * cho mỗi đơn vị, hãy thêm trọng lượng dựa trên mức độ gần của bạn và khoảng cách bạn muốn đi. Đây có lẽ sẽ là một cái gì đó như (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

Điều này sẽ khiến các đơn vị cố gắng đi xa hơn, có lẽ là một con đường khác, dẫn đến việc chúng có thể đi theo những con đường khác nhau.

Bạn cũng có thể chỉ cần thêm nó vào huerests bắt đầu cho mỗi đơn vị, nhưng phạm vi ngẫu nhiên có thể phải lớn hơn một chút.


2

Như Nick Wiggill đã chỉ ra, cách tiếp cận đơn giản nhất là có được một vòng tròn bao quanh mục tiêu.

  • chỉ định ngẫu nhiên một điểm gần với vòng tròn này làm điểm tham chiếu.
  • loại bỏ tất cả các đường dẫn trong vòng tròn khỏi đường dẫn ban đầu (hoặc tăng đáng kể giá trị của các điểm này)
  • sau đó từ điểm đó có được đường dẫn đến mục tiêu.

Phần quan trọng là loại bỏ tất cả các đường dẫn trong vòng tròn cho điểm gốc ban đầu vì có thể bạn sẽ kết thúc với kẻ thù băng qua vòng tròn để đến điểm tham chiếu ban đầu của chúng.

Từ đó bạn có thể nhận được bất kỳ biến thể nào bằng cách chơi với nhiều giá trị thêm các điểm tham chiếu thứ cấp trong vòng tròn gần với điểm đầu tiên, v.v.


nếu bản đồ của bạn hỗ trợ nó, hãy tìm các vị trí 'thú vị' xung quanh vòng tròn này (cửa ra vào, che phủ, cây cối, đá, tòa nhà; bất kỳ nút nào có lợi thế chiến thuật) và đưa kẻ thù của bạn đến những vị trí đó trước nếu chúng có sẵn và chỉ xuất hiện ở mở nếu họ phải. Điều này sẽ trông thông minh hơn nhiều so với việc chỉ đánh một điểm ngẫu nhiên trên cạnh của vòng tròn.
DampeS8N

Cảm ơn Coyote, có lẽ tôi sẽ đi với giải pháp Nicks và như được đề xuất bởi DampeS8N một số vị trí quan tâm chính là điểm tham chiếu. Để tránh vấn đề AI "vượt qua vòng tròn" Tôi sẽ tăng đáng kể chi phí cho các nút trong vòng tròn vì vậy A * nên định tuyến xung quanh nó hy vọng :)
TerryB

2

Vấn đề của bạn ở đây về cơ bản là A * là một thuật toán để tìm ra con đường nhanh nhất đến mục tiêu. Nếu đó là tiêu chí chính của bạn cho một con đường 'tốt', thì thật không ngạc nhiên khi tất cả các diễn viên của bạn đều đưa ra quyết định giống nhau.

Những gì bạn cần làm là sửa đổi tiêu chí chất lượng của bạn cho đường dẫn, do đó, "ngắn nhất là tốt nhất" không phải là yếu tố duy nhất. Yếu tố ngẫu nhiên là chìa khóa trong vấn đề này, nhưng không đến nỗi nó làm mất trí thông minh tìm đường (tức là các diễn viên đi những con đường vòng quanh ngu ngốc đến mục tiêu).

A * pathfinding hoàn toàn ngây thơ, vì nó thường cho rằng diễn viên có kiến ​​thức hoàn hảo về toàn bộ tuyến đường trước khi nó bắt đầu. Điều đó luôn luôn trông không thực tế. Giải pháp cho thấy rằng các mục tiêu trung gian được chọn là một bước đi từ đó - AI đang cố gắng tiến gần hơn đến mục tiêu, nhưng chỉ cố gắng điều hướng trong các phần nhỏ tại một thời điểm (điều này tương tự như cuộc sống thực khi bạn chỉ có thể điều hướng xa như bạn có thể thấy, và khi bạn đi qua nhiều con đường hơn, bạn có thể thấy xa hơn về phía trước).

Có lẽ tôi muốn giới thiệu một cách đơn giản hơn để xem xét nó. Khi bạn tìm đường, đừng chỉ duy trì một con đường tốt nhất mà tôi đã tìm thấy cho đến nay. Thay vào đó, hãy thu thập một bộ 5 hoặc 10 đường dẫn tốt nhất. Sử dụng một ngưỡng để loại bỏ các ngoại lệ rõ ràng. Ví dụ: nếu đường tốt nhất đi qua 20u để đến mục tiêu, đường tiếp theo tốt nhất đi qua 21u và đường tiếp theo sau đó đi qua 50u. Đặt ngưỡng lớn hơn 20% so với đường dẫn tốt nhất và vì vậy hãy loại bỏ đường dẫn 50u vì nó dài hơn một cách ngu ngốc. Bây giờ bạn có một số đường dẫn để chọn và bằng cách chọn ngẫu nhiên từ nhóm đường dẫn đó, các diễn viên của bạn sẽ đưa ra các quyết định khác nhau.

Tuy nhiên, bạn sẽ không nhận được loại thông tin này với tìm kiếm A * tiêu chuẩn, vì vậy tôi nghĩ rằng bạn phải sửa đổi thuật toán hoặc sử dụng một cái gì đó khác để thu thập tập hợp các đường dẫn có thể.


1

Nếu bạn có một nhóm nhỏ kẻ thù định kỳ (hoặc loại kẻ thù), bạn có thể cố gắng cung cấp cho chúng tính cách ảnh hưởng đến chuyển động của chúng. Chúng không phải là những thứ lớn lao, chỉ là những thứ xuất hiện mọi lúc mọi nơi. Một ví dụ điển hình cho điều này là những hồn ma từ Pac-Man. Có A * của bạn được chia thành một số mục tiêu trung gian. Có thể một kẻ thù thực sự ngu ngốc và dễ dàng bị lạc, đi theo hướng ngẫu nhiên mỗi nút thứ ba (trừ trực tiếp lùi lại). Sáng tạo.

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.