Kami menulis AI untuk Vindinium pada komputer papan tunggal. Bagian 2: logika keputusan

Serangkaian artikel tentang menulis AI untuk game online multipemain dari genre roguelike.


Bagian 1
Bagian 3


Pada bagian artikel ini, kami akan mempertimbangkan pendekatan untuk membuat logika untuk AI, berbicara sedikit tentang penetapan tujuan setiap bot yang patuh hukum, dan juga menentukan pilihan bahasa pemrograman dan menulis beberapa kode.


gambar


Vindinium Game World


Untuk membuat AI, Anda harus memahami struktur dunia game.


Terjemahan gratis dokumentasi permainan

Deskripsi


Vindinium adalah bagel berbasis giliran multipemain. Masing-masing dari empat pemain memiliki satu pahlawan yang dapat bergerak di sekitar peta. Tujuannya adalah agar pemain mengumpulkan jumlah emas maksimum dalam jumlah gerakan tertentu (setiap pemain membuat 300 gerakan per game, sehingga seluruh permainan terdiri dari 1200 gerakan). Pemain harus mengendalikan tambang emas untuk menghasilkan emas; Namun, tambang dilindungi oleh goblin. Ketika seorang pemain mengalahkan goblin, ia menjadi pemilik tambang dan menerima satu emas per giliran. Selain itu, goblin sekarang melindungi tambang dari pemain lain.


Pahlawan bisa saling bertarung. Seorang yang selamat dalam pertempuran memperoleh kendali atas semua tambang emas lawannya. Pahlawan yang terbunuh segera terlahir kembali dengan semua emasnya, namun, semua ranjau masuk ke tangan si pembunuh.


Menuju ke kedai minuman, para pahlawan dapat membeli bir untuk 2 unit emas, sehingga memulihkan poin kesehatan mereka.


Tujuannya adalah untuk membuat program komputer (bot) yang memainkan game Vindinium semurah mungkin. Anda disarankan untuk menggunakan salah satu starter kit untuk sejumlah besar bahasa pemrograman sebagai titik awal.


Peta


Peta dibuat secara acak. Setiap objek game di peta dikodekan menggunakan dua karakter. Contoh peta:


+----------------------------------------+ |######$- $-############$- $-######| |###### ## ## ######| |####[] #### #### []####| |## #### ## ## #### ##| |#### $- $- ####| |########## @1 @4 ##########| |############ #### #### ############| |$-##$- ############ $-##$-| | $- $-################$- $- | | ######################## | | ######################## | | $- $-################$- $- | |$-##$- ############ $-##$-| |############ #### #### ############| |########## @2 @3 ##########| |#### $- $- ####| |## #### ## ## #### ##| |####[] #### #### []####| |###### ## ## ######| |######$- $-############$- $-######| +----------------------------------------+ 

Legenda


## - Hutan Tak Tertahankan
@1 - Pahlawan pertama
[] - Makanan
$- - Tambang Emas (Diambil)
$1 - Tambang Emas (dimiliki oleh pahlawan pertama)


Peta yang dihasilkan simetris dan selalu berisi 4 bar dan 4 pahlawan.


Pahlawan


Pahlawan dapat memindahkan satu sel untuk setiap belokan dan memiliki indikator berikut:


  • Poin Kesehatan (HP): Setiap pemain "baru" mulai dengan nilai maksimum = 100. Jika HP turun ke nol, pahlawan mati (lihat bagian "Kematian Pahlawan").
  • Emas: mulai dari awal, ini adalah indikator keberhasilan pahlawan. Di akhir permainan, para pahlawan akan dievaluasi berdasarkan jumlah emas mereka.
  • Jumlah tambang emas.

Arah perjalanan


Bot harus mengeluarkan satu pesanan per giliran. Kemungkinan perintah: Stay ( Stay ), ( North ), ( South ), ( East ) atau ( West ). Segera setelah perintah dieksekusi, pahlawan tetap di tempatnya atau bergerak satu sel ke arah tertentu.


Pahlawan bergerak

Jika pahlawan:


  • Berusaha melampaui peta atau melewati pohon, tidak ada yang terjadi.
  • Memasuki tambang emas, tetap di tempatnya dan:
    • Jika tambang sudah menjadi milik pahlawan, tidak ada yang terjadi.
    • Jika tambang itu bukan tanah lelaki atau milik pahlawan lain, ada pertempuran dengan penjaga goblin, menjaga tambang itu. Pahlawan kehilangan 20 poin kehidupan. Jika dia selamat, tambanglah dia.
  • Dia menginjak pahlawan lain, dia tetap di tempatnya dan tidak ada yang terjadi. Perkelahian pahlawan diputuskan di akhir belokan.
  • Dia memasuki kedai minuman, dia tetap di tempatnya dan memerintahkan dirinya untuk makan. Pahlawan membayar 2 emas dan mengembalikan 50 kesehatan. Harap dicatat bahwa jumlah kesehatan tidak boleh melebihi 100 unit.
  • Dia tidak mengirim pesanan dalam waktu yang diberikan kepadanya untuk membuat keputusan (1 detik), dia tetap di tempat sampai akhir pertandingan, menjadi mustahil untuk mengirim pesanan baru. Harap dicatat bahwa ia masih bisa menang jika ia memiliki lebih banyak emas di akhir pertandingan daripada pemain lain.

Akhir belokan


Setelah pahlawan bergerak (atau memutuskan untuk diam), hal-hal berikut akan terjadi:


Pertempuran

Para pahlawan sedikit gugup dan tidak pernah melewatkan kesempatan untuk saling memukul dengan pedang besar. Pada akhir giliran pahlawan, jika ada musuh pada jarak satu bujur sangkar ke segala arah, pahlawan menyerangnya. Misalnya, dalam situasi ini, pada akhir giliran pahlawan pertama ( @1 ):


 ######## ##@1@2## ## @3## ######## 

Pemain 1 menyerang pemain kedua, tetapi tidak menyentuh yang ketiga, karena yang ketiga berjarak dua kotak darinya.
Penyerang tidak kehilangan unit kesehatan, bek kehilangan 20 unit.
Jika bek mati (lihat: Kematian pahlawan), penyerang mendapatkan kendali atas semua tambang emas si pecundang.


Penambangan emas

Setelah gilirannya dan bertempur dengan pahlawan lain (jika ada), pemain menerima satu unit emas untuk setiap tambang yang dikendalikan.


Haus

Kemudian pahlawan kehilangan satu unit kesehatan, karena tindakan apa pun membuatnya haus.
Harap dicatat bahwa para pahlawan tidak bisa mati kehausan. Dalam kasus terburuk, nilai kesehatan mereka turun menjadi satu.


Kematian pahlawan


Ketika kesehatan pahlawan turun ke nol, dia mati. Pahlawan segera muncul di peta pada titik kelahiran kembali, dengan cadangan kesehatan penuh (100 unit). Pahlawan kehilangan kendali atas semua tambang emasnya, tetapi mempertahankan semua emasnya yang terkumpul. Hati-hati saat pahlawan kembali ke titik kelahiran kembali, lawan yang ada di sel ini secara otomatis mati. Karena itu, Anda harus menghindari tetap di sel spawn dari salah satu pahlawan ...


Seorang pahlawan tidak bisa mati kehausan. Haus dapat meninggalkan pahlawan dengan satu unit kesehatan, tetapi tidak membunuhnya.


Akhir dari game


Permainan berakhir ketika jumlah maksimum gerakan (biasanya 300) tercapai. Pemenangnya adalah pahlawan dengan emas terbanyak. Jika dua pemain memiliki jumlah emas yang sama, tidak ada pemenang.


Peringkat


Sistem peringkat kekuatan relatif pemain menggunakan Peringkat Elo . Idenya adalah: lebih baik menjadi yang pertama dari yang kedua, lebih baik yang kedua daripada yang ketiga, dan seterusnya. Saya harap prinsipnya jelas.


Menggunakan beberapa bot sekaligus


Anda dapat secara bersamaan meluncurkan beberapa contoh bot Anda dan, secara umum, menggunakan tindakan apa pun yang, menurut Anda, cocok untuk mencapai kepemimpinan yang dominan. Bertarung!


Tautan ke aslinya


Perlu dicatat beberapa aspek lagi yang tidak dijelaskan dalam aturan, tetapi diidentifikasi secara empiris:


  • Jika kami memiliki kurang dari 21 unit kesehatan, tetapi Anda menyerang tambang yang bukan milik Anda, maka Anda mati. Ya, ya, tidak ada perlindungan dari si bodoh, semuanya serius di sini, seperti dalam pertempuran sesungguhnya. Jika Anda menyerang tambang tak bertuan, semua tambang Anda menjadi tanah tak bertuan, dan jika Anda menyerang tambang salah satu musuh, maka tambang Anda masuk ke tangan pemain yang memiliki tambang ini.
  • Permainan ini menjelaskan prosedur berikut: - - Kami 1 . Dan apa yang terjadi jika kita mati selama eksekusi order (dalam game kamu bisa melakukan ini hanya dengan mati dalam pertempuran dengan goblin)? Kami terlahir kembali (dan langsung membunuh pemain yang sekarang di spawnpoint kami), tetapi kehilangan kemampuan untuk memukul musuh di dekatnya, dan juga tidak kehilangan 1 kesehatan karena kehausan.
  • Setelah membunuh musuh yang berdiri di spawnpoint kami selama kelahiran kami, kami menangkap ranjaunya, hehe.
  • Peta memiliki tampilan persegi, panjang peta mengambil nilai genap pada segmen [8, 28].

"Belajarlah dari musuhmu dan kamu akan memahami kekuatan mereka"


Vindinium adalah game publik, sisi bermanfaatnya adalah kita dapat melihat profil pemain mana pun dan melihat seratus pertarungan terakhir dengan partisipasinya. "Luar biasa! Saatnya menggunakan jaringan saraf, karena kami memiliki 50 pemain top, kami akan mengambil 10 pemain terkuat, masing-masing dari 100 pertarungan terakhir mengandung ~ 300 momen ketika pemain harus membuat keputusan, dengan total sekitar 200-300 ribu unit bahan untuk pelatihan! Dan Anda dapat memutar setiap situasi searah jarum jam, cermin, dll, untuk mendapatkan lebih banyak bahan untuk pelatihan dan mengkonsolidasikan hasilnya, ini akan memberi kami sebanyak 4,8-7,2 juta unit materi "- suara nalar keluar. Ya, memang, gagasan semacam itu memiliki hak untuk hidup. Selain itu, jaringan saraf memiliki banyak keunggulan.


  • Semua materi pelatihan mudah diurai dari sumber terbuka.
  • Ruang lingkup yang luas dibuka untuk refleksi pada visi komputer:
    • Anda dapat meninggalkan semuanya apa adanya, akan ada 28 * 28 neuron input (jika peta lebih kecil, isi dengan pohon);
    • Anda dapat memusatkan setiap waktu sesuai dengan posisi pahlawan (mungkin itu akan membawa hasil yang luar biasa);
    • Anda dapat menyajikan peta dalam bentuk grafik, sehingga sangat memudahkan pekerjaan jaringan saraf dalam menemukan pola; Opsi ini akan memungkinkan neuron untuk dengan cepat menemukan pola perilaku yang kompleks dan dengan cepat memahami mengapa, jika kita memiliki sedikit kesehatan, kita pergi ke kedai yang jauh, jika hanya ada kedai lain di beberapa sel dari kita, bahkan jika musuh tepat di sebelahnya;
  • Jaringan saraf yang sudah terlatih, diberi tugas untuk menghabiskan sumber daya di muka, dapat ditempatkan secara kompak dalam 512 megabita RAM yang dialokasikan untuk kita (pada kenyataannya, ternyata sekitar 480 megabita), sedemikian rupa sehingga kekuatan komputer papan tunggal cukup untuk perhitungan.

Namun, maksimalisme remaja dalam diri saya ingin pergi ke cara yang lebih rumit - bukan untuk mencari pola pada jaringan saraf, tetapi untuk melakukan pekerjaan ini sendiri, dahi saya, mengandalkan plastisitas intuitif yang lebih tinggi dari solusi ini.


Jadi Pohon keputusan, kliping alfa beta, minimaxes ... tugas yang terlalu berat! Di subreddit Vindinium, beberapa pengembang, mengungkap tabir rahasia bot mereka, telah menggunakan solusi ini, dan mungkin tidak dalam kondisi Spartan seperti itu. Sayangnya, di bidang ini tidak mungkin ada yang bisa dilakukan lebih baik daripada yang lain.


Setelah membaca artikel tentang evolusi, algoritma genetika, pemecahan pohon, saya menggali bidang pengetahuan potensial - rahasia. Anda dapat membaca lebih lanjut tentang mereka di sini dan di sini . Gagasan ini tampaknya sangat berhasil, karena bidang potensial adalah grafik planar, fungsi ditempatkan di setiap tautan, yang bergantung pada input data (khususnya, jarak dari objek, tetapi tidak ada yang mengganggu untuk membuat lebih banyak kondisi). Semua ini sangat cocok dengan kenyataan Vindinium - Anda tidak perlu mencari path ke objek, jika sudah ada dalam algoritma.


"Cita Rasa Spesifik"


Mari kita saksikan pertarungan karakter top. Sebelum memulai, kita akan memilih favorit, kita akan mengikutinya, mendukungnya, menghukum keputusan yang salah dengan gaya "tapi aku akan bertindak di tempat ini ...". Setelah selusin perkelahian, Anda sudah dapat membuat sketsa pertama tentang apa itu AI yang patuh hukum (syarat-syaratnya diperiksa sesuai urutan):


  1. Anda tidak boleh mendekati titik spawn musuh jika musuh memiliki kesempatan untuk mati (mis. Jika kita dapat mengharapkan kematian yang memalukan saat berdiri di spawnpoint musuh);
  2. Adalah bodoh untuk melawan musuh Anda di dekat tempat pembiakannya, karena ia akan tetap seperti burung phoenix jernih dengan kesehatan penuh dan akan mencoba lagi untuk menangkap ranjau kami yang dijarah secara jujur;
  3. Jika musuh berdiri dekat dengan kita, dan kita berdiri di dekat warung - waktu untuk mabuk. Dilihat oleh banyak pertempuran berdarah di dekat sarana subsisten dan relaksasi, aturan ini sangat relevan;
  4. Jika kita tidak bisa mengalahkan musuh / musuh, tetapi kita berhasil lari ke warung, kita lari;
  5. Jika kita tidak bisa mengalahkan musuh / musuh Dan tidak punya waktu untuk mencapai kedai, maka:
    • Jika kita bisa bunuh diri di pertanian tak bertuan, kita bunuh diri tentang itu. Selamat menggigit!
    • Jika kita bisa mati tentang piring tambang seseorang dengan jumlah emas terendah, kita melihatnya sendiri;
    • Jika akhir yang menyedihkan menunggu kita, maka kita perlu mengambil kesehatan sebanyak mungkin dari reptil ini, biarkan dia mengingat kesalahannya untuk waktu yang lama!
  6. Jika ada musuh yang bisa kita bunuh dalam dua gerakan kita dan dia memiliki Mine-Lines, kita serang;
  7. Jika ada musuh yang jauh dari semua minilocks daripada kita, dan dia memiliki 33% minilock di bawah kendali Dan kita bisa mengalahkannya - kita menang, kalau tidak kita minum bir;
  8. Kami menangkap pertanian jika tidak ada lagi yang tersisa.

Tanya Jawab:


  • Apa keuntungannya dari jaringan saraf yang dapat melakukan tugas ini seratus kali lebih baik, atau pohon yang semua langkah Anda n berikutnya tahu dan telah mengembangkan tindakan pencegahan, yang tersisa adalah menggunakan fungsi evaluasi dengan baik?
  • (1) Multifungsi. Lebih mudah untuk mengubah parameter, menambahkan fungsi baru. Anda mengikuti karakter seperti itu, bersukacita, dan kemudian bam - dan Anda melihat bahwa pada saat tertentu Anda bisa bertindak sangat berbeda, lebih bijaksana - kami sedang menulis aturan baru atau mengubah yang lama. (2) Kami juga tahu persis keputusan apa yang memandu program ketika memilih langkah tertentu. (3) Bidang potensial telah menunjukkan diri dengan baik di bagel sebagai dasar untuk kecerdasan buatan bot.


  • Buktikan bahwa pendekatan Anda valid, bahwa niat Anda bernilai sesuatu.
  • Di papan peringkat, Zaraza 0.1 menggantung di posisi ke-27 - AI di bidang potensial, yang hanya dipandu oleh tiga naluri - dengan ceroboh ambil segala sesuatu yang menghalangi jalannya, jangan mengering di bar dan bersikap hati-hati dengan musuh. Jika Anda mengikuti gerakannya, Anda akan melihat seberapa baik ia bertarung, meskipun ini benar-benar tidak dapat dipercaya untuk AI, yang didasarkan pada tiga aturan sederhana dan ia bahkan tidak akan memimpikan perilaku yang rumit. Selain itu, sekarang saya sedang mengerjakan Zonko 0.11 , yang merupakan versi yang sangat baik dari minuman keras Zaraz, Anda dapat mengintegrasikan perilaku yang jauh lebih rumit ke dalamnya karena interaksi yang lebih baik dengan bidang - seperti halnya GPS bermodel baru. Tapi, ternyata, itu lahap tentang sumber daya, jadi proses pengoptimalannya terjadi sekarang ... Tapi saya ngelantur, sekarang kita berbicara tentang pembatasan ketat, aturan ketat yang ketat (...).


  • Keyakinan Anda konyol, iman Anda terlalu lemah! Saya dapat membuat AI pada method_name dan itu akan membuat Anda sedih!
  • Akan sangat menyenangkan untuk mendengarkan pemikiran orang lain tentang topik ini. Selain itu, untuk Anda, saya telah mengumpulkan semua pertarungan dari 10 pemain teratas, hanya 1000 pertarungan dan sekitar 1.000.000 gerakan - tautan (.zip - 33MB, RAW - 1.68GB). Saya menawarkan kondisi permainan:
    • Daftarkan bot di bawah nama panggilan Anda di geektimes.
    • Kepada lima pemain yang mencetak poin terbanyak sebelum 30 September daripada saya atau siapa pun yang telah mengindikasikan untuk bermain, saya akan mengirim kartu pos dari Moskow).

Jadi, sekarang bahasa pemrograman ... Secara pribadi, saya sekarang terburu-buru antara Python3 (pengembangan cepat, mudah dibaca, akrab dengannya untuk waktu yang lama, ada pypy3 (penerjemah yang dioptimalkan cepat), jupyter ("notebook" di mana Anda dapat dengan aman menulis potongan kode dan mengoptimalkannya untuk infinity); tetapi pypy / pypy3 tidak bekerja di bawah ARM 64bit, dan memang ARM tidak lagi didukung, dan bahasa itu sendiri lebih rendah daripada yang disusun berdasarkan sifatnya) dan Golang (juga pengembangan cepat, mudah dipahami, bias besar terhadap backend, multithreading dan multiprocessing, berjalan lebih cepat dari python, tetapi dengan etsya terbiasa dengan tidak adanya lingkungan yang interaktif untuk mengetik statis).


Fungsi utama yang berkomunikasi dengan server dapat direpresentasikan sebagai berikut:


Kode
 #     train_url, arena_url, userkey,   config.py from config import train_url, arena_url, userkey import requests, random, json, time def start(is_train = True, debug = True, show_decision = True): #   if is_train: r = requests.post(train_url, data={"key":userkey}) else: r = requests.post(arena_url, data={"key":userkey}) timer = time.time() data = json.loads(r.text) if debug or show_decision: print('viewUrl:', data['viewUrl']) print(' :', data['game']['board']['size']) # while True: if debug: print('Turn', data['game']['turn']) #     direction = random.choice(['North', 'South', 'East', 'West', 'Stay']) if show_decision or debug: print(' ',str(data['game']['turn'])+':', direction) #    ,   ,  . if debug: print(':',time.time()-timer) r = requests.post(data['playUrl'], data={'key': userkey, 'dir': direction}) timer = time.time() if r.status_code != 200: print('Request code :', r.status_code) print('Reason:', r.reason) break data = json.loads(r.text) if data['game']['finished']: print('Game finished.') break 

Tetapi disarankan untuk menggunakan pengembangan di luar rak, tautan yang dapat ditemukan di situs web resmi Vindinium.


Tambahan 1: Saya benar-benar ingin membaca tentang pengembangan kecerdasan buatan berdasarkan Vindinium dari orang lain, karena dengan cara ini Anda dapat memahami sifat beragam segi untuk menyelesaikan masalah ini. Untuk mendapatkan ringkasan pertempuran dalam format json (ini bisa berguna untuk debugging perkelahian), Anda perlu mengonversi tautan ke pertempuran bentuk http://vindinium.org/fd96vc2z ke tautan formulir http://vindinium.org/events/fd96vc2z . Tapi saya tidak menyarankan menyiksa server game, mencoba untuk mendapatkan ratusan perkelahian pemain top, gunakan tautan di atas.


Tambahan 2: Jika seseorang ingin mencoba menjalankan waktu operasi mereka di Vindinium ke dalam keterbatasan NanoPi Neo2 atau Orange Pi Zero, saya dapat memberikan kesempatan untuk bekerja dengan komputer papan tunggal ini.


β†’ Tautan ke Vindinium
β†’ Tautan ke subreddit Vindinium adalah hal yang sangat berguna, di sana Anda dapat melacak pergerakan saya di Vindinium
β†’ Tautan ke github saya dengan sedikit pekerjaan di Vindinium


Pada bagian berikutnya, kita akan mengatur bidang potensial, bekerja dengan peta potensial, menulis kondisi dan memaksakan semua ini pada realitas modern.

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


All Articles