Perencanaan Aksi yang Berorientasi Sasaran dengan banyak Agen


8

Saya sedikit macet:

Saya mengimplementasikan AI dengan GOAP (Perencanaan Tindakan Berorientasi Tujuan, http://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf ) untuk permainan simulasi. Itu bekerja dengan baik.

Sekarang saya ingin agar agen dapat bekerja sama (mis. Melakukan tindakan bersama). Apa dalam hal ini AI-Design terbaik yang GoapActions menjaga sambungan longgar?

Haruskah mereka merencanakan bersama? (dalam hal ini apa "keadaan dunia"?) Atau haruskah mereka berbagi rencana mereka? semacam sistem pesan?

Contoh
Agent1: Worldstate Agent 1: isLonely = true
Goal Agent1: isLonely = false

Plan Agent1: AskAgent2ToTalk -> TalkToAgent2

Agent2 Worldstate Agent 2: hasWood = false
Goal hasWood = true

Plan Agent2: GetAxe -> ChopWood -> BringWoodToSupply

Bagaimana saya mendapatkan rasi bintang ini?

Paket Agent1: TalkToAgent2 Paket
Agent2: TalkToAgent1 -> GetAxe -> ChopWood -> BringWoodToSupply

Atau jika mereka berbicara dan salah satu agen diinterupsi (misalnya oleh musuh yang menyerang), agen lain harus tahu bahwa Tindakan TalktoAgent2-nya telah berakhir.

Jawaban:


1

Saya sangat menyarankan Anda tidak menggunakan perencanaan kegiatan. Sangat sulit untuk memperluas, mendesain, dan memperbaiki bug. Kami meninggalkan perencanaan tugas sangat awal di DwarfCorp karena terlalu rumit untuk dengan cepat mendesain perilaku baru. Tetapi jika Anda harus, Anda harus menafsirkan ini sebagai masalah perencanaan multi-agen.

Salah satu cara untuk mencapai ini adalah melalui Perencanaan Heirarkis . Anda perlu membuat meta-agen untuk menetapkan subproblem ke agen tingkat bawah Anda. Agen meta, atau "Perencana Tugas" mencoba mencapai tujuan keseluruhan, dan menggunakan sub-agen di bawah kendalinya sebagai meta-aksi.

Misalnya, agen meta Anda mungkin memiliki tujuan "Bangun rumah". Ini memiliki tindakan "mengumpulkan kayu" yang dibutuhkan sebagai input agen dan lokasi untuk mengumpulkan kayu di. Itu kemudian dapat menetapkan agen yang berbeda untuk subtugas yang berbeda. Mungkin satu agen pergi dan mengumpulkan kayu sementara yang lain menggunakan kayu yang dikumpulkan untuk membangun rumah.

Mungkin ada tujuan lain, seperti "mengurangi kesepian". Tujuan-tujuan itu perlu dipesan berdasarkan prioritas sehingga mereka dapat saling menggantikan. Perencana tugas pusat memutuskan pada waktu tertentu apa tujuan yang paling penting, dan menugaskan agen untuk mereka menggunakan sub-tujuan yang berbeda. Ia mencari agen yang menganggur, mencari tahu apa subtugas terbaik untuk ditugaskan ke agen, dan kemudian menempatkan mereka pada kasing.


Apa untuk Sistem perencanaan yang Anda gunakan di dwarfCrop? Sistem perencanaan hierarkis memiliki masalah: bagaimana Anda menemukan 'kehendak bebas' seorang agen? agen tidak harus selalu melakukan apa yang diminta 'agen meta'.
james

1
Jadi agen meta mengatakan, "Ini adalah tugas yang saya ingin Anda lakukan." Agen itu juga memiliki serangkaian preferensi seperti "Aku bosan" atau "Aku lapar". Ini bisa dimasukkan ke dalam antrian prioritas. Terkadang prioritas agen meta mengalahkan prioritas agen, di lain waktu agen menimpa agen meta.
mklingen

0

Saya pikir goap adalah versi baru dari mesin negara yang mencoba mengatur status untuk mencapai tujuan. Anda hanya perlu menentukan skenario mana yang terjadi di setiap negara.

misalnya Anda memiliki beberapa musuh AI yang memiliki status patroli, kejar, kejar, dan serang. Anda cukup menulis kode bahwa ketika salah satu musuh menemukan pemain, semuanya akan berubah status untuk menyerang atau mengejar status. contoh lain Anda memiliki skenario bahwa dalam keadaan serangan, satu atau 2 musuh harus mengapit pemain dan yang lainnya harus mendukung mereka. jadi setiap musuh memeriksa apakah ada musuh yang mengapit atau kondisi lain (Anda bisa mendefinisikan variabel bool untuk itu). jika tidak ada, pergi sisi lain pergi dukungan. semua tergantung pada skenario dan aturan yang Anda tetapkan.


Tapi bayangkan situasi berikut ini: agen1 suka berbicara dengan agent2, agent2 mengumpulkan kayu. Dalam hal ini agent2 harus tahu, bahwa agent1 suka berbicara dengan agent1 dan agent1 harus tahu apakah agent2 berbicara kembali atau hanya mengabaikannya. bagaimana saya mencapai ini?
james

Saya menambahkan contoh
james

0

Saya tidak tahu apakah Anda mencoba untuk mencapai hubungan longgar antara agen, karena itulah yang saya tafsirkan, bagaimanapun, itu akan menjadi pendekatan terbaik, Anda harus memeriksa Pola Pengamat , yang merupakan sistem berlangganan acara yang menghindari ketergantungan. Anda dapat menggunakannya seperti ini (saya akan mencoba menjadi agnostik bahasa):

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();
    }
}

Jadi terserah kepada Anda untuk membuat logika untuk berlangganan / berhenti berlangganan ketika agen sedang sibuk dan tidak dapat membuat perusahaan.

Jika Anda menggunakan C #, Anda harus memeriksa Delegasi Peristiwa , yang sudah menerapkan pola yang disebutkan di atas.

Semoga ini memberi Anda ide setidaknya.


0

Anda harus A: menggunakan langkah dan menilai dan B: Anda harus memiliki banyak tujuan dengan prioritas.

Jika Agent1 menginginkan X dan Agent2 tidak pernah menginginkan X, mereka tidak dapat bekerja bersama . Itu tidak dapat terjadi dalam sistem apa pun . Untuk memperbaiki ini, Anda harus memiliki beberapa tujuan dilacak. Anda bahkan dapat memprioritaskan tujuan berdasarkan seberapa jauh seseorang telah maju ke arah mereka dan seberapa mudah tujuan lain dapat dicapai . Dalam skenario Anda tanpa prioritas, ini menjadi:

Agent1: Worldstate Agent 1: isLonely = true Goal: isLonely = false

Plan Agent1: AskAgent2ToTalk -> TalkToAgent2

Agent2 Worldstate Agent 2: hasWood = false, isLonely = true

Sasaran: hasWood = true

Sasaran: isLonely = false

Plan Agent2: GetAxe -> ChopWood -> BringWoodToSupply, AskAgent1ToTalk -> TalkToAgent1

Agent1 kemudian akan terus meminta Agent2 untuk berbicara sampai mendapat persetujuan, yang akan terjadi setelah menyelesaikan tugas pertamanya.

Mengambil langkah-langkah menuju setiap tujuan harus dievaluasi, dan sementara dengan hanya satu tujuan ini bukan masalah besar, lebih banyak tujuan berpotensi memperlambat permainan Anda.

Untuk mengatasi masalah ini, Anda memerlukan pohon yang dihasilkan dari menyelesaikan tugas yang mungkin menyembunyikan memeriksa beberapa tujuan sekaligus, mempercepat pemrosesan keputusan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.