Tìm đường trốn chạy


61

Như bạn biết, có rất nhiều giải pháp khi bạn đi lang thang để tìm con đường tốt nhất trong môi trường 2 chiều dẫn từ điểm A đến điểm B.

Nhưng làm thế nào để tôi tính toán một đường dẫn khi một đối tượng ở điểm A và muốn rời khỏi điểm B, càng nhanh và càng xa càng tốt?

Một chút thông tin cơ bản: Trò chơi của tôi sử dụng môi trường 2d không dựa trên gạch nhưng có độ chính xác điểm nổi. Phong trào dựa trên vector. Việc tìm đường được thực hiện bằng cách phân vùng thế giới trò chơi thành các hình chữ nhật có thể đi bộ hoặc không đi được và xây dựng một biểu đồ từ các góc của chúng. Tôi đã có đường dẫn giữa các điểm làm việc bằng cách sử dụng thuật toán Dijkstras. Trường hợp sử dụng cho thuật toán chạy trốn là trong một số tình huống, các diễn viên trong trò chơi của tôi nên coi một diễn viên khác là một mối nguy hiểm và chạy trốn khỏi nó.

Giải pháp tầm thường là chỉ cần di chuyển diễn viên theo một vectơ theo hướng ngược lại với mối đe dọa cho đến khi đạt được khoảng cách "an toàn" hoặc diễn viên chạm tới một bức tường nơi nó sợ hãi.

Vấn đề với cách tiếp cận này là các diễn viên sẽ bị chặn bởi những chướng ngại vật nhỏ mà họ có thể dễ dàng vượt qua. Miễn là di chuyển dọc theo bức tường sẽ không đưa họ đến gần hơn với mối đe dọa mà họ có thể làm điều đó, nhưng nó sẽ trông thông minh hơn khi họ sẽ tránh chướng ngại vật ngay từ đầu:

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

Một vấn đề khác tôi thấy là với các ngõ cụt trong hình học bản đồ. Trong một số trường hợp, một sinh vật phải chọn giữa một con đường nhanh hơn bây giờ nhưng lại đi vào ngõ cụt, nơi nó sẽ bị mắc kẹt, hoặc một con đường khác có nghĩa là lúc đầu nó sẽ không đi xa khỏi nguy hiểm (hoặc thậm chí gần hơn một chút) nhưng mặt khác sẽ có phần thưởng dài hạn lớn hơn nhiều ở chỗ nó cuối cùng sẽ đưa họ đi xa hơn nhiều. Vì vậy, phần thưởng ngắn hạn của việc đi nhanh phải được đánh giá bằng cách nào đó so với phần thưởng dài hạn là đi xa .

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

Ngoài ra còn có một vấn đề đánh giá khác cho các tình huống mà một diễn viên nên chấp nhận để tiến gần hơn đến một mối đe dọa nhỏ để thoát khỏi mối đe dọa lớn hơn nhiều. Nhưng hoàn toàn bỏ qua tất cả các mối đe dọa nhỏ cũng sẽ là ngu ngốc (đó là lý do tại sao diễn viên trong đồ họa này đi ra ngoài để tránh mối đe dọa nhỏ ở khu vực phía trên bên phải):

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

Có bất kỳ giải pháp tiêu chuẩn cho vấn đề này?


8
+1 Câu hỏi tuyệt vời với hình ảnh tuyệt vời. Nó thực sự làm cho câu hỏi rõ ràng.
MichaelHouse

Câu trả lời:


24

Đây có thể không phải là giải pháp tốt nhất, nhưng nó đã giúp tôi tạo ra một AI chạy trốn cho trò chơi này .

Bước 1. Chuyển đổi thuật toán Dijkstra của bạn sang A * . Điều này nên đơn giản bằng cách chỉ cần thêm một heuristic, đo khoảng cách tối thiểu còn lại đến mục tiêu. Heuristic này được thêm vào khoảng cách di chuyển cho đến nay khi ghi một nút. Dù sao thì bạn cũng nên thực hiện thay đổi này vì nó sẽ thúc đẩy công cụ tìm đường của bạn một cách đáng kể.

Bước 2. Tạo một biến thể của heuristic, thay vì ước tính khoảng cách đến mục tiêu, nó đo khoảng cách từ (các) nguy hiểm và phủ nhận giá trị này. Điều này sẽ không bao giờ đạt được mục tiêu (vì không có mục tiêu nào), vì vậy bạn cần chấm dứt tìm kiếm tại một số điểm, có thể sau số lần lặp cụ thể, sau khi đạt được khoảng cách cụ thể hoặc khi tất cả các tuyến có thể được xử lý. Giải pháp này có hiệu quả tạo ra một công cụ tìm đường tìm ra lối thoát tối ưu với giới hạn nhất định.


1
Lưu ý rằng chỉ cần sử dụng một cái gì đó như khoảng cách đường thẳng từ nguy hiểm như heuristic ở bước 2 thường sẽ không mang lại một heuristic đáng ngưỡng mộ. Tất nhiên, điều đó không có nghĩa là bạn không thể thử sử dụng nó, nhưng nó có thể không tạo ra các lối thoát tối ưu. Để có được một heuristic thực sự được chấp nhận cho "A * ngược" này, tôi nghĩ rằng bạn cần sử dụng A * / Dijkstra bình thường để tính khoảng cách thực tế của mỗi ô vuông khỏi nguy hiểm.
Ilmari Karonen

+1 Tôi nghĩ rằng điều này mang lại tiếng nổ tốt nhất cho bạn khi có nhiều nỗ lực cho kết quả.
MichaelHouse

33

Nếu bạn thực sự muốn các diễn viên của mình thông minh về việc chạy trốn, chỉ cần tìm đường dẫn Dijkstra / A * đơn giản sẽ không cắt nó. Lý do cho điều này là, để tìm ra lối thoát tối ưu khỏi kẻ thù, nam diễn viên cũng cần xem xét cách kẻ thù sẽ di chuyển trong cuộc truy đuổi.

Sơ đồ MS Paint sau đây sẽ minh họa một tình huống cụ thể khi chỉ sử dụng tính năng tìm đường tĩnh để tối đa hóa khoảng cách với kẻ thù sẽ dẫn đến kết quả tối ưu:

Sơ đồ diễn viên chạy trốn kẻ thù trong mê cung hình chữ P

Ở đây, chấm xanh đang chạy trốn khỏi chấm đỏ và có hai lựa chọn cho một con đường phải đi. Đi xuống con đường bên tay phải sẽ cho phép nó tiến xa hơn từ vị trí hiện tại của chấm đỏ , nhưng cuối cùng sẽ bẫy được chấm xanh trong ngõ cụt. Thay vào đó, chiến lược tối ưu là cho chấm xanh tiếp tục chạy quanh vòng tròn, cố gắng ở phía đối diện với nó từ chấm đỏ.

Để tìm chính xác các chiến lược thoát như vậy, bạn sẽ cần một thuật toán tìm kiếm đối nghịch như tìm kiếm minimax hoặc các tinh chỉnh của nó như cắt tỉa alpha-beta . Một thuật toán như vậy, được áp dụng cho kịch bản ở trên với độ sâu tìm kiếm đủ, sẽ suy luận chính xác rằng việc đi theo đường cụt về phía bên phải chắc chắn sẽ dẫn đến việc nắm bắt, trong khi vẫn ở trên vòng tròn sẽ không (miễn là dấu chấm màu xanh lá cây có thể vượt qua một màu đỏ).

Tất nhiên, nếu có nhiều diễn viên thuộc một trong hai loại, tất cả những người này sẽ cần lập kế hoạch cho chiến lược của riêng họ - hoặc riêng biệt hoặc, nếu các diễn viên hợp tác cùng nhau. Các chiến lược đuổi / trốn nhiều diễn viên như vậy có thể trở nên phức tạp đáng ngạc nhiên; ví dụ, một chiến lược khả thi cho một diễn viên chạy trốn là cố gắng đánh lạc hướng kẻ thù bằng cách dẫn nó tới một mục tiêu hấp dẫn hơn. Tất nhiên, điều này sẽ ảnh hưởng đến chiến lược tối ưu của mục tiêu khác, v.v.

Trong thực tế, có lẽ bạn sẽ không thể thực hiện các tìm kiếm rất sâu trong thời gian thực với nhiều tác nhân, vì vậy bạn sẽ phải phụ thuộc vào heuristic rất nhiều. Việc lựa chọn các heuristic này sau đó sẽ xác định "tâm lý" của các diễn viên của bạn - họ hành động thông minh như thế nào, họ chú ý đến các chiến lược khác nhau như thế nào, họ hợp tác hay độc lập, v.v.


7

Bạn đã tìm đường dẫn, vì vậy bạn có thể giảm bớt vấn đề để chọn một điểm đến tốt.

Nếu có những điểm đến an toàn tuyệt đối trên bản đồ (ví dụ: lối thoát mà mối đe dọa không thể theo dõi diễn viên của bạn thông qua), hãy chọn một hoặc nhiều điểm gần đó và tìm ra điểm nào có chi phí đường đi thấp nhất.

Nếu diễn viên bỏ trốn của bạn có những người bạn được vũ trang tốt, hoặc nếu bản đồ bao gồm các mối nguy hiểm mà diễn viên đó miễn nhiễm nhưng mối đe dọa thì không, hãy chọn một địa điểm mở gần một người bạn hoặc mối nguy hiểm đó và tìm đường đến đó.

Nếu diễn viên bỏ trốn của bạn nhanh hơn một số diễn viên khác mà mối đe dọa cũng có thể quan tâm, hãy chọn một điểm theo hướng của diễn viên khác, nhưng vượt ra ngoài, và tìm đến điểm đó: "Tôi không phải vượt qua con gấu , Tôi chỉ phải vượt qua bạn. "

Nếu không có khả năng trốn thoát, hoặc giết chết hoặc đánh lạc hướng mối đe dọa, diễn viên của bạn sẽ phải chịu số phận, phải không? Vì vậy, chọn một điểm tùy ý để chạy đến, và nếu bạn đến đó, và mối đe dọa vẫn đang theo bạn, cái quái gì: biến và chiến đấu.


7

Vì việc chỉ định vị trí mục tiêu phù hợp có thể khó khăn trong nhiều tình huống, cách tiếp cận sau đây dựa trên bản đồ lưới chiếm chỗ 2D có thể đáng xem xét. Nó thường được gọi là "lặp lại giá trị" và được kết hợp với độ dốc / tăng dần, nó mang lại một thuật toán lập kế hoạch đường dẫn đơn giản và khá hiệu quả (tùy thuộc vào việc thực hiện). Do tính đơn giản của nó, nó nổi tiếng trong ngành robot di động, đặc biệt là "robot đơn giản" điều hướng trong môi trường trong nhà. Như đã ngụ ý ở trên, cách tiếp cận này cung cấp một phương tiện tìm đường đi từ vị trí bắt đầu mà không chỉ định rõ ràng vị trí mục tiêu như sau. Lưu ý rằng một vị trí mục tiêu có thể được chỉ định tùy ý, nếu có sẵn. Ngoài ra, cách tiếp cận / thuật toán tạo thành một tìm kiếm đầu tiên,

Trong trường hợp nhị phân, bản đồ lưới chiếm chỗ 2D là một cho các ô lưới bị chiếm dụng và không ở nơi nào khác. Lưu ý rằng giá trị chiếm chỗ này cũng có thể liên tục trong phạm vi [0,1], tôi sẽ quay lại giá trị bên dưới. Giá trị của một ô lưới đã cho g iV (g i ) .

Phiên bản cơ bản

  1. Giả sử rằng ô lưới g 0 chứa vị trí bắt đầu. Đặt V (g 0 ) = 0 và đặt g 0 vào hàng đợi FIFO.
  2. Lấy ô lưới tiếp theo g i từ hàng đợi.
  3. Đối với tất cả hàng xóm g j của g i :
    • Nếu g j không bị chiếm đóng và chưa được truy cập trước đó:
      • V (g j ) = V (g i ) +1
      • Đánh dấu g j như đã truy cập.
      • Thêm g j vào hàng đợi FIFO.
  4. Nếu chưa đạt đến ngưỡng khoảng cách nhất định, hãy tiếp tục với (2.), nếu không thì tiếp tục với (5.).
  5. Đường dẫn thu được bằng cách đi theo độ dốc dốc nhất bắt đầu từ g 0 .

Ghi chú ở Bước 4.

  • Như đã nêu ở trên, bước (4.) yêu cầu theo dõi khoảng cách tối đa được bao phủ, đã bị bỏ qua trong mô tả ở trên vì lý do rõ ràng / ngắn gọn.
  • Nếu một vị trí mục tiêu được đưa ra, việc lặp lại sẽ bị dừng ngay khi đạt đến vị trí mục tiêu, tức là được xử lý / truy cập như một phần của bước (3.).
  • Tất nhiên, cũng có thể đơn giản là xử lý toàn bộ bản đồ lưới, tức là tiếp tục cho đến khi tất cả các ô lưới (miễn phí) được xử lý / truy cập. Yếu tố giới hạn rõ ràng là kích thước của bản đồ lưới kết hợp với độ phân giải của nó.

Phần mở rộng và nhận xét thêm

Phương trình cập nhật V (g j ) = V (g i ) +1 để lại nhiều khoảng trống để áp dụng tất cả các loại phương pháp phỏng đoán bổ sung bằng cách giảm tỷ lệ V (g j )hoặc thành phần phụ gia để giảm giá trị cho các tùy chọn đường dẫn nhất định. Hầu hết, nếu không phải tất cả, những sửa đổi như vậy có thể được kết hợp độc đáo và tổng quát bằng cách sử dụng bản đồ lưới với các giá trị liên tục từ [0,1], tạo thành một bước xử lý trước của bản đồ lưới nhị phân ban đầu. Ví dụ: thêm một chuyển đổi từ 1 đến 0 dọc theo các ranh giới chướng ngại vật, khiến "diễn viên" tốt nhất là giữ sạch các chướng ngại vật. Ví dụ, bản đồ lưới như vậy có thể được tạo từ phiên bản nhị phân bằng cách làm mờ, giãn nở có trọng số hoặc tương tự. Thêm các mối đe dọa và kẻ thù làm chướng ngại vật với bán kính làm mờ lớn, sẽ phạt những con đường đến gần chúng. Người ta cũng có thể sử dụng quy trình khuếch tán trên bản đồ lưới tổng thể như thế này:

V (g j ) = (1 / (N + 1)) × [V (g j ) + tổng (V (g i ))]

trong đó " tổng " chỉ tổng trên tất cả các ô lưới lân cận. Ví dụ: thay vì tạo bản đồ nhị phân, các giá trị (số nguyên) ban đầu có thể tỷ lệ thuận với cường độ của các mối đe dọa và các chướng ngại vật thể hiện các mối đe dọa "nhỏ". Sau khi áp dụng quy trình khuếch tán, các giá trị lưới phải / phải được thu nhỏ thành [0,1] và các ô bị chiếm bởi chướng ngại vật, các mối đe dọa và kẻ thù nên được đặt / buộc thành 1. Nếu không, tỷ lệ trong phương trình cập nhật có thể không làm việc như mong muốn.

Có nhiều biến thể về sơ đồ / phương pháp chung này. Chướng ngại vật v.v ... có thể có các giá trị nhỏ, trong khi các ô lưới tự do có các giá trị lớn, có thể yêu cầu giảm độ dốc ở bước cuối cùng tùy thuộc vào mục tiêu. Trong mọi trường hợp, cách tiếp cận là, IMHO, linh hoạt đáng ngạc nhiên, khá dễ thực hiện và có khả năng khá nhanh (tùy thuộc vào kích thước / độ phân giải bản đồ lưới). Cuối cùng, như với nhiều thuật toán lập kế hoạch đường dẫn không đảm nhận vị trí mục tiêu cụ thể, có nguy cơ bị mắc kẹt trong ngõ cụt. Ở một mức độ nào đó, có thể áp dụng các bước xử lý hậu chuyên dụng trước bước cuối cùng để giảm rủi ro này.

Đây là một mô tả ngắn gọn khác với hình minh họa trong Java-Script (?), Mặc dù hình minh họa không hoạt động với trình duyệt của tôi :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

Nhiều chi tiết hơn về kế hoạch có thể được tìm thấy trong cuốn sách sau đây. Lặp lại giá trị được thảo luận cụ thể trong Chương 2, Phần 2.3.1 Các kế hoạch có độ dài cố định tối ưu.

http://planning.cs.uiuc.edu/

Hy vọng rằng sẽ giúp, loại trân trọng, Derik.


3

Làm thế nào về việc tập trung vào động vật ăn thịt? Chúng ta hãy chiếu tia 360 độ vào vị trí của Động vật ăn thịt, với mật độ thích hợp. Và chúng ta có thể có mẫu tị nạn. Và chọn nơi ẩn náu tốt nhất.

trường hợp 1

trường hợp 2


0

Một cách tiếp cận mà họ có trong Star Trek Online dành cho đàn động vật là chỉ cần chọn một hướng mở và hướng vào đó, nhanh chóng, sinh sản cho động vật sau một khoảng cách nhất định. Nhưng đó chủ yếu là một phim hoạt hình de-spawn được tôn vinh cho những đàn gia súc mà bạn phải sợ để tấn công bạn, và không phù hợp với mob chiến đấu thực tế.

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.