Petunjuk Kecepatan
Cluedo / Clue adalah gim papan klasik dengan komponen gameplay pengurang yang menarik. Speed Clue adalah varian pemain 3-6 yang menekankan komponen ini hanya dengan menggunakan kartu. Hasilnya adalah bahwa satu-satunya perbedaan antara Cluedo standar dan Speed Clue adalah bahwa setiap pemain yang masih berada dalam permainan dapat membuat saran yang diinginkannya pada gilirannya alih-alih menunggu untuk mencapai ruangan tertentu dengan belas kasihan gulungan dadu dan saran pemain lain. Jika Anda belum pernah bermain Cluedo sebelumnya, atau ingin memastikan perbedaan eksplisit antara kedua versi, Anda mungkin menemukan aturan Speed Clue lengkap yang ditetapkan di sini .
Tujuan
Tulis dan kirimkan program AI untuk memainkan Speed Clue sebelum 15 Mei 2014 00:00 GMT. Setelah waktu itu, saya akan menjalankan turnamen menggunakan semua entri legal. Peserta yang AI-nya memenangkan pertandingan terbanyak di turnamen memenangkan tantangan.
Spesifikasi AI
Anda dapat menulis AI Anda dalam hampir semua bahasa yang Anda pilih, menggunakan teknik apa pun yang Anda gunakan, asalkan dengan ketat menggunakan protokol aplikasi melalui koneksi TCP / IP untuk bermain game dengan server. Penjelasan rinci tentang semua batasan dapat ditemukan di sini .
Cara bermain
Mulailah dengan membentuk repositori kontes GitHub . Tambahkan direktori di bawah
entries
direktori bernama menggunakan nama pengguna StackExchange Anda, dan kembangkan kode Anda di folder itu. Ketika Anda siap untuk mengirimkan entri Anda, buat permintaan tarik dengan revisi Anda, kemudian ikuti instruksi ini untuk mengumumkan entri Anda di situs ini.
Saya telah memberikan beberapa kode dan JAR dalam core
direktori untuk membantu Anda memulai; lihat situs saya untuk panduan kasar untuk materi. Selain itu, pemain lain mengirimkan kode pembantu di samping entri mereka untuk membantu Anda bangkit dan berjalan. Luangkan waktu untuk menjelajahi entri, dan jangan lupa untuk menguji entri Anda terhadap entri orang lain sebelum mengirimkan!
Hasil
Place | User | AI | Result
------+--------------+--------------------+-------------------------------------------------------
1 | gamecoder | SpockAI | 55.75%
2 | Peter Taylor | InferencePlayer | 33.06%
3 | jwg | CluePaddle | 20.19%
4 | Peter Taylor | SimpleCluedoPlayer | 8.34%
5 | gamecoder | RandomPlayer | 1.71%
---- | ray | 01 | Player "ray-01" [3] sent an invalid accuse message: ""
Hasil di atas menunjukkan persentase kemenangan setiap AI yang memenuhi syarat dari 25.200 pertandingan yang valid di mana ia berpartisipasi. Ada total 30.000 pertandingan yang dihitung untuk hasil, dan 6.100 atau lebih yang didiskon ketika 01
didiskualifikasi.
Disebutkan terhormat harus pergi ke ray 01
AI. Pengujian awal saya menunjukkan bahwa itu yang terkuat, dan saya mengharapkannya memenangkan persaingan. Namun, tampaknya memiliki bug yang sangat intermiten, sejauh yang saya duga, mengarahkannya untuk menghilangkan semua solusi yang mungkin. Turnamen telah menyelesaikan semua pertandingan tiga pemain dan telah memulai empat pertandingan pemain (12.000 pertandingan!) Ketika 01
bug terungkap. Jika saya hanya mempertimbangkan peringkat pertandingan 3-pemain, hasilnya terlihat seperti ini:
Place | User | AI | Result
------+--------------+--------------------+--------
1 | ray | 01 | 72.10%
2 | gamecoder | SpockAI | 51.28%
3 | Peter Taylor | InferencePlayer | 39.97%
4 | Peter Taylor | SimpleCluedoPlayer | 17.65%
5 | jwg | CluePaddle | 16.92%
6 | gamecoder | RandomPlayer | 2.08%
Saya sudah berencana melakukan beberapa data mining pada hasilnya, tetapi saya kelelahan. Saya mengalami kesulitan teknis dalam membuat kompetisi berjalan sepanjang (kegagalan daya, sistem reboot) yang mengharuskan sepenuhnya menulis ulang server kontes untuk menyimpan kemajuannya saat berjalan. Saya akan berkomentar dan melakukan semua perubahan pada kode dengan semua file hasil yang dihasilkan jika ada yang masih tertarik. Jika saya memutuskan untuk melakukan penambangan data juga, hasil saya juga akan ditambahkan ke repositori.
Terima kasih sudah bermain!
sumber
you must accept two port numbers: the first will be the port to which your program will listen, and the second will be the port to which your program will send.
, Mengapa dua port?Jawaban:
AI01 - Python 3
Saya belum dapat menemukan nama yang lebih baik untuknya :-P.
Identifier : ray-ai01
Teknologi : Python 3
Dipilih : ya
Argumen :
ai01.py identifier port
Deskripsi : Bekerja berdasarkan inferensi. Ketika jumlah kartu yang pemiliknya tidak diketahui kurang dari ambang, AI ini mulai menghilangkan semua solusi yang tidak mungkin dengan inferensi global rekursif. Kalau tidak, itu menggunakan inferensi lokal.
Kode AI dapat ditemukan di sini .
sumber
SpockAI
. Itu berkinerja cukup baik terhadap01
. Saya tidak tahu apakah itu akan memenangkan kompetisi, tapi saya senang melihat jumlah kemenangan Anda berkurang; )SimpleCluedoPlayer.java
Kelas ini menggunakan
AbstractCluedoPlayer
, yang menangani semua I / O dan memungkinkan logika bekerja dengan antarmuka yang diketik sederhana. Semuanya ada di github .Ini mengalahkan pemain acak dengan probabilitas tinggi (dalam kasus terburuk dibutuhkan 15 saran, sedangkan pemain acak mengambil rata-rata 162), tetapi akan mudah dikalahkan. Saya menawarkannya untuk membuat bola bergulir.
sumber
SpockAI
Identifier:
gamecoder-SpockAI
Entri Repo: klik di sini
Dipilih: Ya
Teknologi: Java 7 berdasarkan
com.sadakatsu.clue.jar
Argumen:
{identifier} portNumber [logOutput: true|false]
Deskripsi:
SpockAI
adalah pemain Speed Clue yang dibangun di atas kelasKnowledge
yang saya tulis. TheKnowledge
kelas mewakili semua negara yang mungkin bahwa permainan bisa mengingat apa yang telah terjadi sejauh ini. Ini mewakili solusi permainan dan tangan pemain yang mungkin sebagai set, dan menggunakan deduksi berulang untuk mengurangi set ini sejauh mungkin setiap kali sesuatu dipelajari.SpockAI
menggunakan kelas ini untuk menentukan saran mana yang dipastikan memiliki hasil kasus terburuk yang paling membantu dan secara acak memilih salah satu saran tersebut pada gilirannya. Ketika perlu menyangkal saran, ia mencoba menunjukkan kartu yang sudah menunjukkan AI yang menyarankan atau menunjukkannya kartu dari kategori yang paling sedikit mengurangi kemungkinan. Itu hanya membuat tuduhan ketika tahu solusinya.Heuristik yang saya gunakan untuk menentukan saran terbaik adalah sebagai berikut. Setelah semua informasi telah dipelajari dari suatu saran, solusi yang mungkin dan set hand pemain yang mungkin akan berkurang (kecuali saran itu tidak mengungkapkan informasi baru). Secara teoritis, saran terbaik adalah yang paling mengurangi jumlah solusi yang mungkin. Dalam kasus seri, saya berasumsi bahwa saran yang paling mengurangi jumlah tangan yang mungkin untuk pemain adalah lebih baik. Jadi, untuk setiap saran, saya mencoba setiap hasil yang mungkin yang tidak mengarah pada kontradiksi dalam pengetahuan. Hasil mana pun yang memiliki peningkatan paling sedikit dalam jumlah solusi / tangan diasumsikan sebagai hasil saran tersebut. Lalu saya membandingkan semua hasil saran, dan memilih mana yang memiliki hasil terbaik. Dengan cara ini, saya menjamin perolehan informasi kasus terburuk yang optimal.
Saya sedang mempertimbangkan untuk menambahkan analisis kombinasi brute force dari solusi yang mungkin dan kemungkinan tangan pemain untuk membuat
SpockAI
lebih kuat, tetapi karenaSpockAI
sudah menjadi entri paling lambat dan paling intensif sumber daya, saya mungkin akan melewatkan itu.Penolakan:
Saya berniat untuk merilis AI untuk kontes ini minggu lalu. Seperti berdiri, saya tidak dapat mulai menulis AI saya sampai Jumat pekan lalu, dan saya terus menemukan bug konyol dalam kode saya. Karena itu, satu-satunya cara saya bisa mulai
SpockAI
bekerja sebelum tenggat waktu adalah menggunakan kolam utas yang besar. Hasil akhirnya adalah bahwa (saat ini) SpockAI dapat menekan + 90% pemanfaatan CPU dan 2GB + penggunaan memori (meskipun saya menyalahkan pengumpul sampah untuk ini). Saya berniat ikutSpockAI
dalam kontes, tetapi jika orang lain merasa itu adalah pelanggaran aturan , saya akan menghadiahkan gelar "pemenang" ke tempat kedua yang harusSpockAI
menang. Jika Anda merasa seperti ini, silakan tinggalkan komentar untuk efek itu pada jawaban ini.sumber
InferencePlayer.java
Kode lengkap pada Github (catatan: ini menggunakan sama
AbstractCluedoPlayer
dengan saya sebelumnyaSimpleCluedoPlayer
).Inti sebenarnya dari pemain ini adalah
PlayerInformation
kelasnya (di sini sedikit dipangkas):Ini menyatukan informasi tentang saran yang pemain tidak membuktikan (menunjukkan bahwa mereka tidak memegang kartu-kartu itu), saran yang mereka tolak (menunjukkan bahwa mereka memegang setidaknya satu dari kartu-kartu itu), dan kartu-kartu yang lokasinya pasti. Kemudian secara iteratif menerapkan beberapa aturan dasar untuk memadatkan informasi itu menjadi esensinya.
Saya tidak berpikir ada informasi deterministik lagi yang bisa diperoleh (kecuali dari tuduhan salah, yang saya anggap terlalu jarang untuk diganggu), walaupun saya mungkin telah mengabaikan sesuatu. ada adalah potensi pemain yang lebih canggih untuk probabilitas memperkirakan bahwa pemain X memiliki kartu Y ...
Bidang lain yang mungkin mengakui peningkatan yang signifikan adalah dalam memutuskan saran mana yang akan dibuat. Saya berusaha untuk memaksimalkan perolehan informasi dengan menggunakan pendekatan gaya berat yang cukup kikuk, tetapi ada banyak heuristik yang dibenarkan buruk dalam mengevaluasi manfaat relatif pengetahuan yang diperoleh dari berbagai penolakan hipotesis. Namun, saya tidak akan mencoba menyetel heuristik sampai orang lain memposting lawan yang layak.
sumber
/tmp
. Itu harus berupa tambalan sederhana; Saya akan memeriksanya sebentar lagi.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
Saya telah menulis ClueBot, klien C # yang mudah untuk mengimplementasikan AI, dan berbagai AI, termasuk upaya paling serius yang disebut CluePaddle. Kode ini di https://github.com/jwg4/SpeedClueContest/tree/clue_paddle dengan permintaan tarik mulai untuk menggabungkannya ke hulu.
ClueStick adalah pembuktian konsep yang pada dasarnya hanya menebak dan mengabaikan sebagian besar dari apa yang terjadi. ClueBat adalah AI bodoh lainnya, kecuali bahwa ia mencoba untuk mengeksploitasi kelemahan di ClueStick untuk memaksanya melakukan tuduhan palsu. ClueByFour adalah AI wajar yang membuat saran yang masuk akal dan mengingat kartu yang ditunjukkan oleh orang lain.
CluePaddle adalah yang paling cerdas. Ia mencoba untuk mencari tahu siapa yang memiliki apa yang didasarkan tidak hanya pada apa yang telah ditawarkan oleh penolakan, tetapi juga berdasarkan pada para pemain yang tidak menawarkan penolakan terhadap saran yang diberikan. Tidak memperhitungkan berapa banyak kartu yang dimiliki masing-masing pemain tetapi ini harus diperbaiki. Ini termasuk beberapa kelas yang cukup panjang sehingga saya tidak akan memposting seluruh kode di sini, tetapi metode berikut memberikan rasa.
Jika 4 bermain melawan satu sama lain, CluePaddle menang sejauh ini di sebagian besar permainan, dengan ClueByFour kedua dan dua lainnya tidak ada.
Hanya CluePaddle yang merupakan entri kompetitif (sejauh ini). Pemakaian:
Jika ada orang lain yang ingin membuat C # AI, buat saja proyek ConsoleApplication di soltution, terapkan
IClueAI
antarmuka di kelas, dan kemudian buatProgram
dariProgramTemplate
dan salin apa yang dilakukan proyek lainMain()
. Satu-satunya ketergantungan adalah NUnit untuk pengujian unit dan Anda dapat dengan mudah menghapus semua pengujian dari kode (tetapi jangan, cukup instal NUnit).sumber
CluePaddle
proyek tidak mengkompilasi, mengklaim bahwaNUnit
tidak diinstal meskipun proyek lain melakukan kompilasi. Mereka yang melakukan kompilasi akhirnya berhenti selama pengujian, dan Java melaporkan kesalahan setel ulang koneksi. Bisakah Anda membantu saya menentukan apakah saya mungkin melakukan sesuatu yang salah?ClueStick
adalah satu-satunya AI yang berhenti ketika saya mencoba untuk memulainya. Dua lainnya bersaing di turnamen percobaan dan akhirnya didiskualifikasi karena pelanggaran yang sama.ClueByFour
akan didiskualifikasi karena gagal mengulangi saran yang tidak terbukti itu dibuat sebagai tuduhan ketika tidak memegang salah satu kartu.ClueBat
akan didiskualifikasi karena membuat tuduhan yang memiliki kartu yang ditunjukkan atau ada di tangannya. Silakan periksa pembatasan AI yang direvisi untuk memastikan kepatuhan.CluePaddle
. Saya akan melakukan permintaan tarik untuk ini nanti.