Kelanjutan partisipasi (dan kemenangan) di Piala AI Rusia 2019

Halo semuanya, nama saya Andrey Tokarev , dan sekali lagi saya ingin berbagi pengalaman saya tentang partisipasi dan kemenangan di Piala AI Rusia.

Jika ada yang tidak tahu, Piala AI Rusia (selanjutnya RAIK) adalah kejuaraan pemrograman kecerdasan buatan di mana kami (atau lebih tepatnya program kami) harus mengelola satu atau lebih karakter (unit) yang saling bersaing. Tahun ini gim ini adalah platformer 2 dimensi, mengingatkan pada gim komputer pada awal tahun 90-an, dan unitnya adalah orang-orang bersenjata yang seharusnya membunuh orang yang sama dengan musuh. Anda dapat membaca lebih lanjut tentang ini di pengumuman.



Kali ini tidak ada pertemuan ketika agenda datang untuk memulai RAIK, jadi mari kita langsung ke intinya.


Pandangan pertama


Jadi, saya menjalankan aturan, mencoba permainan. Kesan pertama adalah - apa yang harus dilakukan di sini? Karena unit tidak memiliki inersia, dan level awal tanpa siklus tertutup, musuh selalu dapat menempel pada kita jika dia mau, dan mempertahankan diri terhadap ini tidak mungkin. Dan dalam situasi ini, Anda mengerti, kemungkinannya sangat terbatas. Anda tidak akan menghindari peluru. Tapi ketakutan pertama saya tidak terwujud, meskipun faktor peluangnya tinggi, aturannya ternyata bisa dimainkan.

Saya tidak segera mulai berkembang, beberapa hari menjadi bodohmemutuskan untuk mencerminkan. Saya tidak datang dengan sesuatu yang istimewa. Jelas bahwa Anda perlu menghindari peluru, mengejar kit pertolongan pertama, dan jika mungkin, jangan biarkan musuh mengambil kit pertolongan pertama dan semua itu. Masih ada beberapa rencana samar untuk menemukan posisi yang menguntungkan secara strategis, dan berputar di sekitar mereka, tetapi tidak sepenuhnya jelas bagaimana membedakan posisi ini.

Mulailah


Jadi di sini kita mulai. Karena kebiasaan, saya mengubah objek data dalam paket bahasa menjadi struktur data saya sendiri. Ya, itu membutuhkan waktu, tetapi tidak terlalu banyak, tetapi saya mendapatkan lebih banyak fleksibilitas, bekerja di lingkungan yang lebih akrab, dan sementara saya berkonversi, lebih baik untuk mulai memahami bagaimana dunia game bekerja. Tentu saja, tidak sekaligus, tetapi sesuai kebutuhan. Sebagai contoh, saya tidak menciptakan kembali tambang sampai situasi politik di kejuaraan memaksa saya untuk mengambil langkah-langkah ekstrem. Saya kira-kira menyalin logika Smartgayev, hanya menambahkan tanda centang untuk keberadaan dinding antara saya dan musuh. Saya melihat, mereka tampaknya berjalan dengan baik, sehingga kita dapat berasumsi bahwa kita memiliki dunia game.

Simulasi


Sekarang kita lanjutkan ke hiburan paling favorit dari semua peserta RAIK: kami sedang menulis simulasi! Setelah membaca obrolan kejuaraan, menjadi jelas bahwa menulis simulasi yang akurat itu buruk. Jadi saya langsung mendapat skor untuk akurasi. Ternyata, seperti yang terjadi, bahkan dengan lompatan sederhana dari langit-langit, ada perbedaan dalam jati. Tentu saja mungkin untuk mengotak-atiknya selama beberapa hari dan secara signifikan meningkatkan akurasi, tetapi, pertama, tidak diketahui berapa untungnya dari ini. Kedua, saya terlalu tidak sabar, dan seperti biasa saya ingin melihat hasilnya secepat mungkin. Jadi saya memutuskan untuk mulai menulis strategi itu sendiri, dan saya pikir saya akan memperbaiki kurva simulasi saya, kemudian, jika perlu. Kalau dipikir-pikir, saya harus mengatakan bahwa mungkin saya salah.
Akan bermanfaat untuk segera membuat simulasi menjadi normal, dan karena itu perlu untuk membuat koreksi di sana sampai akhir kejuaraan, dan masih tetap bengkok.

Dasar strategi


Kemudian kami melanjutkan sesuai dengan skenario standar: kami menghasilkan urutan aksi robot unit, mensimulasikan perubahan di dunia game dan mengirimkan semuanya ke input fungsi evaluasi (OF). Jika dalam sepakbola (turnamen tahun lalu) itu tidak efektif untuk mengejar bola dengan jumlah pemain acak yang lengkap (terlalu sedikit peluang untuk memukul bola, terutama dari sudut kanan), maka tidak ada masalah seperti itu. Pada dasarnya, kita membutuhkan simulasi untuk dua hal: menghindari peluru dan menemukan jalannya. Beberapa skenario tindakan acak sudah cukup untuk menghindari peluru. Beberapa lusinan skenario juga akan berfungsi untuk mencari cara yang kurang lebih, setidaknya, pada peta yang tidak terlalu sulit.

Ngomong-ngomong, pencarian jalan - jelas bahwa menghitung sampai akhir tidak selalu memungkinkan, jadi Anda harus dapat menentukan jarak. Dengan menggunakan simulasi yang sama, seseorang dapat lebih atau kurang akurat menghitung jarak dalam waktu. Tapi di sini saya juga menyederhanakannya, hanya menghitung jarak di sepanjang kotak persegi panjang. Penyederhanaan ini, tentu saja, memiliki beberapa konsekuensi pada peta yang kompleks. Terkadang unit saya masih bingung dalam mencari senjata, sementara musuh sudah mulai menembak. Benar, insiden ini cukup langka.

Pilihan sasarannya cukup sederhana: sementara tidak ada senjata, kita pergi ke senjata, jika ada senjata, kita pergi ke musuh, dan jika ada sedikit "kesehatan", kita pergi ke lemari obat. Dalam kasus kotak P3K dan senjata, benda-benda yang lebih dekat dengan musuh sebagai sasaran dikeluarkan. Untuk beberapa alasan, prioritas senjata bagi saya adalah yang pertama di mesin.

Fungsi evaluasi pertama terdiri dari dua komponen: itu adalah kesehatan (bukan milikku, tapi unit) dengan koefisien besar, dan jarak ke target dengan koefisien kecil.
Itu rute dipilih di mana ia tidak jatuh di bawah peluru, tetapi pada saat yang sama mendekati target secepat mungkin. Penting untuk mengingat rute terbaik yang ditemukan untuk kutu berikutnya, jika tidak suatu situasi dapat muncul ketika kita menemukan pilihan yang baik, tetapi tidak memberikannya pada kutu berikutnya.

Kami pergi ke depan, dan perbaikan pertama


Melihat pertempuran, itu jelas bahwa jika musuh memiliki dodge yang normal, maka hampir mustahil untuk masuk ke dia dari jarak jauh. Ini buang-buang peluru. Jadi saya menambahkan kondisi sederhana untuk menembak: tembak hanya jika musuh lebih dekat dari 7 meter. Selain itu, jika jaraknya sangat besar, maka layak untuk diisi ulang, bahkan jika hanya satu peluru yang hilang dalam klip. Dua kondisi sederhana ini ditambahkan sedikit.

Ini adalah versi pertama yang saya kirim. Pada hari yang sama, saya menyadari bahwa pistol lebih menguntungkan daripada senapan mesin. Plus, ia menambahkan ke OB jarak lain ke musuh, kalau-kalau tembakan tidak segera. Karena itu, ketika memuat ulang, ia berusaha menjaga jarak.

Awal mulanya cukup sukses. Saya tidak ingat seberapa tinggi strategi berhasil naik peringkat sebelum reset (sekitar tiga-lima pertama), dan setelah reset itu dengan percaya diri naik.

Peningkatan utama dalam versi berikutnya adalah karena upaya untuk mengendalikan peralatan P3K. Di sini sekali lagi, semuanya sederhana: jarak dari kotak P3K ke saya dan musuh dihitung, dan jika mereka kira-kira sama, maka diyakini bahwa kotak P3K menarik, dan dengan demikian, orang yang lebih dekat dengannya. Ini diperhitungkan oleh fungsi evaluasi. Itu secara teori, unit mencoba memposisikan dirinya untuk mengaburkan sebanyak mungkin peralatan P3K. Secara teori, tentu saja, tetapi tidak dalam praktik.

Setelah itu, saya tidak mengirim pembaruan untuk waktu yang lama. Yang mengejutkan saya, strategi pertama mencapai tempat 1, dan kemudian masih keluar dengan 100 poin. Mungkin semua orang berpikir bahwa saya memotong sesuatu yang keren, dan saya terkejut bagaimana strategi yang buruk ini melonjak. Menyedihkan, karena, well, ada kontrol yang ceroboh dari peralatan P3K, ada dua jika untuk pemotretan, tetapi pada dasarnya ini adalah penghindaran dan gerakan sederhana berdasarkan kurva simulasi.

Pengujian


Saya ingin membicarakan ini secara terpisah, karena pengujian yang tepat adalah bagian yang sangat penting dari pengembangan, dan banyak peserta tampaknya mengabaikan aspek ini. Kecelakaan secara intuitif disalahpahami oleh orang-orang.

Misalkan kita menjalankan tes dan setelah 40 pertandingan kita melihat skor 27:13 untuk yang baru. Itu saja, kami menemukan Grail, hentikan tes dan terima perubahannya. Bahkan, bahkan dengan kekuatan yang sama, ada sekitar 2% kemungkinan dari situasi seperti itu.

Contoh lain, kami meluncurkan 100 game dan menerima perubahan jika skornya 55:45 atau lebih. Dengan probabilitas 2,8%, versi yang benar-benar bisa kalah dengan skor yang sama bisa dimainkan dengan cara ini. Beberapa persen kesalahan mungkin tidak tampak sangat besar, tetapi jika 90% dari perubahan kami tidak berhasil, maka ini berarti setiap perubahan ke-4 yang diterima tidak akan berhasil. Jadi, bahkan 100 game masih merupakan tes biasa-biasa saja, tetapi kurang - tidak ada sama sekali.

Tentu saja, meluncurkan beberapa ratus game bisa menghabiskan banyak waktu. Ada berbagai pilihan, Anda dapat menjalankan tes di malam hari, mengemudi di latar belakang, menyewa waktu server, atau membuat strategi cepat :) Versi pertama saya bekerja rata-rata, di suatu tempat, selama 5 detik. ke permainan, sangat beruntung dengan itu.

Jika strateginya lambat, maka Anda dapat mengendarai versi terpotong secara lokal - lebih sedikit pencarian, lebih sedikit kutu mikro, misalnya. Saya menggunakan ini dalam sepakbola (RAIK sebelumnya), tidak ada masalah yang diperhatikan. Mungkin kualitasnya hilang di suatu tempat, tetapi, bagaimanapun, itu lebih menguntungkan daripada memeriksa perubahan pada 20 game.

Perangkat tambahan


Kali ini saya tidak akan mengevaluasi peningkatan angka. Pertama, mereka semua kecil (kurang dari 20%) dan karenanya tidak akurat. Kedua, ambigu, yaitu versi baru dengan percaya diri bisa mengalahkan yang sebelumnya, dan bermain lebih buruk melawan yang lain. Dan ketiga, saya hanya tidak mengingatnya.

  • , . , . , , .
  • . .. , , . , , -. , . , , . .
  • , , . , , , , , . , . , .
  • , ? , , . . , . .

-


Secara obyektif, Anda perlu menembak ke arah mana tikar. ekspektasi kerusakan tertinggi. Jelas bahwa secara analitis ini tidak dapat dihitung, dan di mana matematika tidak membantu, seperti yang kita tahu, simulasi menjadi penyelamatan. Kami menembak ke segala arah yang mungkin dan mencoba menghindari musuh dari setiap peluru secara individual. Untuk setiap kelompok kami menetapkan nilai kerusakan minimum yang akan diberikan secara tepat. Dalam kasus peluru konvensional, itu bisa 0 atau kerusakannya, dan dalam kasus roket ada 3 pilihan.

Sekarang kita tahu matras. mengharapkan kerusakan di setiap arah secara terpisah, dari sini kita dapat dengan mudah menghitung matras. tunggu setiap arah tembakan dan pilih yang terbaik. Akan lebih baik menggunakan fungsi ini dalam enumerasi sehingga unit diposisikan dengan benar, tetapi terlalu lambat untuk memanggilnya untuk setiap skenario. Itu disebut sekali per centang untuk setiap unit, dan sekarang penembakan itu dilakukan bukan oleh jarak, tetapi jika kerusakan yang diharapkan melebihi batas tertentu. Peningkatannya signifikan, dan dalam kasus bazooka itu terlihat cukup jelas - sekarang milikku bahkan bisa membidik suatu tempat di dinding untuk memukul musuh dengan gelombang ledakan.



Tetapi karena fakta bahwa saya tidak dapat memasukkan fungsi ini ke dalam pencarian, ada masalah bahwa kondisi untuk bidikan dalam pencarian dan pada kenyataannya berbeda. Saya tidak tahu bagaimana menyelesaikan masalah ini, saya harus hidup dengannya.

Setelah itu, tidak ada perubahan yang sangat signifikan sampai hari terakhir ketika saya memperkenalkan peledakan diri. Dia menambahkan penalti jika tidak ada lompatan yang tersisa pada saat musuh menembak, karena jatuh akan membuat lebih sulit untuk menghindar. Saya mencoba memprediksi jalur musuh ke kotak P3K, jika ia memiliki beberapa nyawa, dan dengan demikian sedikit meningkatkan kontrol terhadap mereka. Dia sendiri mulai mengejar kit pertolongan pertama dari 60% kesehatannya, bukannya 50%. Dia menambahkan jarak antara miliknya di PF sehingga mereka tidak akan saling mengganggu, dan bazoka tidak akan langsung melumpuhkan dua. Pada akhirnya, dia menambahkan mod agresif jika situasinya tidak berubah untuk waktu yang lama dan saya kehilangan poin, jika tidak, kadang-kadang milik saya macet.

hasil


Seperti yang saya katakan, cukup cepat sampai di peringkat pertama. Dengan pengecualian waktu yang singkat, saya tinggal di sana sampai akhir. Dalam putaran, situasinya sedikit lebih buruk: tempat ke-4 di tempat pertama, ke-3 di tempat kedua. Ini menunjukkan bahwa saya bermain bagus melawan pemain yang kuat, tetapi tidak cukup stabil melawan yang lemah. Ini cukup jelas ditunjukkan oleh salah satu game babak ke-2, di mana kostya200300, yang saat itu berada di tempat terakhir, mengalahkan saya pada 0!


Peledakan diri


Seperti kebanyakan peserta, saya tidak antusias tentang kemungkinan ledakan diri. Ini sangat meningkatkan faktor acak yang sudah cukup besar. Tetapi jelas bahwa seseorang tidak dapat melakukannya tanpanya. Benar, saya tidak benar-benar ingin melakukan ini, dan saya menundanya sampai hari terakhir. Teknik ini cukup sederhana, jika kita berdiri di tanah, musuh berada dalam radius ledakan dan kita memiliki cukup (maksimum dua) ranjau, maka kita menempatkan ranjau dan menembak di bagian bawah. Saya menempatkan kondisi tambahan bahwa setelah ledakan saya mendapatkan keuntungan yang jelas, yaitu. baik segera menang, atau membunuh lebih banyak lawan dari yang mereka miliki. Saya berpikir bahwa karena saya bercita-cita ke tempat yang tinggi, maka mengubah satu lawan satu tidak menguntungkan. Ya, seperti dalam catur, jika Anda bermain untuk menang, maka bertukar semuanya secara berturut-turut tidak menguntungkan. Ini adalah bagaimana saya mengirim prajurit saya yang memiliki keterampilan kamikaze ke pertempuran terakhir.

Akhir


Seperti yang sudah saya tulis, peringkat hanya berbicara tentang keseimbangan kekuatan dengan pesaing terdekat, dan saya tidak memiliki stabilitas terhadap pesaing yang lebih lemah. Dalam hal ini, tersingkirnya para peserta ke final memainkan kekacauan bagi saya. Di sisi lain, penyebaran besar-besaran ideologi teroris pada hari terakhir memperkenalkan penyebaran lebih lanjut dalam distribusi pasukan. Singkatnya, meskipun kepemimpinan percaya diri dalam peringkat, tidak ada kepercayaan diri di final, hanya ada harapan. Setelah paruh pertama final, menjadi jelas bahwa perjuangan utama adalah antara saya dan Ivan Tyamgin. Saya membawa sejumlah kecil poin, sementara sisanya jauh di belakang.

Selama istirahat, saya berlama-lamamengambil peledakan diri - sesuatu telah diperbaiki (ternyata ranjau tidak boleh diletakkan di atas tangga), ia menambahkan beberapa penanggulangan terhadap ledakan. Dan memperbaiki simulasi, karena sejauh ini tambang menempel di sudut.

Awal bagian kedua dari babak final berhasil bagi saya, celah mulai tumbuh perlahan dan mencapai maksimum sekitar 20 poin. Saya bahkan sedikit santai dan bukannya menyegarkan halaman hasil setiap 3 menit, saya mulai bermain catur di telepon. Ketika saya melihat lagi, jaraknya sudah sekitar 7 poin dan kemudian dengan cepat bergulir ke posisi 1. Aku ingin tahu apa yang mereka berikan untuk tempat ke-2? 1 jam sampai akhir, lagi-lagi ada celah. 30 menit, jaraknya dikurangi secara serempak. 10 menit - hanya 3 poin! Satu menit ... kemenangan sepertinya! Vanya kalah saya hanya 3 poin. Ini berada dalam sebaran acak. Sisanya 50 poin atau lebih di belakang.

Tentang bug lucu


Sudah setelah final, saya perhatikan bahwa dalam beberapa permainan unit saya berperilaku aneh - mereka tidak menghindari peluru ketika, tampaknya, mereka bisa, dan bahkan, seolah-olah, secara khusus menangkap mereka. Ternyata selama istirahat di final, saya membuat kesalahan - ketika ditentukan apakah musuh bisa meledakkan saya, perlu untuk menghitung milik saya yang berada dalam radius ledakan. Di sini saya mencampur koordinat unit saya sendiri dan unit lain dan secara keliru mengira bahwa ledakan itu akan terjadi di tempat saya, dan dengan demikian dijamin akan jatuh ke dalam radius ledakan. Ledakan nyata sudah dipertimbangkan dari titik yang tepat, jadi dalam simulasi musuh itu sendiri bisa meledak dariku. Biasanya itu hanya menambahkan konstanta besar ke estimasi, tetapi itu tidak benar-benar mempengaruhi apa pun. Namun, jika musuh tidak memiliki cukup ranjau untuk meledakkanku, ternyata menguntungkan bagiku untuk menangkap peluru.sehingga musuh sudah memiliki cukup ranjau, dan saya mendapat tambahan penilaian. Mungkin itu karena kurang tidur, atau kaleng bir yang mabuk, tetapi pada kenyataannya, kesalahan selalu terjadi.

Kesimpulan


Permainan ini, meskipun tidak se-spektakuler sepak bola, tidak kalah menarik dari sudut pandang strategi. Entri ambang batas relatif rendah, dan ini berdampak baik pada jumlah peserta. Saya menerima banyak emosi selama bulan kejuaraan, baik suka maupun duka, dan untuk ini saya berterima kasih kepada panitia. Saya juga berterima kasih kepada semua peserta, terutama Vanya Tyamgina, karena tidak membuat saya bosan di final.

All Articles