Làm thế nào để xây dựng một lưu lượng truy cập AI AI AI?


21

Một dự án tôi đang thực hiện ngay bây giờ có rất nhiều "giao thông" theo nghĩa là ô tô di chuyển dọc theo đường, máy bay di chuyển trên một chiếc tạp dề, v.v.

Cho đến nay, các đường dẫn có sẵn được tính toán trước, do đó, các nút được tạo tự động cho các giao cắt mà chính chúng được liên kết với nhau bởi các cạnh. Khi một nhân vật / tác nhân xuất hiện trong thế giới, nó bắt đầu tại một nút nào đó và tìm thấy một đường dẫn đến nút đích bằng thuật toán A * đơn giản. Các tác nhân đi theo con đường và cuối cùng đạt đến đích của nó. Không có vấn đề cho đến nay.

Bây giờ tôi cần kích hoạt các tác nhân để tránh va chạm và xử lý các tình huống giao thông phức tạp. Vì tôi mới tham gia vào lĩnh vực AI, tôi đã tra cứu một số bài báo / bài viết về hành vi chỉ đạo nhưng thấy chúng ở cấp độ quá thấp. Vấn đề của tôi bao gồm ít sự tránh va chạm thực tế (điều này khá đơn giản trong trường hợp này vì các tác nhân đi theo các đường dẫn được xác định nghiêm ngặt) nhưng trong các tình huống như một tác nhân rời khỏi ngõ cụt trong khi một người khác muốn vào chính xác cùng một điểm. Hoặc hai tác nhân gặp nhau tại một nút cổ chai chỉ cho phép một tác nhân vượt qua cùng một lúc nhưng cả hai cần phải vượt qua nó (theo lộ trình tối ưu được tìm thấy trước đó) và họ cần tìm cách để cho người kia vượt qua trước. Vì vậy, về cơ bản, khía cạnh chính của vấn đề sẽ là dự đoán chuyển động giao thông để tránh khóa chết.

Khó diễn tả, nhưng tôi đoán bạn hiểu ý tôi. Bạn có bất cứ đề nghị cho tôi về nơi bắt đầu tìm kiếm? Bất kỳ giấy tờ, dự án mẫu hoặc những thứ tương tự có thể giúp tôi bắt đầu?

Tôi đánh giá cao sự giúp đỡ của bạn!


Khuếch tán hợp tác có thể giúp bạn một cái gì đó. Đó là một cách đơn giản để giải quyết đường dẫn tìm kiếm nhiều tác nhân cùng một lúc + các tác nhân tự tránh. Xin vui lòng, chia sẻ kinh nghiệm của bạn với nó ở đâu đó, cảm ơn. ;)
dùng712092

Câu trả lời:


12

Có rất nhiều cách để giải quyết vấn đề này, tôi đấu tranh để đưa ra một câu trả lời đàng hoàng và toàn diện ở đây. Nhưng đây là một số điểm thiết kế cấp cao.

  • Bạn đang xây dựng một mô phỏng đại lý ở đây. Pathfinding chỉ đơn giản là một đầu vào vào hệ thống - tác nhân có một mục tiêu và tìm đường dẫn chỉ là một cách nó có thể đạt được mục tiêu đó. Trên thực tế, nghĩ về điều đó theo nghĩa thực tế, người đại diện có hai mục tiêu: mục tiêu quan trọng nhất của người lái xe là "không gặp sự cố", thứ hai là "đến nơi tôi muốn đến".
  • Hệ thống của bạn nên xây dựng trên song song thế giới thực. Lý do tại sao hầu hết các con đường có hai hoặc nhiều làn là vì việc tổ chức giao thông với hệ thống đó dễ dàng hơn nhiều, không ai phải suy nghĩ nhiều. Trong một kịch bản làn đường duy nhất, lái xe phải sắp xếp các vấn đề khác nhau:

    phát hiện - nhận ra rằng bạn và chiếc xe sắp tới sẽ gặp sự cố trừ khi bạn tránh nhau

    phản ứng - chậm lại và bước vào giai đoạn đàm phán.

    đàm phán - một trong những trình điều khiển phải đi đầu, người kia phải nhường. Các quy tắc về cách quyết định điều này là mơ hồ, nhưng về cơ bản, bạn muốn một cái gì đó mà một người lái xe tùy tiện (hoặc dựa trên một heuristic về việc có bao nhiêu chiếc xe đi theo hướng khác) quyết định ưu tiên. Ví dụ: A được ưu tiên tại thời điểm 1, B thấy A được ưu tiên và mang lại lợi nhuận (bằng cách di chuyển ra khỏi đường và dừng lại). Nếu cả A và B đều cố gắng ưu tiên, cả hai nên dừng lại, đợi một khoảng thời gian ngẫu nhiên (hoặc báo hiệu cho nhau) và thử lại. Cuối cùng, người này sẽ nhường cho người kia.

    Cái hay của việc thực hiện này là nó tránh được sự cần thiết phải duy trì hàng đợi nhân tạo hoặc các cấu trúc giả mạo khác. Việc đàm phán được thực hiện theo các nhận thức trong thế giới thực - một khi cả hai bên đang trong giai đoạn đàm phán, bất kỳ chuyển động quan trọng nào về phía trước đều dễ dàng được phát hiện như một nỗ lực để được ưu tiên. Nó cũng nên phản ứng thích hợp với người dùng, những người rất có thể sẽ không tuân thủ các quy tắc lái xe tốt.

  • Giả sử điều tồi tệ nhất. Ngay cả trong một hệ thống hoàn hảo, các tình huống kỳ quặc có thể xảy ra, và các diễn viên của bạn nên hành động hợp lý. Điều này thậm chí còn có khả năng hơn nếu người chơi có thể can thiệp (chặn các khu vực một cách giả tạo, v.v.) Thông thường, dừng hoàn toàn là phản ứng hợp lý duy nhất (chặn lưới!) Quay tại chỗ hoặc rõ ràng là ở trạng thái bị hỏng là một thất bại của AI. Dừng hoàn toàn ít nhất là hợp lý trong điều khoản của thế giới thực.

    Bạn càng mô hình hóa AI của diễn viên của mình theo logic thế giới thực đơn giản, thì càng dễ tạo ra AI thuyết phục. Người thật không dừng lại hoặc dao động qua lại nếu họ không thể đạt được mục tiêu. Nếu con đường duy nhất đến đích của AI bị chặn, họ sẽ nhận ra điều đó và chọn một phản hồi (dừng lại hoàn toàn, từ bỏ và lái xe về nhà, từ bỏ và lái xe đi nơi khác).

  • Hành vi lớp để có được những gì bạn muốn. Hãy nhớ rằng, mục tiêu đầu tiên là không sụp đổ. Vì vậy, logic tránh (lái) phải luôn chi phối hành động của người lái. Lớp trên cùng là logic định hướng xuất phát từ việc tìm đường ('Tôi muốn có quyền ở ngã ba tiếp theo'). Lớp trên cùng là đánh giá lại các đường dẫn thỉnh thoảng, với logic mức cao hơn ('thích đi tiếp, nhưng nếu tôi không thể tiến bộ, hãy cho phép một đường dẫn mới liên quan đến ngã rẽ').

  • Tìm kiếm con đường đến từ bộ nhớ, nhưng nhận thức tình huống dựa trên nhận thức. Đừng cố gắng làm cho các đại lý của bạn hoàn hảo. Họ biết đường từ nhà đến văn phòng, vì vậy họ biết phải làm gì. Nhưng họ không biết rằng đường 2 dặm bị chặn. Đừng cố gắng làm cho các đại lý của bạn vạch ra một con đường hoàn hảo, bởi vì không có gì - ngay cả khi nó bắt đầu hoàn hảo, các yếu tố khác có thể chặn đường đi của họ. Đại lý chỉ cần lập kế hoạch cho một vài con đường phía trước nơi họ sẽ đến.

  • Chất lượng thông tin. Hành vi của bạn nên đơn giản, nhưng để đạt được điều đó bạn cần có chức năng truy vấn tốt. Bạn cần có thể đặt câu hỏi về môi trường của mình như "chiếc xe sắp tới có chiếm làn đường của tôi không?", "Có bao nhiêu chiếc xe đang tới?", "Có xe nào phía sau tôi không", "tôi có thể quay đầu xe không" .


Cảm ơn bạn đã trả lời công phu của bạn. Lời khuyên của bạn sẽ thực sự hữu ích khi tôi tham gia giao thông đường bộ thường xuyên. Nhưng tôi có lẽ đã bỏ lỡ để lưu ý hai khía cạnh quan trọng trong bài viết đầu tiên của mình: 1. Người chơi không tham gia giao thông. Nó giống như một chiếc sim kinh doanh và anh ấy xây dựng mạng lưới. 2. Các đường đơn hướng xảy ra đặc biệt là trên các sân bay, nhưng trên các sân bay, các đại lý không "tự mình" mà có một tòa tháp cho họ biết nơi cần đi. Tòa tháp phải xác định các tình huống khó khăn, nhưng cũng có kiến ​​thức tổng thể Vì vậy tôi cho rằng đó là một lớp trên các tình huống / hành vi mà bạn mô tả.
Lunikon

5

Nhìn thấy một số thất bại khủng khiếp trong các trò chơi phát hành, tôi có một vài gợi ý:

1) Trừ khi có một lý do chính đáng khác là tạo hai làn đường và vì mục đích AI khiến chúng có quyền ưu tiên cho hướng di chuyển bình thường - cho phép đi hai chiều nhưng nếu có gì đó đi ngược chiều thì anh chàng đi ngược chiều mang lại cho nó

2) Một số loại logic để giải tỏa kẹt xe nếu xảy ra. Tôi đã xem các tình huống xử lý kẹt xe chỉ áp dụng cho các phương tiện đang cố gắng chạy vào nhau nhưng hoàn toàn thất bại khi đối mặt với mô hình -> -> <- <-. Tôi nhớ lại một bản đồ thiên về điều này - đó là một điểm nghẹt có nghĩa là làm cho căn cứ AI khó tấn công hơn nhưng sớm muộn hai kẻ khai thác tài nguyên sẽ vào trong khi một nhóm tấn công đang tiến ra và đó là điều đó. Các đơn vị liên lạc sẽ quay xung quanh cố gắng tìm ra một tuyến đường nhưng họ không có động thái hợp pháp. Nó không quay lại và nhận ra rằng một số đơn vị khác phải di chuyển trước, và do đó AI không có hành động hữu ích nào cho đến khi chặn đường được gỡ bỏ. (Bạn có thể xem các thiết bị tiếp xúc quay xung quanh và không có gì khác làm gì cả.)

Tôi tin rằng điều này có thể được giải quyết bằng cách làm cho một đơn vị bị mắc kẹt nói với các đơn vị lân cận tránh đường - điều này sẽ lan truyền cho đến khi nó đạt đến một đơn vị chưa được tháo gỡ có thể lùi lại. Điều này sẽ phải liên quan đến một số loại logic để tránh xa chúng cho đến khi vấn đề được giải quyết.

Lưu ý rằng chỉ đơn giản là tìm kiếm một con đường thay thế thường là một câu trả lời tồi. Tôi đã xem một tình huống sống động của loại đó - đơn vị A lưu ý rằng B đang chặn đường lên phía trước và vì vậy nó quay lại để sử dụng một tuyến đường khác. Điều này bây giờ chặn đường cho B người quay đầu lại - bây giờ đường không bị chặn nên cả hai quay lại. Mỗi lượt chúng xen kẽ giữa di chuyển về phía trước và di chuyển lùi.

Trò chơi tương tự tôi đã thấy một phiên bản khác của nó, cũng do sương mù chiến tranh. Có một đơn vị quân địch ở một điểm choke. Khi tự động di chuyển, đường dẫn sẽ không chiến đấu trừ khi thực sự nhắm vào đơn vị quân địch. Nó sẽ di chuyển về phía trước và thấy con đường đã bị chặn. Sau đó nó di chuyển trở lại, nó không còn có thể nhìn thấy trình chặn và nó sẽ di chuyển về phía trước một lần nữa. Lặp lại cho đến khi con người nhận ra nó không đến được nơi cần đến.


2
Câu trả lời hay - Tôi thích khái niệm phát thông điệp 'bị kẹt' để bất cứ ai có thể thoát ra.
MrCranky

4

Tôi không quá kinh nghiệm với các mô phỏng giao thông, nhưng một vài điều cần chú ý.

Thứ nhất, để ngăn chặn tắc nghẽn ở nơi đầu tiên tôi sẽ có hai làn đường cho phép các phương tiện đi ngược chiều nhau. trên cùng một "con đường".

Thứ hai, đối với các va chạm có thể xảy ra, bạn nên có hành vi lái tránh va chạm để ngăn chặn một đống lớn. Hành vi chỉ đạo có thể ở mức độ thấp, nhưng chúng rất hữu ích trong việc tạo ra hành vi nổi lên trông thật.

Nếu bạn không muốn có nhiều hơn một làn đường, bạn sẽ phải lưu trữ nhiều thông tin hơn trong biểu đồ. Ví dụ: nếu tác nhân A ở trên đường (được biểu thị là cạnh đồ thị) và tác nhân B ở trên cùng một con đường di chuyển theo hướng ngược lại với A thì chúng sẽ va chạm / bế tắc / bất cứ điều gì bạn đã mã hóa để xử lý hành vi này.

Tuy nhiên, nếu đại lý A đi trên một con đường, nó có thể yêu cầu quyền sở hữu con đường đó. Sở hữu con đường có nghĩa là không có tác nhân nào khác có thể đi dọc theo cạnh đó (bạn có thể làm điều này khá đơn giản bằng cách thay đổi chi phí cạnh thành một số lượng lớn để đảm bảo A * không chọn đường khi tính toán đường đi). Sau đó, khi đại lý A không có con đường đó, họ từ bỏ quyền sở hữu.

Thành thật mà nói, đó là một giải pháp hack mà tôi không đặc biệt yêu thích và hầu hết các mô phỏng giao thông (nếu không phải là tất cả?) Mà tôi đã thấy sử dụng phương pháp nhiều làn.


Có, nên sử dụng hai làn đường (vì đơn giản chỉ có hai làn đường) nhưng điều đó không giải quyết được bất kỳ vấn đề nào liên quan đến việc nhường đường (mà hầu hết các vấn đề mà người hỏi mô tả là)
Bart van Heukelom 2/211

4

Bạn nói rằng bạn đã tra cứu một số bài viết về hành vi lái, mặc dù chỉ trong trường hợp, bạn đã tra cứu bài sau?

http://www.red3d.com/cwr/steer/

Nếu không, nó có thể cung cấp cho bạn một số câu trả lời, vì nó bao gồm một số vấn đề bạn đặt tên, ví dụ như vấn đề thắt cổ chai (Xếp hàng).


0

Tôi nghĩ rằng những gì bạn cần làm là thực hiện một thuật toán tìm đường.

Chia bản đồ của bạn thành các mảnh nhỏ nhất có thể (nói hình vuông) nhưng chỉ dành cho những nơi hợp lệ để giao thông đi lại. Sau đó, bạn sẽ xác định nơi chiếc xe và nơi nó sẽ đi và tìm một con đường, có lẽ ngắn nhất hoặc trực tiếp nhất. Đường dẫn sẽ là một mảng các ô vuông, mỗi bước của con đường đến định mệnh. Những gì bạn muốn sau đó là tính toán không chỉ vị trí hiện tại của tất cả các phương tiện mà cả vị trí tương lai của phương tiện cho một vài bước trong tương lai. Nếu hai phương tiện sẽ ở cùng một hình vuông trong tương lai thì bạn cần thay đổi vận tốc của một hoặc cả hai.

A * (Ngôi sao) là một thuật toán tìm đường rất đơn giản mà bạn có thể dễ dàng dịch mã psuedo trong wikipedia sang ngôn ngữ bạn chọn và nó sẽ hoạt động: http://en.wikipedia.org/wiki/A*_search_alerskym


4
Như tôi đã đề cập trong bài viết ban đầu của mình, tôi đã triển khai thuật toán A * và cũng có cấu trúc dữ liệu phù hợp. Ngoài ra, chỉ cần giảm vận tốc của một trong hai tác nhân nghe có vẻ hơi "dễ" đối với tôi.
Lunikon

Đây không phải là vấn đề tìm đường, đây là vấn đề mô phỏng tác nhân. Tìm đường chỉ là mức độ thông minh thấp nhất mà các diễn viên cần áp dụng.
MrCranky

Quá dễ dàng? haha Vâng, đó là những gì tôi làm khi lái xe! Nếu tôi có thể dự đoán một vụ va chạm với con đường hiện tại của tôi, tôi sẽ thay đổi vận tốc của mình.
justin.m.chase

Còn đèn giao thông? Và phải làm gì khi đường của bạn bị chặn bởi một phương tiện khác? Phải làm gì khi con đường của bạn nói tiến lên, nhưng vận tốc của bạn bằng không để tránh va chạm. Một vụ va chạm với một chiếc xe khác, có con đường nói đi về phía trước (thông qua bạn), và vận tốc của chúng cũng bằng không?
MrCranky

Trong trường hợp một làn, nếu bạn sử dụng vận tốc của những chiếc xe khác để tính điểm đến trong tương lai của họ khi chiếc xe đầu tiên phát hiện va chạm và chiếc xe kia sẽ không cần dừng lại vì vận tốc của chiếc xe đầu tiên là 0. Điều này cho rằng bạn Sẽ có thể nhìn đủ xa về phía trước để thấy những vụ va chạm với ô tô trên những con đường một làn dài. Một người bạn của tôi đề nghị bạn nên thêm một nút STOP vào thuật toán A * của mình. Với quan điểm của bất kỳ chiếc xe đơn lẻ nào, bạn chỉ coi những chiếc xe khác là một trở ngại. Dừng lại có thể bỏ chặn con đường của bạn nếu thực hiện đủ lâu.
justin.m.chase

0

Khi tôi thực hiện Enemy Nations, dự phòng cuối cùng của tôi là nếu một chiếc xe bị kẹt trong hơn 2 giây, tôi đã nhảy nó về phía trước trên con đường của nó. Vì vậy, khi họ bị mắc kẹt, một đơn vị vận chuyển về cơ bản. Không ai từng phàn nàn vì vậy tôi nghĩ rằng vài lần nó đã xảy ra không ai xem và không nhìn thấy nó.

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.