Saat ini saya sedang mengembangkan sistem GOAP di Jawa. Penjelasan tentang GOAP dapat ditemukan di http://web.media.mit.edu/~jorkin/goap.html . Pada dasarnya, ini menggunakan A * untuk memplot antara Aksi yang mengubah negara dunia.
Untuk memberikan kesempatan yang adil bagi semua Tindakan dan Sasaran untuk dieksekusi, saya menggunakan fungsi heuristik untuk memperkirakan biaya melakukan sesuatu. Apa cara terbaik untuk memperkirakan biaya ini sehingga sebanding dengan semua biaya lainnya?
Sebagai contoh, memperkirakan biaya melarikan diri dari musuh versus menyerang - bagaimana seharusnya biaya dihitung agar sebanding?
java
ai
path-finding
dinding penuh
sumber
sumber
Jawaban:
Untuk membuat semua biaya sebanding, Anda hanya perlu menggunakan heuristik yang sama untuk semua tindakan. Misalnya, semua tindakan memiliki daftar hasil potensial dan semua hasil memiliki nilai tertentu bagi entitas.
Misalnya, ada kolam yang dalam dengan air, dan entitas itu haus. Jadi kami melihat aksi yang tersedia untuk memenuhi kebutuhan itu:
Pertama, prioritas entitas yang terkait dengan tempat-tempat ini, Anda dapat menyebutnya sebagai pengubah. Beberapa di antaranya akan berubah seiring waktu dan bergantung pada entitas. Misalnya, semut mungkin tidak terlalu khawatir tentang tetap hidup dan lebih banyak tentang masalah koloni. Atau jika suatu entitas telah pergi beberapa saat tanpa minum, prioritas kehausan yang memuaskan dapat mengalahkan yang lain.
Prioritas entitas :
Puas haus: 40
Tetap kering: 10
Tetap hidup: 100
Lalu apa yang dilambangkan oleh lokasi:
Lokasi :
Tindakan Kolam : Kumpulkan air
* Hasil potensial: * :
Puas haus - (-95) Hujan
- 10
Tenggelam - 1
Jadi kita bisa menghitung biaya tindakan di: (40 * -95) + (10 * 10) + (100 * 1) = -3600
Di mana pengumpulan air dari sungai yang mengamuk mungkin terlihat seperti:
Lokasi : Sungai amukan
Aksi : Kumpulkan air
* Hasil potensial: * :
Puas haus - (-95) Hujan
- 90
Tenggelam - 60
(40 * -95) + (10 * 90) + (100 * 60) = 3100
Jadi jelas merupakan pilihan yang lebih baik untuk mengambil air dari kolam. Mungkin jika sungai mengamuk adalah satu-satunya pilihan entitas akan menunggu sampai prioritas haus memuaskan pergi sangat tinggi sebelum mencoba sungai.
Anda mungkin ingin membuat hal-hal yang jauh lebih sederhana dimulai. Hanya memiliki beberapa variabel yang dapat diterapkan secara lebih global. Seperti tetap hidup, memuaskan kebutuhan. Dalam contoh pertarungan atau penerbangan Anda, Anda harus memberikan peringkat pertempuran kepada setiap entitas, sehingga mereka dapat secara efektif memberi peringkat diri terhadap entitas lain untuk tujuan skor.
sumber
Saya tahu, saya tahu, sudah cukup lama.
Memang, dalam GOAP seperti yang diterapkan pada 2005 oleh Jeff Orkin di FEAR (dan digunakan kembali dalam sekuel, ekstensi, dan ... Shadow Of Mordor), tindakan memiliki biaya tetap, mulai dari 0,5 hingga 8. Secara umum, biaya menyerang jauh lebih mahal dari pada biaya bertahan. Biaya-biaya ini dapat diakses dalam database game Free FEAR SDK (2008); di sini mereka:
{{Animate, 1}, {Attack, 6}, {AttackBurstLimited, 5}, {AttackCrouch, 5}, {AttackFromAmbush, 4}, {AttackFromArmored, 4}, {AttackFromArmoredBounded, 4}, {AttackFromCover, 4}, { AttackFromVehicle, 1}, {AttackFromView, 4.5}, {AttackGrenadeFromCover, 2}, {AttackLunge3D, 1}, {AttackLungeMelee, 1}, {AttackLungeSuicide, 1}, {AttackLungeUncloaked, 1}, {AttackMelee, 3}, {AttackMeleeLong 1}, {AttackMeleeUncloaked, 3}, {AttackReady, 7}, {AttackTurret, 6}, {AttackTurretCeiling, 6}, {BlindFireFromCover, 2}, {Mengisi, 1}, {DeathOnVehicle, 1}, {DismountNodeUncloaked, 1} , {DismountVehicle, 1}, {DodgeCovered, 1}, {DodgeOnVehicle, 1}, {DodgeRoll, 2}, {DodgeRollParanoid, 2}, {DodgeShuffle, 3}, {DrawWeapon, 1}, {EscapeDanger, 0,5}, { FaceNode, 1}, {FlushOutWithGrenade, 3}, {Follow, 3}, {FollowHeavyArmor, 2}, {FollowPlayer, 2}, {FollowPlayerFidget, 1,8},{FollowWaitAtNode, 4}, {GetOutOfTheWay, 1}, {GotoNode, 1}, {GotoNode3D, 1}, {GotoNodeOfType, 1}, {GotoNodeOfType, 1}, {GotoTarget3D, 4}, {Target} , 8}, {GotoValidPosition, 1}, {HolsterWeapon, 1}, {Idle, 2}, {IdleFidget, 1}, {IdleOnVehicle, 1}, {IdleTurret, 2}, {InspectDisturbance, 2}, {InstantDeath, 1} }, {InstantDeathKnockDown, 1}, {KnockDownBullet, 2}, {KnockDownExplosive, 2}, {KnockDownMelee, 2}, {LongRecoilBullet, 3}, {LongRecoilExplosive, 3}, {LongRecoilHelmetPiercing, 3}, {Long, {LookAtDisturbance, 1.5}, {LookAtDisturbanceFromView, 3}, {LopeToTargetUncloaked, 1}, {MountNodeUncloaked, 1}, {MountVehicle, 1}, {ReactToDanger, 1}, {Reload, 5}, {ReloadCovered, 1} , 5}, {ShortRecoilMelee, 4}, {Stunned, 1}, {SuppressionFire, 2}, {SuppressionFireFromCover, 1}, {SurveyArea, 1},{TraverseBlockedDoor, 1}, {TraverseLink, 2}, {TraverseLinkUncloaked, 1}, {Uncover, 1}, {UseSmartObjectNode, 3}, {UseSmartObjectNodeMounted, 1}}
Tapi itu tidak terjadi di semua implementasi GOAP dan, misalnya, Tomb Raiders memiliki biaya variabel (misalnya jarak untuk tindakan Goto).
Tindakan juga memiliki prasyarat dan beberapa tindakan harus dimainkan meskipun arsitektur GOAP (mis. Memainkan animasi "terpana" dalam reaksi dengan cepat menurunkan kesehatan - terlepas dari Sasaran "Bunuh Musuh" dan rencana yang dikembalikan GOAP untuk memenuhi Sasaran itu). Dalam contoh Anda, yaitu melarikan diri vs menyerang, tingkat kesehatan dapat menjadi prasyarat (dan tidak perlu memiliki biaya variabel).
Atau fungsi anggota Check_Costs () dijalankan sebelum hal lain, berdasarkan prioritas Michael, dan mengembalikan biaya dinamis.
Sekarang, harap dicatat bahwa dalam pengembang game Shadow Of Mordor mencoba untuk bermain dengan biaya tindakan untuk mempengaruhi apa yang akan dieksekusi di layar. Ternyata itu tidak mudah dan bahkan tindakan murah tidak muncul begitu sering: AI dalam permainan mendukung pemain; jika pemain tidak melakukan apa yang diharapkan, AI hanya akan mendukung itu dan ... apa yang akan muncul di layar tidak akan seperti apa yang diharapkan desain game.
sumber