Menggunakan jaringan saraf multi-layer untuk menghindari rintangan dalam game

Menemukan cara untuk menghindari rintangan dalam gim adalah tugas klasik yang harus dihadapi semua pengembang gim. Ada sejumlah algoritma terkenal dengan berbagai tingkat efisiensi. Semuanya, pada tingkat tertentu, menganalisis posisi relatif dari penghalang dan pemain, dan berdasarkan hasil, satu atau lain keputusan untuk bergerak diambil. Saya mencoba menggunakan jaringan saraf terlatih untuk memecahkan masalah penghindaran kendala. Saya ingin berbagi pengalaman dalam menerapkan pendekatan ini di Unity3D dalam artikel singkat ini.


Konsep


Medan berdasarkan standar Medan digunakan sebagai ruang permainan. Tabrakan dengan permukaan tidak dipertimbangkan dalam artikel ini. Setiap model dilengkapi dengan set colliders, seakurat mungkin menggambarkan geometri hambatan. Model, yang harus melewati rintangan, memiliki empat



sensor tabrakan (dalam tangkapan layar, lokasi dan jarak sensor ditunjukkan oleh garis pirus). Intinya, sensor adalah reykast, yang masing-masing melewati jarak ke objek tumbukan dalam algoritma analisis. Jarak bervariasi dari 0 (objek terletak sedekat mungkin) ke 1 (tidak ada tabrakan, arah ini bebas dari rintangan).
Secara umum, pekerjaan algoritme penghindaran rintangan adalah sebagai berikut:


  1. Empat nilai dari sensor tabrakan diumpankan ke empat input dari jaringan saraf yang terlatih
  2. Keadaan jaringan saraf dihitung. Pada output, kami mendapatkan tiga nilai:
    a. Kekuatan rotasi model berlawanan arah jarum jam (mengambil nilai dari 0 hingga 1)
    b. Kekuatan rotasi model searah jarum jam (mengambil nilai dari 0 hingga 1)
    c. Akselerasi Pengereman (mengambil nilai dari 0 hingga 1)
  3. Upaya diterapkan pada model dengan koefisien yang sesuai.

Implementasi


Sejujurnya, saya tidak tahu apakah akan ada sesuatu dari usaha ini. Pertama-tama, saya menerapkan kelas neuroNet di Unity. Saya tidak akan membahas kode kelas, karena ini adalah perceptron multilayer klasik. Dalam prosesnya, pertanyaan segera muncul dari jumlah lapisan jaringan. Berapa banyak dari mereka diperlukan untuk menyediakan kapasitas yang diperlukan di satu sisi, dan kecepatan perhitungan yang dapat diterima di sisi lain? Setelah serangkaian percobaan, saya memilih dua belas lapisan (tiga kondisi dasar untuk empat input).


Selanjutnya, perlu untuk menerapkan proses pelatihan jaringan saraf. Untuk melakukan ini, saya harus membuat aplikasi terpisah yang menggunakan kelas neuroNet yang sama. Dan sekarang masalah data untuk pelatihan telah meningkat secara maksimal. Awalnya, saya ingin menggunakan nilai yang diperoleh langsung dari aplikasi game. Untuk melakukan ini, saya mengatur pencatatan data dari sensor, sehingga di masa depan untuk setiap set nilai dari empat sensor untuk menunjukkan kepada program pelatihan nilai-nilai output yang benar. Tetapi, melihat hasilnya, saya menjadi putus asa. Faktanya adalah bahwa itu tidak cukup untuk menunjukkan nilai yang memadai untuk setiap set dari empat nilai sensor, nilai-nilai ini harus konsisten. Ini sangat penting untuk keberhasilan pelatihan jaringan saraf. Selain itu, tidak ada jaminan bahwa sampel yang dihasilkan mewakili semua situasi yang mungkin.


Solusi alternatif adalah tabel opsi-opsi dasar yang disusun secara manual untuk nilai-nilai sensor dan output. Pilihan dasar diambil nilai: 0,01 - rintangan dekat, 0,5 - hambatan setengah, 1 - arahnya gratis. Ini telah mengurangi ukuran sampel pelatihan.


  Sensor 1 
  Sensor 2 
  Sensor 3 
  Sensor 4 
Rotasi searah jarum jamRotasi berlawanan arah jarum jamPengereman
0,010,010,010,010,010,010,01
0,010,010,010,50,010,010,01
0,010,010,010,9990,010,010,01
0,010,010,50,010,9990,010,01
0,010,010,50,50,9990,010,01
0,010,010,50,9990,9990,010,5
0,010,010,9990,010,9990,010,5
0,010,010,9990,50,9990,010,999
0,010,010,9990,9990,9990,010,999

Tabel menunjukkan sebagian kecil dari sampel pelatihan (total dalam tabel 81-a row). Hasil akhir dari program pelatihan adalah tabel pembobotan, yang disimpan dalam file terpisah.


Hasil


Dalam mengantisipasi menggosok tangan saya, saya mengatur pemuatan peluang ke dalam game demo dan memulai prosesnya. Tapi, ternyata, saya jelas tidak cukup untuk kasus ini. Sejak awal, model yang diuji berputar, berlari ke semua hambatan berturut-turut, seperti anak kucing buta. Secara umum, hasilnya sangat-begitu-begitu saja. Saya harus mempelajari masalah ini. Sumber perilaku tak berdaya ditemukan cukup cepat. Dengan respons yang secara umum benar dari jaringan saraf terhadap pembacaan sensor, tindakan kontrol yang ditransmisikan ternyata terlalu kuat.


Setelah menyelesaikan masalah ini, saya menemui kesulitan baru - sensor jarak reykast. Dengan jarak yang jauh mendeteksi gangguan, model melakukan manuver prematur, yang mengakibatkan distorsi rute yang signifikan (dan bahkan dalam tabrakan tak terduga dalam rintangan yang tampaknya sudah melewati rintangan). Jarak kecil mengarah pada satu hal - "menempel" model yang tidak berdaya ke semua hambatan dengan jelas tidak ada waktu untuk menanggapi.


Semakin saya mengutak-atik model permainan demo, mencoba mengajarkannya untuk menghindari rintangan, semakin saya merasa bukan pemrograman, tetapi mencoba mengajar anak saya untuk berjalan. Dan itu adalah sensasi yang tidak biasa! Jauh lebih menyenangkan melihat upaya saya membawa hasil nyata. Pada akhirnya, kapal melayang yang malang melayang di atas permukaan mulai dengan percaya diri mengelilingi struktur yang timbul pada rute. Tes nyata untuk algoritma dimulai ketika saya secara sadar mencoba mendorong model ke jalan buntu. Di sini diperlukan untuk mengubah logika kerja dengan akselerasi pengereman, untuk membuat beberapa koreksi pada sampel pelatihan. Mari kita lihat contoh-contoh praktis tentang apa yang terjadi sebagai akibatnya.


1. Bypass sederhana dari satu hambatan



Seperti yang Anda lihat, memotong tidak menyebabkan kesulitan.


2. Dua rintangan (opsi 1)



Model itu dengan mudah menemukan lorong di antara kedua bangunan itu. Tugas yang mudah.


3. Dua rintangan (opsi 2)



Bangunan lebih dekat, tetapi modelnya menemukan lorong.


4. Dua rintangan (opsi 3)



Opsi ini lebih rumit, tetapi masih diselesaikan.


5. Tiga rintangan



Masalahnya diselesaikan dengan cukup cepat.


6. Jalan Buntu



Di sini model punya masalah. 30 detik pertama dari video menunjukkan bahwa model mengapung tanpa daya dalam konfigurasi bangunan sederhana. Masalahnya di sini kemungkinan besar tidak terletak pada model jaringan saraf seperti pada algoritma utama untuk bergerak di sepanjang rute - ia terus berusaha mendapatkan kapal kembali ke jalurnya, meskipun upaya putus asa untuk menghindari tabrakan.


Setelah beberapa kali gagal dalam situasi ini dengan parameter yang berbeda, saya berhasil mendapatkan hasil yang positif. Dari detik ketiga puluh video, Anda dapat mengamati bagaimana model dengan peningkatan jarak sensor dan dengan gaya pengereman yang lebih kuat dipilih dari jalan buntu. Untuk ini dia membutuhkan waktu hampir lima menit (saya memotong siksaan dan hanya menyisakan 30 detik terakhir dari video). Tidak mungkin bahwa dalam game nyata ini akan dianggap sebagai hasil yang baik, jadi jelas ada ruang untuk perbaikan algoritma.


Kesimpulan


Secara umum, masalah terpecahkan. Seberapa efektif solusi ini merupakan pertanyaan terbuka, dan diperlukan lebih banyak penelitian. Misalnya, tidak diketahui bagaimana model akan berperilaku ketika hambatan dinamis (objek bergerak lainnya) muncul. Masalah lain adalah kurangnya sensor tabrakan yang mengarah ke belakang, yang menyebabkan kesulitan dalam menghindari hambatan yang kompleks.


Perkembangan lebih lanjut yang jelas dari gagasan algoritma penghindaran hambatan jaringan saraf terlihat dalam pengenalan pelatihan. Untuk melakukan ini, penilaian hasil keputusan yang dibuat harus diperkenalkan, dan dengan koreksi selanjutnya tanpa perubahan signifikan pada posisi objek, penilaian harus menurun. Setelah mencapai nilai tertentu, model harus masuk ke mode pelatihan dan, katakanlah, secara acak mengubah keputusan yang diambil untuk menemukan jalan keluar.


Fitur lain dari model bagi saya adalah variabilitas pelatihan awal. Ini memungkinkan, misalnya, untuk memiliki beberapa perilaku untuk model yang berbeda tanpa perlu memprogram masing-masing secara terpisah. Dengan kata lain, jika kita memiliki, katakanlah, tangki berat dan pengintaian ringan, cara mereka menghindari rintangan bisa sangat bervariasi. Untuk mencapai efek ini, kami menggunakan perceptron yang sama, tetapi dilatih pada sampel yang berbeda.

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


All Articles