Sorunun doğası gereği, çok sayıda arka plan bilgisi eklemem gerekiyor (çünkü sorum şu: bunu nasıl daraltabilirim?) Bu, (bilgimin en iyisine) şöyle özetlenebilir:
Çok büyük birleşik arama alanlarında yerel optimumları bulmak için hangi yöntemler var?
Arka fon
Araç destekli süper oyun topluluğunda, bir video oyun konsoluna veya emülatörüne bazı maliyetleri en aza indirmek için (genellikle tamamlanma süresi) özel hazırlanmış (gerçek zamanlı olarak oluşturulmamış) girdi sağlamaya çalışıyoruz. Bu anda yapılır yolu oyun çerçevesini kare oynayan ve her çerçeve için giriş belirterek, sık sık (örneğin koşmak defalarca parçalarını yineleme gereğidir, son yayınlanan yönelik çalışma Zelda Efsanesi: Zamanın Ocarina vardır toplam 198.590 yeniden deneme).
Bu koşuların hedeflerine ulaşması genellikle iki ana etkene iner: rota planlama ve çaprazlama. Birincisi, ikincisinden çok daha "yaratıcı" dır.
Rota planlama, oyuncunun oyunu tamamlamak için genel olarak hangi yoldan gitmesi gerektiğini belirler ve genellikle koşunun en önemli parçasıdır. Bu, örneğin hangi sıralama yönteminin kullanılacağını seçmeye benzer. Dünyadaki en iyi kabarcık türü, 1 milyon elementte hızlı bir sıralamadan daha iyi performans göstermeyecek.
Bununla birlikte, mükemmellik arzusunda, çaprazlama (rotanın nasıl yürütüldüğü) de büyük bir faktördür. Benzetime devam edilirse, sıralama algoritması bu şekilde uygulanır. Bazı rotalar çok özel girdi çerçeveleri olmadan gerçekleştirilemez. Bu, takım yardımının en sıkıcı sürecidir ve tamamlanmış bir koşu üretiminin aylar hatta yıllar sürmesini sağlar. Bu zor bir süreç değildir (bir insan için) çünkü bir kişi en iyi kabul edilene kadar aynı fikrin farklı varyasyonlarını denemeye gelir, ancak insanlar sadece dikkat aralıklarında çok fazla varyasyon deneyebilirler. Makinelerin bu göreve uygulanması burada doğru görünüyor.
Şimdi amacım genel olarak Nintendo 64 sistemi için geçiş sürecini otomatikleştirmek . Bu sorunun arama alanıdır uzak bir kaba kuvvet yaklaşımıyla saldırı çok büyük. Bir N64 çalışmasının n-kare segmentinde 2 30n olası giriş vardır, yani sadece 30 kare giriş (30FPS'de bir saniye) 2 900 olası girişe sahiptir; tam iki saatlik bir çalışma için, bu potansiyel çözümleri test etmek imkansızdır.
Ancak, tam bir toplamın toplam optimizasyonunu denemekle ilgilenmiyorum (ya da daha doğrusu denemeye bile çalışmıyorum). Bunun yerine, bir başlangıç girdisi göz önüne alındığında , bir çalışmanın belirli bir segmenti için (veya bir tür yarı-global optimizasyon için en yakın n yerel optimumlar) yerel optimumun yaklaşık olmasını istiyorum . Yani, bir rota ve bu rotanın ilk geçişi verildiğinde: maliyeti en aza indirmek için o geçişin komşularını araştırın, ancak sorunu çözebilecek tüm durumları denemeye dejenere etmeyin.
Bu nedenle programım bir başlangıç durumu, bir girdi akışı, bir değerlendirme fonksiyonu almalı ve değerlendirmenin sonucunu en aza indirerek yerel optimum çıktıyı almalıdır.
Şu anki durum
Şu anda baktığım tüm çerçeveye sahibim. Bu, bir giriş akışının öykünücünün manipülasyonu, kurulumu ve sökülmesi, konfigürasyon vb. Yoluyla değerlendirilmesini içerir. Ve bir tür yer tutucu olarak, optimize edici çok temel bir genetik algoritmadır. Giriş akışlarının bir popülasyonunu değerlendirir, kazananı depolar / değiştirir ve kazanan akışı değiştirerek yeni bir nüfus oluşturur. Bu süreç, zaman veya üretim numarası gibi bazı rastgele kriterler karşılanıncaya kadar devam eder.
Bu programın en yavaş kısmının açık bir şekilde bir girdi akışının değerlendirilmesi olacağını unutmayın . Bunun nedeni, oyunun n kare için taklit edilmesini içermesidir . (Zamanım olsaydı, bu tür şeylere kanca sağlayan kendi emülatörümü yazardım, ama şimdilik başka bir işlemden mevcut bir emülatör için mesajları sentezlemek ve belleği değiştirmekle kalıyorum.) Ana bilgisayarımda, oldukça modern, 200 kareyi değerlendirmek yaklaşık 14 saniye sürüyor. Bu nedenle, işlev değerlendirme sayısını en aza indiren bir algoritmayı (seçim verilir) tercih ederim.
Çerçeve içinde emülatörleri aynı anda yöneten bir sistem oluşturdum. Bu nedenle , bir dizi akışı bir kerede doğrusal bir performans ölçeğiyle değerlendirebilirim, ancak pratik olarak, çalışan emülatörlerin sayısı, sistem performansı kötüleşmeden önce sadece 8 ila 32 olabilir (ve 32 gerçekten itiyor). Bu, (seçim göz önüne alındığında), bir değerlendirme yapılırken işlem yapabilen bir algoritmanın oldukça faydalı olacağı anlamına gelir, çünkü optimizer bir değerlendirmeyi beklerken ağır kaldırma yapabilir.
Bir test olarak, değerlendirme fonksiyonum ( Banjo Kazooie oyunu için ), çerçeve başına, oyuncudan bir gol noktasına olan mesafeyi toplamaktı. Bu, en uygun çözümün bu noktaya mümkün olduğunca çabuk yaklaşmak olduğu anlamına geliyordu. Mutasyonu sadece analog çubukla sınırlamak, iyi bir çözüm elde etmek bir gün sürdü . (Bu, eşzamanlılığı uygulamadan önceydi.)
Eşzamanlılık ekledikten sonra, A düğmesine basma mutasyonunu etkinleştirdim ve aynı değerlendirme işlevini atlama gerektiren bir alanda yaptım. 24 emülatör çalışırken, başlangıçta boş bir giriş akışından hedefe ulaşmak yaklaşık 1 saat sürdü, ancak muhtemelen en iyi seviyeye yakın bir şeye ulaşmak için günlerce çalışması gerekiyordu.
Sorun
Karşılaştığım sorun, optimizasyon problemimi nasıl doğru bir şekilde modelleyeceğimizi bilmek için matematiksel optimizasyon alanı hakkında yeterince bilgim yok ! Örneğin, Wikipedia'da anlatıldığı gibi birçok algoritmanın kavramsal fikrini kabaca takip edebilirim, ancak sorunumu nasıl kategorilere ayıracağımı veya bu kategori için en son algoritmayı nasıl seçeceğimi bilmiyorum.
Söyleyebileceğim kadarıyla, son derece geniş bir mahallede birleşik bir problemim var . Bunun da ötesinde , değerlendirme işlevi son derece süreksizdir, gradyanı yoktur ve birçok plato vardır . Ayrıca, çok fazla kısıtlama yoktur, ancak sorunu çözmeye yardımcı olursa onları ifade etme yeteneğini memnuniyetle ekleyeceğim; Örneğin, Başlat düğmesinin kullanılmaması gerektiğini belirtmek istiyorum, ancak bu genel durum değil.
Soru
Benim sorum şu: bunu nasıl modelleyebilirim? Ne tür bir optimizasyon problemini çözmeye çalışıyorum? Hangi algoritmayı kullanmalıyım? Araştırma makaleleri okumaktan korkmuyorum, bu yüzden ne okumam gerektiğini bana bildirin!
Sezgisel olarak, genetik bir algoritma en iyisi olamazdı, çünkü gerçekten öğrenilmiş görünmüyor. Örneğin, Start tuşuna basmak değerlendirmeyi her zaman daha da kötüleştiriyor gibi görünüyorsa (oyunu duraklattığı için), öğrenen bir tür tasarımcı veya beyin olmalıdır: "herhangi bir noktada Start tuşuna basmak işe yaramaz." Göründüğü kadar bazen basarak başlangıç çünkü Ama bu bile hedefi olarak önemsiz değildir olduğunu böyle de "geri-uzun atlar pause" sözde olduğu gibi, optimum Süper Mario 64 ! Burada beynin çok daha karmaşık bir desen öğrenmesi gerekecekti: "Başlat'a basmak, oyuncunun bu çok özel durumda olması ve bazı tuş basma kombinasyonlarıyla devam etmesi dışında işe yaramaz ."
Görünüşe göre modifikasyon için daha uygun başka bir şekilde girdiyi temsil etmeliyim (veya makine öğrenmeyi öğrenebilir). Çerçeve başına girdi çok parçalı görünüyor, çünkü gerçekten ihtiyaç duyulan şey, birkaç kareye yayılabilen "eylemler" dir ... ancak birçok keşif kare kare yapılır, bu yüzden tamamen dışlayamam yukarıda belirtilen duraklama geriye-uzun atlama, çerçeve düzeyinde hassasiyet gerektirir). Ayrıca, girdinin seri olarak işlenmesi gerçeği, büyük harfle kullanılabilecek bir şey olmalı, ancak nasıl olduğundan emin değilim.
Şu anda (Reaktif) Tabu Arama, Çok Büyük Ölçekli Mahalle Arama, Öğretme-öğrenme tabanlı Optimizasyon ve Karınca Kolonisi Optimizasyonu hakkında okuyorum.
Bu problem rastgele genetik algoritmalardan başka bir şeyle başa çıkmak için çok mu zor? Yoksa aslında uzun zaman önce çözülen önemsiz bir sorun mu? Okuduğunuz için teşekkür eder, yanıtlarınız için şimdiden teşekkür ederiz.