Ini adalah Tantangan Fortnightly # 3. Tema: Algoritma Genetika
Tantangan ini sedikit percobaan. Kami ingin melihat apa yang bisa kami lakukan, berdasarkan tantangan, dengan algoritma genetika. Tidak semuanya mungkin optimal, tetapi kami mencoba yang terbaik untuk membuatnya dapat diakses. Jika ini berhasil, siapa yang tahu apa yang mungkin kita lihat di masa depan. Mungkin genetik King of the Hill?
Speknya cukup panjang! Kami telah mencoba memisahkan spec ke dalam The Basics - minimum yang perlu Anda ketahui untuk mulai bermain dengan framework dan mengirimkan jawaban - dan The Gory Details - spec lengkap, dengan semua detail tentang controller, berdasarkan mana Anda bisa menulis sendiri
Jika Anda memiliki pertanyaan apa pun, silakan bergabung dengan kami di obrolan!
Anda seorang peneliti dalam psikologi perilaku. Ini Jumat malam dan Anda dan kolega Anda memutuskan untuk bersenang-senang dan menggunakan tikus lab Anda untuk balapan tikus kecil. Faktanya, sebelum kita terlalu terikat secara emosional dengan mereka, mari kita sebut mereka spesimen .
Anda telah menyiapkan trek balap kecil untuk spesimen, dan untuk membuatnya lebih menarik, Anda telah meletakkan beberapa dinding dan perangkap serta teleporter di sepanjang trek. Sekarang, spesimen Anda masih tikus ... mereka tidak tahu apa itu jebakan atau teleporter. Yang mereka lihat adalah beberapa hal dalam berbagai warna. Mereka juga tidak memiliki memori apa pun - yang dapat mereka lakukan hanyalah membuat keputusan berdasarkan lingkungan mereka saat ini. Saya kira seleksi alam akan memilih spesimen yang tahu bagaimana menghindari jebakan dari yang tidak (perlombaan ini akan memakan waktu ...). Biarkan game dimulai! †
† 84.465 spesimen terluka dalam pembuatan tantangan ini.
Dasar
Ini adalah permainan pemain tunggal (Anda dan kolega Anda tidak ingin mencampuradukkan populasi sehingga masing-masing membangun trek balap mereka sendiri). Jalur balap adalah kotak persegi panjang, tinggi 15 sel dan lebar 50 sel. Anda mulai dengan 15 spesimen pada sel acak (tidak harus berbeda) di tepi kiri (di mana x = 0 ). Spesimen Anda harus mencoba mencapai tujuan yang merupakan sel mana pun pada x ≥ 49 dan 0 ≤ y ≤ 14 (spesimen dapat melampaui jejak ke kanan). Setiap kali ini terjadi, Anda mendapat poin. Anda juga memulai permainan dengan 1 poin. Anda harus mencoba memaksimalkan poin Anda setelah 10.000 putaran.
Beberapa spesimen dapat menempati sel yang sama dan tidak akan berinteraksi.
Pada setiap belokan, setiap spesimen melihat kisi 5x5 di sekelilingnya (dengan sendirinya di tengah). Setiap sel grid yang akan berisi warna -1
untuk 15
. -1
mewakili sel yang di luar batas. Spesimen Anda mati jika bergerak di luar batas. Sedangkan untuk warna lain, mereka mewakili sel kosong, perangkap, dinding dan teleporter. Tetapi spesimen Anda tidak tahu warna mana yang mewakili apa dan Anda juga tidak. Namun ada beberapa kendala:
- 8 warna akan mewakili sel kosong.
- 4 warna akan mewakili teleporter. Teleporter akan mengirim spesimen ke sel tertentu dalam lingkungan 9x9. Offset ini akan sama untuk semua teleporter dengan warna yang sama.
- 2 warna akan mewakili dinding. Pindah ke dinding sama dengan berdiri diam.
- 2 warna akan mewakili jebakan. Jebakan menunjukkan bahwa salah satu dari 9 sel di lingkungan terdekatnya adalah mematikan (tidak harus sel jebakan itu sendiri). Offset ini akan sama untuk semua jebakan dengan warna yang sama.
Sekarang, tentang seleksi alam ... setiap spesimen memiliki genom, yang merupakan angka dengan 100 bit. Spesimen baru akan dibuat dengan mengembangbiakkan dua spesimen yang ada, dan kemudian sedikit bermutasi genom. Semakin sukses suatu spesimen, semakin besar peluangnya untuk bereproduksi.
Jadi, inilah tugas Anda : Anda akan menulis satu fungsi, yang menerima sebagai input kisi warna 5x5 yang dilihat spesimen, serta genomnya. Fungsi Anda akan mengembalikan gerakan (Δx, Δy) untuk spesimen, di mana Δx dan Δy masing-masing akan menjadi satu {-1, 0, 1}
. Anda tidak boleh menyimpan data apa pun di antara panggilan fungsi. Ini termasuk menggunakan generator nomor acak Anda sendiri. Fungsi Anda akan dilengkapi dengan RNG yang diunggulkan yang bebas Anda gunakan sesuai keinginan.
Skor kiriman Anda akan menjadi rata - rata geometrik dari jumlah poin di 50 trek acak. Kami telah menemukan bahwa skor ini sedikit berbeda. Karena itu, skor ini akan menjadi permulaan . Setelah tantangan ini mereda, batas waktu akan diumumkan. Pada akhir batas waktu, 100 papan akan dipilih secara acak, dan semua pengiriman akan disimpan kembali di 100 papan ini. Jangan ragu untuk memberikan perkiraan skor pada jawaban Anda, tetapi kami akan menilai sendiri setiap pengiriman untuk memastikan tidak ada yang menipu.
Kami telah menyediakan program pengontrol dalam beberapa bahasa. Saat ini, Anda dapat menulis kiriman Anda dengan Python (2 atau 3), Ruby , C ++ , C # atau Java . Pengontrol menghasilkan papan, menjalankan permainan dan menyediakan kerangka kerja untuk algoritma genetika. Yang harus Anda lakukan adalah menyediakan fungsi bergerak.
Tunggu, jadi apa yang harus saya lakukan dengan genom?
Tantangannya adalah untuk mencari tahu!
Karena spesimen tidak memiliki memori, yang Anda dapatkan pada gilirannya adalah kotak warna 5x5 yang tidak berarti apa-apa bagi Anda. Jadi, Anda harus menggunakan genom untuk mencapai tujuan. Gagasan umum adalah bahwa Anda menggunakan bagian genom untuk menyimpan informasi tentang warna atau tata letak kisi, dan bot Anda mendasarkan keputusannya pada informasi tambahan yang disimpan dalam genom.
Sekarang, tentu saja Anda tidak dapat menyimpan apa pun di sana secara manual. Jadi informasi aktual yang tersimpan di sana pada awalnya akan sepenuhnya acak. Tetapi algoritma genetika akan segera memilih spesimen-spesimen yang genomnya mengandung informasi yang tepat sambil membunuh yang memiliki informasi yang salah. Tujuan Anda adalah menemukan pemetaan dari bit genom dan bidang pandang Anda ke suatu langkah, yang memungkinkan Anda menemukan jalur ke tujuan dengan cepat dan yang secara konsisten berevolusi menjadi strategi kemenangan.
Ini harus menjadi informasi yang cukup untuk memulai. Jika mau, Anda dapat melewati bagian berikutnya, dan pilih pengontrol pilihan Anda dari daftar pengontrol di bagian bawah (yang juga berisi informasi tentang cara menggunakan pengontrol tertentu).
Baca terus jika Anda ingin semua ...
Detail Gory
Spesifikasi ini lengkap. Semua pengendali harus menerapkan aturan ini.
Semua keacakan menggunakan distribusi yang seragam, kecuali dinyatakan sebaliknya.
Pembuatan trek:
- Lagu tersebut adalah kotak persegi panjang, lebar X = 53 sel dan tinggi Y = 15 sel. Sel dengan x ≥ 49 adalah sel tujuan (di mana x berbasis nol).
- Setiap sel memiliki warna tunggal dan mungkin atau mungkin tidak mematikan - sel tidak mematikan kecuali ditentukan oleh salah satu jenis sel di bawah ini.
- Ada 16 warna sel yang berbeda, berlabel dari
0
ke15
, yang artinya akan berubah dari satu game ke game lainnya. Selain itu,-1
merupakan sel yang berada di luar batas - ini mematikan . - Pilih 8 warna acak . Ini akan menjadi sel kosong (yang tidak memiliki efek).
- Pilih 4 warna lebih acak . Ini adalah teleporter. Untuk dua warna ini, pilih offset non-nol di lingkungan 9x9 (dari (-4, -4) hingga (4,4) kecuali (0,0)). Untuk dua warna lainnya, balikkan offset tersebut. Jika spesimen menginjak teleporter, ia segera dipindahkan oleh offset itu.
- Pilih 2 warna lebih acak . Ini adalah jebakan. Untuk masing-masing warna ini, pilih offset di lingkungan 3x3 (dari (-1, -1) hingga (1,1)). Jebakan menunjukkan bahwa sel pada offset itu mematikan . Catatan: Sel perangkap itu sendiri belum tentu mematikan.
- The 2 warna yang tersisa adalah dinding, yang menghambat gerakan. Mencoba untuk pindah ke sel dinding akan mengubah gerakan menjadi diam. Sel-sel dinding sendiri mematikan .
- Untuk setiap sel non-tujuan dari kisi, pilih warna acak. Untuk setiap sel sasaran pilih warna kosong acak .
- Untuk setiap sel di tepi kiri lintasan, tentukan apakah tujuan dapat dicapai dalam 100 putaran (sesuai dengan aturan urutan putaran di bawah). Jika demikian, sel ini adalah sel awal yang dapat diterima . Jika kurang dari 10 sel awal, buang trek dan hasilkan yang baru.
- Buat 15 spesimen, masing-masing dengan genom acak dan usia 0 . Tempatkan setiap spesimen pada sel awal yang acak.
Putar pesanan:
- Langkah-langkah berikut akan dilakukan, secara berurutan, untuk setiap spesimen. Spesimen tidak berinteraksi atau melihat satu sama lain, dan dapat menempati sel yang sama.
- Jika usia spesimen adalah 100 , ia akan mati. Kalau tidak, tambah umurnya 1.
- Spesimen diberi bidang pandang - kotak warna 5x5, berpusat pada spesimen - dan mengembalikan gerakan di lingkungan 3x3. Bergerak di luar rentang ini akan menyebabkan pengontrol berakhir.
- Jika sel target adalah dinding, maka bergerak diubah menjadi (0,0).
- Jika sel target adalah teleporter, spesimen dipindahkan oleh offset teleporter. Catatan: Langkah ini dilakukan satu kali , bukan secara iteratif.
- Jika sel saat ini ditempati oleh spesimen (berpotensi setelah menggunakan satu teleporter) mematikan , spesimen mati. Ini adalah satu - satunya waktu spesimen mati (terlepas dari langkah 1.1. Di atas). Secara khusus, spesimen baru yang memunculkan sel yang mematikan tidak akan langsung mati, tetapi memiliki kesempatan untuk pindah dari sel berbahaya terlebih dahulu.
- Jika spesimen menempati sel tujuan, skor poin, pindahkan spesimen ke sel awal acak dan setel ulang umurnya ke 0.
- Jika ada kurang dari dua spesimen yang tersisa di papan, permainan berakhir.
- Buat 10 spesimen baru dengan usia 0 . Setiap genom ditentukan (secara individu) oleh aturan pemuliaan di bawah ini. Tempatkan setiap spesimen pada sel awal yang acak.
Pembiakan:
Ketika spesimen baru dibuat pilih dua orang tua yang berbeda secara acak, dengan bias terhadap spesimen yang telah berkembang lebih jauh ke kanan. Probabilitas spesimen yang akan dipilih sebanding dengan skor kebugaran saat ini . Skor kebugaran spesimen adalah
1 + x + 50 * berapa kali mencapai tujuan
di mana x adalah indeks horisontal berbasis 0. Spesimen yang dibuat pada gilirannya yang sama tidak dapat dipilih sebagai orang tua.
Dari dua orang tua, pilih satu yang acak untuk mengambil bit genom pertama.
- Sekarang saat Anda berjalan di sepanjang genom, alihkan orang tua dengan probabilitas 0,05 , dan terus ambil bit dari orang tua yang dihasilkan.
- Mutasikan genom yang dirakit lengkap: untuk setiap bit, balikkan dengan probabilitas 0,01 .
Mencetak:
- Satu pertandingan berlangsung 10.000 putaran.
- Pemain memulai permainan dengan 1 poin (untuk memungkinkan penggunaan mean geometrik).
- Setiap kali spesimen mencapai tujuan, pemain mendapat skor.
- Untuk saat ini, pengiriman masing-masing pemain akan dijalankan selama 50 pertandingan, masing-masing dengan trek acak yang berbeda.
- Pendekatan di atas menghasilkan lebih banyak variasi daripada yang diinginkan. Setelah tantangan ini mereda, batas waktu akan diumumkan. Pada akhir tenggat waktu, 100 papan akan dipilih secara acak, dan semua pengiriman akan disimpan di 100 papan ini.
- Skor keseluruhan pemain adalah rata - rata geometrik dari skor masing-masing game ini.
Pengendali
Anda dapat memilih salah satu dari pengontrol berikut (karena mereka secara fungsional setara). Kami telah menguji semuanya, tetapi jika Anda menemukan bug, ingin meningkatkan kode atau kinerja, atau menambahkan fitur seperti output grafis, silakan kirim menimbulkan masalah atau mengirim permintaan tarik di GitHub! Anda juga dapat menambahkan pengontrol baru dalam bahasa lain!
Klik nama bahasa untuk setiap pengontrol untuk sampai ke direktori yang benar di GitHub, yang berisi README.md
dengan petunjuk penggunaan yang tepat.
Jika Anda tidak terbiasa dengan git dan / atau GitHub, Anda dapat mengunduh seluruh repositori sebagai ZIP dari halaman depan (lihat tombol di bilah sisi).
Python
- Paling teruji. Ini adalah implementasi referensi kami.
- Bekerja dengan Python 2.6+ dan Python 3.2+!
- Sangat lambat. Kami sarankan menjalankannya dengan PyPy untuk mempercepat.
- Mendukung output grafis menggunakan salah satu
pygame
atautkinter
.
Rubi
- Diuji dengan Ruby 2.0.0. Harus bekerja dengan versi yang lebih baru.
- Ini juga cukup lambat, tetapi Ruby mungkin nyaman untuk membuat prototipe ide untuk pengiriman.
C ++
- Membutuhkan C ++ 11.
- Secara opsional mendukung multithreading.
- Sejauh ini pengontrol tercepat dalam kelompok itu.
C #
- Menggunakan LINQ, sehingga membutuhkan .NET 3.5.
- Agak lambat.
Jawa
- Tidak terlalu lambat. Tidak terlalu cepat.
Papan Awal Pendahuluan
Semua skor bersifat sementara. Namun demikian, jika ada sesuatu yang salah atau kedaluwarsa, beri tahu saya. Pengajuan contoh kami terdaftar untuk perbandingan, tetapi tidak dalam pertentangan.
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
Kredit
Tantangan ini adalah upaya kolaborasi yang sangat besar:
- Nathan Merril: Menulis pengontrol Python dan Java. Mengubah konsep tantangan dari King-of-the-Hill menjadi Balap Tikus.
- trichoplax: Playtesting. Bekerja pada pengontrol Python.
- feersum: Menulis kontroler C ++.
- VisualMelon: Menulis kontroler C #.
- Martin Büttner: Konsep. Menulis pengontrol Ruby. Playtesting. Bekerja pada pengontrol Python.
- T Abraham: Playtesting. Diuji Python dan ditinjau C # dan C ++ controller.
Semua pengguna di atas (dan mungkin beberapa lagi saya lupa) telah berkontribusi pada keseluruhan desain tantangan.
Pembaruan pengontrol C ++
Jika Anda menggunakan C ++ dengan Visual Studio dan multithreading, Anda harus mendapatkan pembaruan terbaru karena bug dengan seeding generator nomor acak mereka yang memungkinkan papan duplikat untuk diproduksi.
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'