Dalam tantangan ini, Anda diberikan sejumlah informasi terbatas tentang permainan catur tertentu, dan Anda perlu memperkirakan siapa yang memenangkan permainan .
Anda diberi dua set data:
- Potongan dihitung (Potongan apa yang masih hidup)
- Warna papan (Warna potongan pada papan)
Lebih penting lagi, Anda tidak tahu di mana potongan-potongan itu berada . Anda perlu menentukan siapa yang menurut Anda akan menang.
Game dipilih dari semua acara yang terdaftar di PGNMentor dari 2010 hingga sekarang. Saya telah memilih 10% dari semua posisi dewan dari setiap pertandingan yang berakhir dengan kemenangan atau kekalahan. Posisi dewan akan selalu setidaknya 30 gerakan ke dalam permainan. Kasing uji dapat ditemukan di sini . (Kemenangan putih didaftar pertama, diikuti oleh kemenangan hitam)
Memasukkan
Hitungan keping akan berupa string yang terdiri dari karakter untuk setiap keping: k
ing, q
ueen, r
ook, k n
ight, b
ishop, atau p
awn. Huruf kecil berarti hitam, huruf besar adalah putih. Papan akan menjadi string 64 karakter (8 baris dengan 8 kolom). B
mewakili bagian hitam, W
mewakili bagian putih, dan .
mewakili tempat kosong. Sampel:
W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr
akan mewakili dewan berikut
...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.
dan di mana kedua warna memiliki 2 Uskup, 1 Raja, 7 Pion, 1 Ratu, 2 Benteng
Keluaran
Anda perlu mengembalikan angka floating-point antara 0 dan 1 (inklusif) untuk menentukan seberapa besar kemungkinan putih menang. Mencicipi:
0.3 (30% chance that white wins)
Keterangan lebih lanjut:
- Setiap test case bernilai 1 poin. Skor Anda adalah
1 - (1-Output)^2
jika putih menang, atau1 - (Output)^2
jika hitam menang. - Skor akhir Anda akan menjadi jumlah di semua kasus uji.
- Jika saya merasa bahwa kiriman adalah hardcoding input, saya berhak mengubah kasus uji. (Jika saya mengubahnya, mereka akan memiliki hash SHA-256
893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee
) - Program Anda harus menjalankan test case secara independen. Tidak ada menyimpan informasi dari satu test case ke yang berikutnya.
- Jika Anda menggunakan pembelajaran mesin, saya sangat merekomendasikan pelatihan 80% pertama dari data, dan pengujian menggunakan 20% sisanya . (Atau persentase apa pun yang Anda gunakan). Saya menggunakan game beberapa kali dalam data, tapi saya menempatkan game yang sama secara berurutan.
- UPDATE: Saya telah menambahkan lebih dari satu juta kasus uji untuk tujuan pengujian dan pembelajaran. Mereka dibagi menjadi bagian-bagian hitam dan putih karena batas ukuran repo github.
Semoga berhasil dan selamat bersenang - senang!
sumber
Jawaban:
Java 8 + Weka, 6413 poin, 94,5%
Jawaban ini menggunakan pendekatan pembelajaran mesin. Anda perlu mengambil perpustakaan Weka , terutama
weka.jar
danPackageManager.jar
.Di sini, saya menggunakan perceptron multilayer sebagai classifier; Anda dapat mengganti
mlp
denganClassifier
kelas Weka mana pun untuk membandingkan hasil.Saya belum banyak mengutak-atik parameter MLP, dan cukup mengamatinya (satu lapisan tersembunyi 50 neuron, 100 zaman, laju pembelajaran 0,2, 0,1 momentum).
Saya mengirik nilai output dari MLP, jadi outputnya benar-benar 1 atau 0 seperti yang didefinisikan dalam tantangan. Dengan begitu, jumlah instance yang diklasifikasikan dengan benar seperti yang dicetak oleh Weka adalah skor kami secara langsung.
Konstruksi vektor fitur
Saya mengubah setiap instance dari string ke vektor 76 elemen, di mana:
1
bagian putih,-1
adalah bagian hitam dan0
merupakan sel kosong.0
menjadi "no piece of type"). Orang dapat menerapkan normalisasi untuk mereparasi nilai-nilai tersebut antara -1 dan 1 tetapi ini mungkin tidak terlalu membantu di sini.Jumlah instance pelatihan
Jika saya menggunakan semua test case yang diberikan untuk melatih classifier saya, saya telah berhasil mendapatkan 6694 (yaitu 98,6588%) contoh yang benar diklasifikasikan . Ini jelas tidak mengherankan karena menguji model pada data yang sama dengan yang Anda gunakan untuk melatihnya terlalu mudah (karena dalam kasus itu sebenarnya bagus jika model tersebut overfits).
Menggunakan subset acak 80% dari instance sebagai data pelatihan, kami mendapatkan 6413 (yaitu 94,5173%) angka instance dengan benar yang dilaporkan dalam header (tentu saja karena subset tersebut acak Anda mungkin mendapatkan hasil yang sedikit berbeda). Saya yakin bahwa model akan bekerja dengan baik pada data baru, karena pengujian pada 20% contoh yang tersisa (yang tidak digunakan untuk pelatihan) memberikan 77,0818% klasifikasi yang benar, yang menunjukkan bahwa model tersebut menggeneralisasi dengan baik (dengan asumsi bahwa contoh yang kami berikan di sini mewakili kasus uji baru yang akan kami berikan).
Dengan menggunakan setengah contoh untuk pelatihan, dan setengah lainnya untuk pengujian, kami mendapatkan 86,7502% pada data pelatihan dan pengujian, dan 74,4988% hanya pada data uji.
Penerapan
Seperti yang saya katakan, kode ini membutuhkan
weka.jar
danPackageManager.jar
dari Weka.Seseorang dapat mengontrol persentase data yang digunakan dalam set pelatihan
TRAIN_PERCENTAGE
.Parameter MLP dapat diubah tepat di bawah
TRAIN_PERCENTAGE
. Seseorang dapat mencoba pengklasifikasi lain dari Weka (misalnyaSMO
untuk SVM) hanyamlp
dengan mengganti dengan pengklasifikasi lain.Program ini mencetak ke set hasil, yang pertama berada di seluruh set (termasuk data yang digunakan untuk pelatihan) yang merupakan skor sebagaimana didefinisikan dalam tantangan ini, dan yang kedua hanya pada data yang tidak digunakan untuk pelatihan.
Satu input data dengan melewati jalur file yang berisi itu sebagai argumen ke program.
sumber
GNU sed + bc,
43365074.5 poin,6475%Pembaruan: OP memberikan cara baru untuk menghitung skor prediksi untuk setiap kasus uji. Menggunakan Wolfram Alpha , saya merencanakan kedua set rumus untuk melihat perbedaan.
Cara saat ini membawa insentif yang kuat untuk menghasilkan probabilitas aktual, dan bukan hanya yang ekstrem, 0 dan 1, yang formula barunya memberikan skor maksimum yang sama seperti sebelumnya. Inilah sebabnya mengapa algoritma yang tidak berubah di bawah ini, kini memiliki tingkat prediksi yang lebih baik, bahkan tingkat yang luar biasa karena kesederhanaannya.
Namun, ada juga kekurangan yang terkait dengan formula baru, seperti yang dijelaskan dalam 'Sunting 1'.
Ini adalah estimasi sederhana berdasarkan hanya pada keuntungan / kerugian material, mengabaikan penempatan sebenarnya potongan. Saya ingin tahu bagaimana ini akan tampil. Alasan saya menggunakan sed, dan bukan bahasa yang bisa melakukan ini dalam satu baris, adalah karena itu adalah bahasa esoterik favorit saya.
Nilai satuan standar yang digunakan:
Saya menghitung bahan untuk kedua sisi dan mengurangi bahan hitam dari yang putih. Output untuk setiap test case didasarkan pada perbedaan itu sebagai berikut:
Ini adalah satu-satunya hasil fraksional saya, maka alasan peningkatan seperti dijelaskan di atas.
Tingkat prediksi untuk metode ini adalah 64%. Sekarang sudah 75% dengan formula baru.
Sunting 1: kekurangannya
Solusi sepele adalah dengan menghasilkan 0,5 untuk setiap kasus uji, karena dengan cara ini Anda mencetak setengah poin terlepas siapa yang menang. Untuk kasus uji kami, ini berarti skor total 3392,5 poin (50%).
Tetapi dengan formula baru, 0,5 (yang merupakan hasil yang akan Anda berikan jika Anda ragu-ragu siapa yang menang) dikonversi menjadi 0,75 poin. Ingat bahwa skor maksimum yang dapat Anda terima untuk kasus uji adalah 1, untuk kepercayaan 100% pada pemenang. Dengan demikian, skor total baru untuk output 0,5 konstan adalah 5088,75 poin, atau 75%! Menurut saya, insentifnya terlalu kuat untuk kasus ini.
Skor itu lebih baik, meskipun sedikit, daripada algoritma berbasis keunggulan materi saya. Alasan untuk itu adalah karena algoritma memberikan probabilitas 1 atau 0 (tidak ada insentif), diasumsikan menang atau kalah, lebih banyak kali (3831) daripada yang diberikan 0,5 (insentif), diasumsikan menarik (2954). Metode ini sederhana pada akhirnya, dan karena itu tidak memiliki persentase jawaban yang benar. Dorongan dari formula baru ke 0,5 konstan, berhasil mencapai persentase itu, secara artifisial.
Edit 2:
Adalah fakta yang diketahui, disebutkan dalam buku-buku catur, bahwa biasanya lebih baik memiliki sepasang uskup daripada sepasang ksatria. Ini terutama benar di tahap tengah hingga akhir permainan, di mana kasus uji berada, karena lebih cenderung memiliki posisi terbuka di mana kisaran uskup ditingkatkan.
Karena itu saya melakukan tes kedua, tetapi kali ini saya mengganti nilai uskup dari 3 menjadi 3,5. Nilai knight itu tetap 3. Ini adalah preferensi pribadi, jadi aku tidak menjadikannya pengajuan standarku. Total skor dalam kasus ini adalah 4411 poin (65%). Hanya peningkatan 1 poin persentase yang diamati.
Dengan formula baru, skor total adalah 4835 poin (71%). Sekarang, uskup tertimbang itu berkinerja buruk. Tapi, efeknya dijelaskan karena metode tertimbang sekarang memberi bahkan lebih banyak kali diasumsikan menang atau kalah (5089), daripada yang diasumsikan menarik (1696).
sumber
Python 3 - 84,6%, 5275 poin pada set validasi
Jika kita menipu dan menggunakan semua data, kita dapat mencapai akurasi 99,3%, dan skor 6408
Hanya MLP besar sederhana dengan dropout menggunakan Keras
sumber
Python 3 - akurasi 94,3%, 6447 poin pada set validasi 20% dari data
Menggunakan 3 jaringan saraf, regressor tetangga terdekat, hutan acak, dan peningkatan gradien. Prediksi ini dikombinasikan dengan hutan acak yang juga memiliki akses ke data.
sumber
Python 3 - 4353.25 / 6785 poin - 64%
Jadi saya mengerjakan ini sebagian besar kemarin. Posting golf pertama saya, dan saya hanya menggunakan python seminggu atau lebih sekarang, jadi maafkan saya jika tidak semuanya dioptimalkan.
Saya berakhir di jalan yang sama dengan jawaban seshoumara. Tetapi sejumlah besar kasus uji yang bahkan jumlah kepingnya membuat saya tidak puas.
Jadi saya mencari ciri-ciri yang menentukan siapa yang menang dalam catur (saya tidak bermain sendiri) dan memperhatikan posisi dewan, khususnya kontrol pusat, besar. Di situlah bit ini masuk
Kedua bagian yang digabungkan digunakan untuk menemukan skor (0,0, 0,25, 0,50, 0,75, 1,0)
Sangat menarik bahwa posisi dewan tambahan ini tampaknya tidak meningkatkan kesempatan sama sekali untuk menebak pemenang.
Jika Anda menjatuhkan kasus uji ke beberapa file, inilah pengujiannya.
Saya tahu ini bukan tantangan golf, tetapi setiap tips atau saran dalam hal ini sangat dihargai!
sumber