Lập kế hoạch hành động theo mục tiêu với nhiều Đại lý


8

Tôi hơi bế tắc:

Tôi đã triển khai AI với GOAP (Lập kế hoạch hành động theo mục tiêu, http://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf ) cho một trò chơi mô phỏng. Điều đó làm việc tốt.

Bây giờ tôi muốn các tác nhân có thể hợp tác (ví dụ như thực hiện các hành động cùng nhau). Trong trường hợp này, Thiết kế AI tốt nhất mà GoapActions giữ cho khớp nối lỏng lẻo là gì?

Họ có nên lên kế hoạch cùng nhau? (trong trường hợp này là "thế giới" là gì?) Hoặc họ có nên chia sẻ kế hoạch của mình không? một số loại hệ thống tin nhắn?

Ví dụ
Tác nhân1: Tác nhân thế giới 1: isLonely = true
Mục tiêu Tác nhân1: isLonely = false

Tác nhân kế hoạch1: AskAgent2ToTalk -> TalkToAgent2

Agent2 Worldstate Agent 2: hasWood = false
Mục tiêu hasWood = true

Đại lý kế hoạch2: GetAxe -> ChopWood -> MangWoodToSupply

Làm thế nào tôi có được chòm sao này?

Kế hoạch Agent1: TalkToAgent2
Kế hoạch Agent2: TalkToAgent1 -> GetAxe -> ChopWood -> bringWoodToSupply

Hoặc nếu họ đang nói chuyện và một trong những đặc vụ bị gián đoạn (ví dụ như bởi một kẻ thù tấn công) thì nhân viên kia phải biết rằng Hành động TalktoAgent2 của anh ta đã kết thúc.

Câu trả lời:


1

Tôi rất khuyên bạn không nên sử dụng kế hoạch aciton. Rất khó để mở rộng, thiết kế và sửa lỗi. Chúng tôi đã từ bỏ kế hoạch nhiệm vụ từ rất sớm ở DwarfCorp vì quá phức tạp để nhanh chóng thiết kế các hành vi mới xung quanh. Nhưng nếu bạn phải, bạn phải giải thích đây là một vấn đề lập kế hoạch đa tác nhân.

Một cách để đạt được điều này là thông qua Kế hoạch gia truyền . Bạn cần tạo một tác nhân meta để gán các bài toán con cho các tác nhân cấp thấp hơn. Tác nhân meta, hay "Trình lập kế hoạch nhiệm vụ" cố gắng đạt được mục tiêu tổng thể và sử dụng các tác nhân phụ dưới sự kiểm soát của nó làm hành động meta.

Ví dụ: đại lý meta của bạn có thể có mục tiêu "Xây nhà". Nó có hành động "thu thập gỗ", lấy đầu vào là một tác nhân và một vị trí để thu thập gỗ tại. Sau đó, nó có thể gán các tác nhân khác nhau cho các nhiệm vụ khác nhau. Có thể một đại lý đi và tập hợp gỗ trong khi người kia sử dụng gỗ tập hợp để xây dựng ngôi nhà.

Nó có thể có những mục tiêu khác, như "giảm sự cô đơn". Những mục tiêu đó cần được sắp xếp theo thứ tự ưu tiên để chúng có thể thu hút lẫn nhau. Công cụ lập kế hoạch trung tâm quyết định tại bất kỳ thời điểm nào, các mục tiêu quan trọng nhất là gì và gán các tác nhân cho chúng bằng cách sử dụng các phần tử con khác nhau. Nó tìm kiếm các tác nhân nhàn rỗi, tìm ra các nhiệm vụ con tốt nhất để gán cho các tác nhân, và sau đó đặt chúng vào trường hợp.


Điều gì cho một hệ thống kế hoạch bạn đang sử dụng trong dwarfCrop? Hệ thống lập kế hoạch phân cấp có một vấn đề: làm thế nào để bạn hiểu được 'ý chí tự do' của một đại lý? tác nhân không nên luôn luôn làm những gì mà 'tác nhân meta' yêu cầu.
james

1
Vì vậy, đại lý meta nói "Đây là những nhiệm vụ tôi muốn bạn làm." Đại lý cũng có một bộ các ưu tiên như "Tôi chán" hoặc "Tôi đói". Chúng được đặt vào hàng đợi ưu tiên. Đôi khi, các ưu tiên của tác nhân meta ghi đè lên các ưu tiên của tác nhân, lần khác, tác nhân sẽ ghi đè lên tác nhân meta.
mklingen

0

Tôi nghĩ goap là phiên bản mới của các máy trạng thái cố gắng thiết lập trạng thái để đạt được mục tiêu. bạn chỉ cần xác định kịch bản nào đang xảy ra ở mọi tiểu bang.

ví dụ: bạn có một số kẻ thù AI ​​có các trạng thái tuần tra, rượt đuổi, tìm kiếm và tấn công. Bạn có thể chỉ cần viết một mã mà khi một trong những kẻ thù tìm thấy người chơi, tất cả sẽ thay đổi trạng thái để tấn công hoặc đuổi theo trạng thái. ví dụ khác bạn có kịch bản rằng trong trạng thái tấn công, một hoặc 2 kẻ thù phải tấn công người chơi và người khác phải hỗ trợ họ. Vì vậy, mọi kẻ thù đều kiểm tra xem có kẻ địch bên sườn hay một số điều kiện khác không (bạn chỉ có thể xác định một biến bool cho điều đó). nếu không, hãy đi bên cạnh đi hỗ trợ. tất cả phụ thuộc vào kịch bản và quy tắc bạn xác định.


Nhưng hãy tưởng tượng tình huống sau: agent1 muốn nói chuyện với agent2, agent2 đang thu thập một số gỗ Trong trường hợp này agent2 phải biết, rằng agent1 muốn nói chuyện với agent1 và agent1 phải biết nếu agent2 đang nói lại hoặc chỉ bỏ qua anh ta. Làm thế nào tôi đạt được điều này?
James

Tôi đã thêm một ví dụ
james

0

Tôi không biết nếu bạn cố gắng đạt được sự kết hợp lỏng lẻo giữa các tác nhân, vì đó là cách tôi đã giải thích, dù sao đi nữa, đó sẽ là cách tiếp cận tốt nhất, bạn nên kiểm tra Mẫu quan sát , một hệ thống đăng ký sự kiện để tránh phụ thuộc. Bạn có thể sử dụng nó như thế này (Tôi sẽ cố gắng không biết ngôn ngữ):

public interface ILonelyObserver
{
    void ItsLonely();
}

public class Agent implements ILonelyObserver
{
    private static List<ILonelyObserver> observers;
    private bool busy;

    public static void IAmLonely()
    {
        for(int i = 0; i < observers.Count; i++)
        {
            observers.ItsLonely();
        }
    }

    public static void Subscribe()
    {
        if(observers == null) observers = new List<IObserver>();
        observers.Add(this);
    }

    public static void Unsubscribe()
    {
        if(observers != null) observers.Remove(this);
    }

    public void ItsLonely()
    {
        /// Do what it takes to make company...
    }

    public Agent()
    {
        Subscribe();
    }

    ~Agent()
    {
        Unsubscribe();
    }
}

Vì vậy, sẽ tùy thuộc vào bạn để tạo logic để đăng ký / hủy đăng ký khi đại lý bận và không thể tạo công ty.

Nếu bạn đã sử dụng C #, bạn nên kiểm tra các Đại biểu Sự kiện , đã triển khai mẫu đã nói ở trên.

Hy vọng nó cung cấp cho bạn một ý tưởng ít nhất.


0

Bạn sẽ phải A: sử dụng bước và đánh giá và B: bạn phải có nhiều mục tiêu với các ưu tiên.

Nếu Agent1 muốn X và Agent2 không bao giờ muốn X, họ không thể làm việc cùng nhau . Điều đó không thể xảy ra trong bất kỳ hệ thống nào . Để khắc phục điều này, bạn sẽ cần phải theo dõi nhiều mục tiêu. Bạn thậm chí có thể ưu tiên các mục tiêu dựa trên khoảng cách mà một người đã tiến tới chúng và mức độ dễ dàng thực hiện các mục tiêu khác . Trong kịch bản của bạn với các ưu tiên ngoài, điều này trở thành:

Tác nhân1: Thế giới Tác nhân 1: isLonely = true Mục tiêu: isLonely = false

Tác nhân kế hoạch1: AskAgent2ToTalk -> TalkToAgent2

Agent2 Worldstate Tác nhân 2: hasWood = false, isLonely = true

Mục tiêu: hasWood = true

Mục tiêu: isLonely = false

Đại lý kế hoạch2: GetAxe -> ChopWood -> MangWoodToSupply, AskAgent1ToTalk -> TalkToAgent1

Agent1 sau đó sẽ liên tục yêu cầu Agent2 nói chuyện cho đến khi nhận được một lời khẳng định, điều này sẽ xảy ra sau khi nó hoàn thành nhiệm vụ đầu tiên.

Thực hiện các bước hướng tới từng mục tiêu sẽ phải được đánh giá và trong khi chỉ có một mục tiêu thì đây không phải là vấn đề lớn, nhiều mục tiêu có khả năng làm chậm trò chơi của bạn.

Để giải quyết vấn đề này, bạn cần cây được tạo từ việc hoàn thành các nhiệm vụ có thể ẩn kiểm tra nhiều mục tiêu cùng một lúc, tăng tốc xử lý các quyết định.

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.