Pada tulisan pertama terkait proyek ini, saya ingin membuat basis data posisi catur yang juga mencatat hal-hal seperti nilai WDL (Win/Draw/Lose) dari pemain catur, dikelompokkan berdasarkan peringkat Elo mereka. Saya pikir ini akan mudah, karena beberapa situs terkait catur seperti Lichess menyediakan data ini lewat API mereka. Saya membuat implementasinya untuk setiap data yang saya anggap perlu ada di basis data nantinya. Butuh sekitar dua-tiga pekan sebelum saya menyadari, saya hanya mengerjakan hal-hal tersier; dan selama rentang waktu itu, saya tidak menemukan solusi mantap dalam mengumpulkan data terpenting: bagaimana cara mendapatkan balasan terbaik suatu posisi?
Dalam beberapa pekan berikutnya, saya fokus mencoba menjawab masalah tersebut:
- Ide termudah adalah meng-kueri API Lichess. Namun jika saya diam dan merenungkan sejenak, ada tak hingga (secara praktikal) posisi catur permainan standar yang mungkin; hanya seperkian dari seperkian dari semua posisi catur itu, yang evaluasinya dicatat oleh Lichess. Lagipula menge-spam request ke Lichess bukanlah hal yang pantas, setidaknya menurut saya.
- Oke, bagaimana dengan melakukan evaluasi Stockfish secara lokal, dan mencatat hasilnya ke basis data? Oh wow, kipas laptop saya mengerang seperti pesawat jet yang lepas landas; saya rasa ini bukan ide yang bagus.
- Oke… jadi… bagaimana jika membuat chess engine baru, yang menggunakan diska dan bukan RAM sebagai penyimpanan memorinya? Mesin ini akan sangat lambat ketimbang pada dasarnya semua mesin catur. Namun harapannya, dengan menyimpan data secara persistent, eventually (entah kapan) mesin akan menghasilkan evaluasi yang sama baiknya dengan Stockfish. Setelah menerapkan Negamax dengan Stockfish sebagai fungsi evaluasi statis (karena saya tidak mau menghabiskan waktu belajar teori catur), saya baru menyadari hasil evaluasi Negamax suatu posisi belum tentu back-propagate ke posisi induk. Sial. Saya selanjutnya membuat mesin yang menerapkan Monte Carlo Tree Search, yang secara desain menjawab masalah ini. Sialnya, tidak ada cara mudah membuat fungsi policy head (ah iya, no free-lunch theorem). Saya menghabiskan beberapa hari mengimplementasikan MCTS dengan heuristik AMAF (All-Move As First) dan menyadari… ini hanya Minimax yang diglorifikasi.
Kegagalan di tiga (walau sebenarnya saya anggap empat) cara itu sempat menghancurkan semangat; saya beralih pada proyek lain. Namun satu pertanyaan tetap menghantui saya: data-data apa yang penting dan harus ada agar saya bisa mengganggap ini sebagai basis data catur? Saya duduk, dan merumuskan ini:
- Posisi catur, pastinya. Ini bisa disimpan dalam notasi FEN, tetapi agar hemat memori dan mudah digunakan (di SQLite), saya menggunakan solusi oleh Tomasz Sobczyk (hanya menggunakan 24 bita) yang diubah menjadi teks dengan enkoding Z85.
- skor evaluasi, menggunakan unit centipawn.
- kedalaman evaluasi, besar ply yang dianalisis.
- balasan terbaik, menggunakan notasi UCI (e.g.
d2d4, atau angka seperti 731).
Setelah menjabarkan itu, saya mendapat ide, saya bisa membuat penyinggah untuk mesin catur!
- Penyinggah akan menyimpan hasil analisis posisi oleh mesin catur
- Jika hasil analisis posisi yang ada di basis data lebih dalam (dari nilai
depth) ketimbang yang dihasilkan oleh mesin, gunakan hasil di basis data. - Untuk mendapatkan MultiPV, penyinggah akan membuat daftar semua balasan yang mungkin, mengueri basis data, mengurutkan hasil yang didapatkan berdasarkan skor dan/atau kedalaman, lalu menampilkan solusi terbaik.
- Semua perintah ke penyinggah akan diteruskan ke mesin catur dan hasil dari mesin catur ke pengguna.
Ini adalah cara terbaik yang bisa saya pikirkan saat ini, karena pada dasarnya ini sama seperti menggunakan mesin catur; perbedaannya, penyinggah akan menampilkan solusi terbaik yang mesin pernah kerjakan, selagi mesin mencari solusi yang lebih baik (solusi dengan nilai depth yang lebih besar).
Malangnya, saya belum mengimplementasikan ide ini. Setidaknya ide ini memmbuat saya semangat belajar tentang IPC (*inter-process communication). Tunggu perkembangan saya (semoga) bulan depan ya!