plug-in ml-agent untuk persatuan

Baru-baru ini, plugin ml-agen telah diperbarui. Bagi mereka yang tidak tahu, ini adalah plugin open source yang merupakan lingkungan bagi agen pelatihan dalam persatuan. Mereka dapat dilatih menggunakan pembelajaran penguatan, pembelajaran imitasi, neuroevolution, atau metode pembelajaran mesin lainnya menggunakan API Python. Ini juga menyediakan sejumlah algoritma modern (berdasarkan TensorSlow) yang memungkinkan Anda membuat NPC yang lebih cerdas untuk gim Anda.

Apa yang Anda butuhkan untuk mengimplementasikan pembelajaran mesin di Unity?


Unduh plugin ini di sini . Anda akan memerlukan folder kesatuan-lingkungan. Sebelum itu, buat proyek kosong. Di folder Aset, tambahkan konten folder Aset dengan kesatuan-lingkungan. Lakukan ini dengan ProjectSettings. Harap dicatat bahwa jika Anda menambahkan plugin ini ke proyek yang ada, pertama buat proyek kosong, ikuti langkah-langkah di atas dan buat paket (Aset-ExportPackage) dan kemudian impor saja ke proyek Anda yang sudah ada. Ini diperlukan agar Anda tidak kehilangan pengaturan ProjectSettings yang ada di proyek Anda.

Saya akan mendemonstrasikan implementasi pembelajaran mesin menggunakan contoh permainan sepak bola (adegan ini sudah ada dalam plugin). Ia memiliki dua tim, biru dan merah. Setiap tim memiliki striker dan kiper.


Mari kembali ke plugin itu sendiri. Agar dia dapat bekerja di atas panggung, kita membutuhkan setidaknya satu objek Akademi, Otak dan Agen. Skema interaksi dapat dilihat di bawah.



Objek Akademi dan anak perusahaannya GoalieBrain, StrikerBrain berada di atas panggung. Seperti yang dapat kita lihat dari diagram, setiap Akademi mungkin memiliki beberapa Otak, tetapi setiap Otak harus memiliki satu Akademi.

Agen - ini adalah objek permainan kami yang ingin kami latih.



Selanjutnya, buka kode. Kelas SoccerAcademy, yang ditambahkan ke GameObject Academy, diwarisi dari kelas Academy, sebelum itu Anda harus menambahkan namespace menggunakan MLAgents. Setelah itu, kita harus mengganti metode

public override void AcademyReset() { } public override void AcademyStep() { } 

Dan tambahkan tautan ke yang dibuat oleh Brain

 public Brain brainStriker; public Brain brainGoalie; 

Tambahkan komponen Brain ke GoalieBrain, StrikerBrain dan tetapkan mereka ke Academy



Kelas AgentSoccer mewarisi dari Soccer. Tambahkan ke setiap pemain dan tunjukkan Brain mana yang akan digunakan.



Dalam skrip AgentSoccer, kami menjelaskan logika para pemain. Dalam metode CollectObservations () yang diganti, kami menambahkan daftar sinar yang akan membantu pemain memantau dan merespons gameplay.

 public override void CollectObservations() { float rayDistance = 20f; float[] rayAngles = { 0f, 45f, 90f, 135f, 180f, 110f, 70f }; string[] detectableObjects; if (team == Team.red) { detectableObjects = new string[] { "ball", "redGoal", "blueGoal", "wall", "redAgent", "blueAgent" }; } else { detectableObjects = new string[] { "ball", "blueGoal", "redGoal", "wall", "blueAgent", "redAgent" }; } AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 0f, 0f)); AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 1f, 0f)); } 

Metode AgentAction yang ditimpa adalah analog dari Pembaruan. Di dalamnya, kami memanggil metode pindah dan mendistribusikan hadiah.

 public override void AgentAction(float[] vectorAction, string textAction) { // Existential penalty for strikers. if (agentRole == AgentRole.striker) { AddReward(-1f / 3000f); } // Existential bonus for goalies. if (agentRole == AgentRole.goalie) { AddReward(1f / 3000f); } MoveAgent(vectorAction); } 

Jika kami menyentuh bola, dorong

 void OnCollisionEnter(Collision c) { float force = 2000f * kickPower; if (c.gameObject.tag == "ball") { Vector3 dir = c.contacts[0].point - transform.position; dir = dir.normalized; c.gameObject.GetComponent<Rigidbody>().AddForce(dir * force); } } 

Setel ulang perintah saat sasaran selesai

 public override void AgentReset() { if (academy.randomizePlayersTeamForTraining) { ChooseRandomTeam(); } if (team == Team.red) { JoinRedTeam(agentRole); transform.rotation = Quaternion.Euler(0f, -90f, 0f); } else { JoinBlueTeam(agentRole); transform.rotation = Quaternion.Euler(0f, 90f, 0f); } transform.position = area.GetRandomSpawnPos(team.ToString(), agentRole.ToString()); agentRB.velocity = Vector3.zero; agentRB.angularVelocity = Vector3.zero; area.ResetBall(); } 

Opsi pelatihan


Anda dapat melatih agen dari editor persatuan, serta menggunakan TensorFlow . Sedangkan untuk persatuan, Anda perlu menentukan hukuman dan hadiah untuk setiap Otak di Akademi.



Ada baiknya juga menunjukkan Brain ke TypeBrain-nya dengan mengatur nilai ke Eksternal. Mereka juga datang dalam jenis berikut:

  • Eksternal - tempat pengambilan keputusan menggunakan API Python. Di sini, pengamatan dan penghargaan yang dihasilkan oleh Brain diarahkan ke API Python melalui komunikator eksternal. API Python kemudian mengembalikan tindakan yang tepat yang harus dilakukan agen.
  • Internal - di mana keputusan dibuat menggunakan model TensorFlow bawaan. Model TensorFlow bersarang mewakili kebijakan sains, dan Brain langsung menggunakan model ini untuk menentukan tindakan untuk setiap Agen.
  • Player - tempat pengambilan keputusan menggunakan keyboard atau input controller nyata. Di sini, pemain manusia mengendalikan Agen, dan pengamatan serta penghargaan yang dikumpulkan oleh Otak tidak digunakan untuk mengendalikan Agen.
  • Heuristik - di mana keputusan dibuat menggunakan perilaku kode keras. Ini mirip dengan bagaimana sebagian besar perilaku karakter saat ini didefinisikan dan dapat berguna untuk debugging atau membandingkan bagaimana Agen dengan aturan hard-code dibandingkan dengan Agen yang perilakunya telah dilatih.

Source: https://habr.com/ru/post/id416297/


All Articles