Karena sifat pertanyaan, saya harus memasukkan banyak informasi latar belakang (karena pertanyaan saya adalah: bagaimana saya mempersempit ini?) Yang mengatakan, itu dapat diringkas (sesuai pengetahuan saya) sebagai:
Metode apa yang ada untuk menemukan optimum lokal pada ruang pencarian kombinatorial yang sangat besar?
Latar Belakang
Dalam komunitas superplay yang dibantu alat, kami berupaya memberikan input yang dibuat secara khusus (tidak dihasilkan secara langsung) ke konsol video game atau emulator untuk meminimalkan biaya (biasanya penyelesaian waktu). Cara ini saat ini dilakukan adalah dengan memainkan permainan frame-by-frame dan menentukan input untuk masing-masing frame, sering mengulangi bagian dari run berkali-kali (misalnya, menjalankan baru - baru ini diterbitkan untuk The Legend of Zelda: Ocarina of Time memiliki total 198.590 coba lagi).
Membuat lari ini mendapatkan tujuan mereka biasanya datang ke dua faktor utama: perencanaan rute dan traversal. Yang pertama jauh lebih "kreatif" daripada yang terakhir.
Perencanaan rute menentukan arah mana pemain harus menavigasi secara keseluruhan untuk menyelesaikan permainan, dan seringkali merupakan bagian terpenting dari proses. Ini analog dengan memilih metode penyortiran mana yang akan digunakan, misalnya. Jenis gelembung terbaik di dunia tidak akan mengungguli jenis cepat pada 1 juta elemen.
Namun, dalam hasrat untuk kesempurnaan, traversal (bagaimana rute dilakukan) juga merupakan faktor yang sangat besar. Melanjutkan analoginya, ini adalah bagaimana algoritma pengurutan diimplementasikan. Beberapa rute bahkan tidak dapat dilakukan tanpa kerangka input yang sangat spesifik. Ini adalah proses bantuan alat yang paling membosankan dan inilah yang membuat produksi proses yang lengkap membutuhkan waktu berbulan-bulan atau bahkan bertahun-tahun. Ini bukan proses yang sulit (bagi manusia) karena harus mencoba variasi yang berbeda dari ide yang sama sampai seseorang dianggap yang terbaik, tetapi manusia hanya dapat mencoba begitu banyak variasi dalam rentang perhatian mereka. Penerapan mesin untuk tugas ini tampaknya tepat di sini.
Tujuan saya sekarang adalah mencoba mengotomatiskan proses traversal secara umum untuk sistem Nintendo 64 . Ruang pencarian untuk masalah ini adalah jauh terlalu besar untuk menyerang dengan pendekatan brute-force. Segmen n-frame dari N64 run memiliki 2 30N masukan mungkin, yang berarti hanya 30 frame dari input (kedua di 30fps) memiliki 2 900 input mungkin; mustahil untuk menguji solusi potensial ini, apalagi solusi untuk jangka waktu dua jam penuh.
Namun, saya tidak tertarik untuk mencoba (atau lebih tepatnya, saya bahkan tidak akan mencoba untuk mencoba) total optimasi global yang berjalan penuh. Sebaliknya, saya ingin, diberi masukan awal, perkiraan lokal optimum untuk tertentu segmen dari run (atau yang terdekat n lokal optimums, untuk semacam optimasi semi-global) . Yaitu, diberi rute dan lintasan awal dari rute itu: cari tetangga dari lintasan itu untuk meminimalkan biaya, tetapi jangan turun untuk mencoba semua kasing yang bisa menyelesaikan masalah.
Program saya karena itu harus mengambil keadaan awal, aliran input, fungsi evaluasi, dan output optimum lokal dengan meminimalkan hasil evaluasi.
Kondisi saat ini
Saat ini saya memiliki semua kerangka kerja yang diurus. Ini termasuk mengevaluasi aliran input melalui manipulasi emulator, setup dan teardown, konfigurasi, dll. Dan sebagai pengganti, pengoptimal adalah algoritma genetika yang sangat mendasar. Ini hanya mengevaluasi populasi aliran input, menyimpan / menggantikan pemenang, dan menghasilkan populasi baru dengan memutasikan aliran pemenang. Proses ini berlanjut hingga beberapa kriteria arbitrer dipenuhi, seperti waktu atau nomor generasi.
Perhatikan bahwa bagian paling lambat dari program ini adalah, sejauh ini, evaluasi aliran input . Ini karena ini melibatkan meniru permainan untuk n bingkai. (Jika saya punya waktu saya akan menulis emulator saya sendiri yang menyediakan kait ke hal-hal semacam ini, tetapi untuk sekarang saya pergi dengan mensintesis pesan dan memodifikasi memori untuk emulator yang ada dari proses lain.) Di komputer utama saya, yang cukup modern, mengevaluasi 200 frame membutuhkan sekitar 14 detik. Karena itu, saya lebih suka algoritma (diberi pilihan) yang meminimalkan jumlah evaluasi fungsi.
Saya telah membuat sistem dalam kerangka kerja yang mengelola emulator secara bersamaan. Dengan demikian saya dapat mengevaluasi sejumlah aliran sekaligus dengan skala kinerja linier, tetapi secara praktis jumlah emulator yang berjalan hanya bisa 8 hingga 32 (dan 32 benar-benar mendorongnya) sebelum kinerja sistem menurun. Ini berarti (diberi pilihan), suatu algoritma yang dapat melakukan pemrosesan saat evaluasi berlangsung akan sangat bermanfaat, karena pengoptimal dapat melakukan beberapa pekerjaan berat sambil menunggu evaluasi.
Sebagai ujian, fungsi evaluasi saya (untuk game Banjo Kazooie ) adalah untuk menjumlahkan, per frame, jarak dari pemain ke titik tujuan. Ini berarti solusi optimal adalah sedekat mungkin ke titik itu. Membatasi mutasi hanya pada stik analog, butuh waktu sehari untuk mendapatkan solusi yang oke . (Ini sebelum saya menerapkan konkurensi.)
Setelah menambahkan konkurensi, saya mengaktifkan mutasi dari penekanan tombol A dan melakukan fungsi evaluasi yang sama di area yang membutuhkan lompatan. Dengan 24 emulator berjalan, kira-kira 1 jam untuk mencapai tujuan dari aliran input yang awalnya kosong, tetapi mungkin perlu berjalan selama berhari-hari untuk mencapai apa pun yang mendekati optimal.
Masalah
Masalah yang saya hadapi adalah saya tidak cukup tahu tentang bidang optimisasi matematis untuk mengetahui cara memodelkan masalah optimasi saya dengan benar ! Saya kira-kira dapat mengikuti ide konseptual dari banyak algoritma seperti yang dijelaskan di Wikipedia, misalnya, tetapi saya tidak tahu bagaimana mengkategorikan masalah saya atau memilih algoritma canggih untuk kategori itu.
Dari apa yang bisa saya katakan, saya memiliki masalah kombinatorial dengan lingkungan yang sangat besar . Selain itu, fungsi evaluasi sangat diskontinyu, tidak memiliki gradien, dan memiliki banyak dataran tinggi . Juga, tidak ada banyak kendala, meskipun saya dengan senang hati akan menambahkan kemampuan untuk mengungkapkannya jika itu membantu menyelesaikan masalah; Saya ingin mengizinkan menetapkan bahwa tombol Start tidak boleh digunakan, misalnya, tetapi ini bukan kasus umum.
Pertanyaan
Jadi pertanyaan saya adalah: bagaimana saya memodelkan ini? Apa masalah optimasi yang saya coba selesaikan? Algoritma mana yang harus saya gunakan? Saya tidak takut membaca makalah penelitian, jadi beri tahu saya apa yang harus saya baca!
Secara intuitif, algoritma genetika tidak bisa menjadi yang terbaik, karena sepertinya tidak benar-benar belajar. Misalnya, jika menekan Mulai tampaknya selalu membuat evaluasi menjadi lebih buruk (karena itu menghentikan permainan), harus ada semacam desainer atau otak yang belajar: "menekan Mulai pada titik mana pun tidak berguna." Tetapi bahkan tujuan ini tidak sepele kedengarannya, karena kadang-kadang menekan awal adalah optimal, seperti dalam apa yang disebut "jeda mundur panjang-melompat" di Super Mario 64 ! Di sini otak harus belajar pola yang jauh lebih kompleks: "menekan Mulai tidak berguna kecuali ketika pemain berada dalam keadaan yang sangat spesifik ini dan akan melanjutkan dengan beberapa kombinasi penekanan tombol ."
Sepertinya saya harus (atau mesin bisa belajar) mewakili input dengan cara lain yang lebih cocok untuk modifikasi. Input per-bingkai tampaknya terlalu terperinci, karena yang benar-benar dibutuhkan adalah "aksi", yang dapat menjangkau beberapa frame ... namun banyak penemuan dibuat berdasarkan frame-by-frame, jadi saya tidak dapat sepenuhnya mengesampingkannya (yang jeda yang disebutkan sebelumnya mundur-lompat jauh membutuhkan presisi tingkat-bingkai). Sepertinya fakta bahwa input diproses secara serial harus menjadi sesuatu yang dapat dikapitalisasi, tapi saya tidak yakin bagaimana caranya.
Saat ini saya sedang membaca tentang Pencarian Tabu (Reaktif), Pencarian Lingkungan Sangat Besar, Optimasi Berbasis Pembelajaran, dan Optimasi Koloni Semut.
Apakah masalah ini terlalu sulit untuk diatasi dengan apa pun selain algoritma genetika acak? Atau apakah itu sebenarnya masalah sepele yang sudah dipecahkan sejak lama? Terima kasih telah membaca dan terima kasih sebelumnya atas segala tanggapan.