Sebuah Algoritma Genetika Invincible

Courtesy gambar DNA dari Paul Thiessen (saya telah memodifikasi gambar - aslinya indah Coba lihat.!)

Saya menikmati bermain dengan algoritma genetika - menonton mereka tumbuh dan berkembang. Dalam percobaan saya, yang selalu mensyaratkan organisme yang berkeliaran di sekitar layar saya mencari makanan sementara mengatasi rintangan, saya telah menyaksikan terpesona sebagai peradaban besar tumbuh dan membusuk. Saya menemukan kembali begitu banyak dari prinsip-prinsip dasar yang mungkin telah tahu untuk ahli biologi selama beberapa dekade, dan mungkin saja, beberapa yang tidak.

Suatu hari saya berspekulasi apakah algoritma genetika bisa berevolusi untuk menguasai permainan sederhana. Saya pikir mungkin permainan TicTacToe mungkin eksperimen yang baik untuk memulai dengan. Aku tahu dari analisis saya telah berusaha tahun yang lalu bahwa tidak mungkin tugas sederhana. Pernahkah Anda duduk dan mencoba untuk menganalisis permainan? Anda mulai menggambar diagram sedikit dari papan permainan, yang segera menjadi pohon yang tumbuh secara eksponensial saat Anda bekerja meskipun semua kemungkinan permutasi dari bermain game. Anda mungkin akan menyerah dalam waktu singkat sebagai meja Anda menjadi penuh dengan diagram kecil yang Anda tidak bisa mengikuti lagi. Aku melakukannya. Hidup ini terlalu singkat!

Aku sadar bahwa harus ada cara untuk mengotomatisasi tugas menganalisis permainan. Aku menulis algoritma kecil untuk bermain game dengan satu sama lain dengan membuat gerakan acak. Idenya adalah bahwa jika mereka bermain jutaan permainan, mereka terikat untuk bermain setiap permutasi yang mungkin dari permainan akhirnya. Saya hanya akan perlu untuk menangkap setiap posisi papan yang dihasilkan, melihat itu di meja berkembang untuk melihat apakah sudah memiliki salinan, menambahkannya ke meja jika tidak. Pada akhir itu, saya akan memiliki tabel yang mewakili setiap situasi yang mungkin. Tapi sebelum saya mulai, saya dianggap beberapa aturan sederhana untuk mempersempit kompleksitas.

Pada setiap langkah, saya memutuskan, sebuah 'filter' akan menganalisis papan dari sudut pandang pemain saat ini, dan menyelesaikan pola kemenangan yang jelas untuk dia atau memblokir kemenangan upaya yang jelas oleh lawannya. Saya memutuskan bahwa tugas sepele seperti itu tidak akan menjadi bagian dari organisme; sebaliknya ia akan memiliki keterampilan yang jauh lebih sulit untuk belajar - strategi. Saya membagi tabel menjadi dua. Saya ditugaskan pemain X sebagai salah satu yang selalu bergerak pertama, dan dia akan memiliki tabel setiap papan mungkin ia dapat disajikan dengan, dimulai dengan papan kosong menunggu langkah pertamanya. Aku melakukan hal yang sama untuk O, yang juga akan mengembangkan database setiap posisi yang pernah bisa bertemu, dimulai dengan papan dengan X tunggal di atasnya.

Akhirnya, untuk mempersempit jumlah kemungkinan papan, saya mengembangkan kode untuk memutar dan / atau 'mencerminkan' setiap papan yang diperlukan selama setiap perbandingan untuk menghilangkan duplikasi yang hanya karena papan yang sama diputar di ruang angkasa.

Sekarang bahwa saya telah memotong tugas ke ukuran dikelola, saya dialokasikan meja untuk menahan ribuan papan jika perlu, dan biarkan permainan dimulai. Aku berlari ini 'brute force' algoritma untuk satu juta game atau lebih, dan kagum untuk menemukan bahwa pada akhirnya, di bawah aturan yang ditetapkan di atas, hanya ada 57 mungkin 'papan' X harus mampu merespon, dan hanya 38 mungkin papan yang O akan pernah bertemu. Ini adalah jauh lebih sederhana dari yang saya bayangkan!

X hanya memiliki 3 pilihan unik untuk langkah pertama, jika Anda memutar dan / atau mencerminkan papan yang diperlukan untuk menghilangkan duplikasi. Dia bisa bermain sudut bergerak, sisi bergerak, atau mengambil pusat. Saya menemukan bahwa ia memiliki 7 pilihan pada 2 bergerak, 5 pilihan pada 3 bergerak, 3 pilihan pada 4 langkah, dan hanya satu pilihan pada 5 bergerak. Maka kita dapat membangun sebuah batas atas 3 * 7 * 5 * 3 * 1 = 315 game mungkin, meskipun dalam kenyataannya hanya sebagian kecil dari jalur yang mungkin diambil di luar beberapa bergerak. Banyak jalan menyebabkan terminasi dini permainan, dan lain-lain menyebabkan posisi yang sama ketika diputar atau tercermin dalam ruang. Menyaring semua kemenangan yang jelas atau kebutuhan yang jelas untuk blok menghilangkan posisi lain dari database. Pada akhirnya saya menemukan bahwa sedikitnya hanya 17 papan ditutupi setiap situasi organisme sangat berkembang pernah temui.

Papan permainan itu sendiri, memiliki 9 kotak, ditugaskan untuk sederhana array satu dimensi dengan 9 elemen. Tidak masalah dengan algoritma bagaimana mereka kotak yang diletakkan di dunia nyata. Ini hanya penting bahwa ia mampu berkembang respon yang tepat untuk setiap pola tertentu diserahkan kepadanya, ini menjadi nomor 0 sampai 8 mewakili bergerak dalam menanggapi pola disajikan.

Sekarang adalah mungkin untuk membuat algoritma genetika untuk bermain game. Pemain X akan memiliki 57 'gen', dalam kenyataannya sederhana array satu dimensi dari 57 elemen, setiap yang dapat mengambil nilai 0 sampai 8, dalam kombinasi dengan tabel data nya dari 57 situasi yang mungkin ia bisa temui dalam game apapun.

Algoritma akan mencari posisi dewan saat di mejanya. Saat ditemukan, indeks dari posisi di tabel papan menjadi indeks ke dalam tabel gen untuk mencari jawabannya. Demikian pula, algoritma O pemain akan memiliki tabel dari 38 situasi yang mungkin ia bisa temui dalam game, dan sebuah array dari 38 gen. -di Sini- adalah contoh. Sekarang akhirnya kita bisa mulai mengembangkan sebuah peradaban pemain tic tac toe.

Untuk memulai itu, saya memiliki sebuah array dari seribu pemain. Masing-masing 1.000 pemain ditugaskan secara acak (hukum) nilai untuk setiap gen, pilihannya untuk pindah ke salah satu kotak kosong di papan tulis. Saya mengembangkan pemain X atau O pemain secara terpisah. Apapun pemain, ia bermain melawan nomor acak generator.

Masing-masing dari 1000 organisme memainkan 1000 game, dan terakumulasi skor. Hanya 10 pemain terbaik yang dipilih untuk menjadi ayah dari generasi berikutnya. Masing-masing 10 pemain terbaik memiliki 99 anak. Masing-masing anak mereka menderita mutasi acak tunggal untuk satu gen-nya (meskipun saya telah menemukan dari pengalaman bahwa membayar untuk memberikan sejumlah kecil lebih dari satu mutasi). Jadi sekarang kita memiliki generasi baru untuk diuji, yang terdiri dari asli 10 pemenang dan semua keturunan mutan mereka. Setiap generasi baru ini memainkan ribu game, maka sekali lagi yang terbaik 10 pemain menjadi ayah dari generasi berikutnya.

Apa keajaiban itu untuk dilihat! Dalam waktu 6 sampai 10 generasi mereka telah mencapai puncaknya, dan aku mulai bereksperimen dengan poin diberikan untuk setiap kemenangan, imbang, atau kerugian. Saya menemukan bahwa jika mereka diberikan 1 poin untuk menang, 0 poin untuk hasil imbang, dan -1 point untuk kerugian, mereka berevolusi untuk meningkatkan menang pada tingkat yang mengagumkan. Dalam permainan antara dua pemain membuat bergerak acak, X (yang saya tetapkan untuk selalu pergi dulu) selalu menang melawan O sekitar 2 sampai 1. Jelas itu adalah keuntungan yang kuat untuk memiliki langkah pertama. Namun, pada saat organisme saya telah berevolusi beberapa generasi, O berdebar X dengan rasio 12 ke 1. (X membuat bergerak acak ketika tidak menghalangi atau mengambil kemenangan sederhana)

Setelah keberhasilan pertama ini, aku bertanya-tanya apakah saya bisa berkembang organisme yang tidak pernah kalah. Aku berhasil dalam usaha ini dengan meningkatkan hukuman untuk kehilangan drastis - seperti dikurangi 100 poin untuk setiap kerugian. Setelah beberapa generasi, tidak ada yang pernah kehilangan pertandingan lagi. Namun jumlah kemenangan juga menurun drastis.

Saya menemukan rasio yang tepat ganjaran dan hukuman untuk mendapatkan kinerja yang terbaik mungkin keluar dari organisme saya: menghadiahi mereka 1 poin untuk setiap menang dan sekitar negatif 6 atau 7 poin untuk setiap kerugian.

Saya sangat senang dengan hasilnya. Tidak hanya memiliki saya berkembang ras pemain juara, tapi apa yang mereka telah belajar untuk bermain adalah strategi . Ingat, semua menang sederhana atau blok yang disaring sebelum pernah mencapai organisme, dan lawan mereka juga diberikan kemampuan untuk unfailingly memblokir kemenangan sederhana atau bermain kemenangan sederhana mereka sendiri sebelum menghasilkan langkah acak.

Orang bisa mengatakan bahwa organisme genetik harus telah mengembangkan kapasitas untuk 'mengantisipasi' lebih dari satu gerakan ke depan, agar mampu mencegah lawan mereka dari yang pernah mampu membuat jebakan seperti yang ditakuti 'dua arah perpecahan' untuk mereka. Mereka juga tentu saja harus dapat 'berpikir' cukup jauh ke depan untuk meletakkan perangkap mereka sendiri, atau mereka tidak akan pernah menang. Sejak lawan mereka diberi kemampuan untuk selalu memblokir menang sederhana, satu-satunya cara untuk memenangkan pertandingan itu dengan mendirikan sebuah drama strategis setidaknya satu langkah di muka.

Saya sekarang memiliki suatu organisme tak terkalahkan, juara juara. Apa yang bisa saya lakukan dengan itu? Mungkin salah satu bisa menempatkan merpati dalam kotak Skinner dengan 9 tuas mematuk di. Jika ia mematuk tuas yang benar dalam menanggapi pola papan disajikan, ia akan dihargai dengan sebutir jagung, dan dengan demikian akhirnya belajar bermain TicTacToe. Atau, saya bisa menggunakannya untuk melatih -A Neural Network yang memainkan TicTacToe- !