Saya mencoba untuk menulis pemecah dalam C # .NET untuk permainan yang dikenal sebagai Flowerz. Untuk referensi Anda, Anda dapat memainkannya di MSN, di sini: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Saya menulisnya untuk bersenang-senang, bukan untuk semua jenis tugas atau pekerjaan apa pun yang terkait. Karena itu, satu-satunya batasan adalah komputer saya (intel i7 core, dengan 8GB RAM). Itu tidak perlu dijalankan di tempat lain, sejauh yang saya ketahui.
Singkatnya, aturannya seperti ini:
- Ada antrian penuh dengan bunga berwarna. Panjangnya sewenang-wenang
- Antrian tidak dapat dipengaruhi
- Antrian dibuat di awal level
- Bunga memiliki satu atau dua warna.
- Jika ada dua warna, maka ada warna luar, dan warna dalam. Dalam kasus dua warna, warna luar digunakan untuk pencocokan.
- Jika ada kecocokan, maka warna luar menghilang dan bunga sekarang menjadi bunga warna tunggal dengan warna yang sama dengan bunga dalam
- Tujuan permainan ini adalah untuk membuat pertandingan tiga (atau lebih) dengan warna yang sama
- Ketika bunga dengan warna tunggal adalah bagian dari korek api, bunga itu dihilangkan dari lapangan bermain, menciptakan ruang kosong
- Anda dapat mencocokkan bunga warna tunggal dengan warna luar bunga dua warna. Dalam hal ini, warna bunga tunggal menghilang, warna luar bunga dua warna menghilang dan warna bagian dalam tetap ada
- Anda memenangkan ronde ketika antrian kosong dan setidaknya ada satu ruang kosong yang tersisa
- Pencocokan Cascading dimungkinkan. Kaskade adalah ketika tiga (atau lebih) bunga luar menghilang, dan ketika warna bagian dalam mereka membentuk rantai 3 (atau lebih banyak bunga) lainnya.
- Lapangan bermain selalu 7x7
- Beberapa ruang di lapangan ditutupi oleh batu
- Anda tidak dapat menempatkan bunga di atas batu
- Antrian juga dapat berisi sekop yang dapat Anda gunakan untuk memindahkan bunga yang ditempatkan ke ruang kosong
- Anda harus menggunakan sekop, tetapi Anda tidak benar-benar harus memindahkan bunga: sangat legal untuk meletakkannya kembali dari tempat asalnya.
- Antrian juga dapat berisi kupu-kupu berwarna. Saat Anda menggunakan kupu-kupu ini pada bunga, maka bunga itu mendapatkan warna kupu-kupu
- Menerapkan kupu-kupu pada bunga dengan dua warna, menghasilkan bunga hanya mendapatkan satu warna, yaitu kupu-kupu
- Anda dapat membuang kupu-kupu di ruang kosong atau bunga yang sudah memiliki warna ini
- Membersihkan lapangan tidak memenangkan pertandingan
Tujuan dari solver itu sederhana: temukan cara untuk mengosongkan antrian, dengan sebanyak mungkin ruang sisa di lapangan bermain. Pada dasarnya, AI memainkan game untuk saya. Output dari solver adalah daftar dengan gerakan yang ditemukannya. Saya tidak tertarik dengan skor, tetapi bertahan selama mungkin, maka saya tertarik pada gerakan yang meninggalkan ruang terbuka sebanyak mungkin.
Tak perlu dikatakan, ruang pencarian tumbuh dengan cepat semakin besar antrian yang didapat, sehingga kekuatan kasar keluar dari pertanyaan. Antrian dimulai pada 15, dan tumbuh dengan 5 setiap dua atau tiga level, jika saya ingat benar. Dan, tentu saja, menempatkan bunga pertama pada (0,0) dan yang kedua pada (0,1) berbeda dari menempatkan bunga pertama pada (1,0) dan bunga kedua pada (0,0), terutama ketika lapangan sudah diisi dengan bunga dari babak sebelumnya. Keputusan sederhana seperti itu dapat membuat perbedaan dalam membuatnya atau tidak.
Pertanyaan yang saya miliki adalah sebagai berikut:
- Masalah apa ini? (pikirkan penjual keliling, ransel, atau masalah kombinatorial lainnya). Mengetahui ini bisa membuat Google-fu saya sedikit lebih baik.
- Algoritme apa yang bisa memberi saya hasil yang baik, cepat?
Mengenai yang terakhir: Pada awalnya, saya mencoba untuk menulis algoritma heuristik saya sendiri (pada dasarnya: bagaimana saya menyelesaikannya, jika saya tahu antrian?), Tetapi itu menghasilkan banyak kasus tepi dan pencocokan skor yang mungkin saya lewatkan.
Saya sedang berpikir untuk menggunakan algoritma genetika (karena saya setidaknya tahu bagaimana menggunakannya ...), tapi saya mengalami beberapa masalah dalam memutuskan representasi biner dari papan. Lalu ada masalah crossover, tapi itu bisa diselesaikan dengan operator crossover yang dipesan atau jenis operasi serupa.
Dugaan saya adalah bahwa pemecah harus selalu mengetahui konfigurasi papan dan antrian itu mencoba mengosongkan.
Saya tahu beberapa algoritma heuristik lain seperti jaringan saraf dan sistem logika fuzzy, tetapi saya tidak memiliki pengalaman untuk mengetahui mana yang paling cocok untuk diterapkan, atau jika ada yang lain yang lebih cocok untuk tugas yang dihadapi.