Emülatör giriş optimizasyon sorunumu nasıl sınıflandırırım ve hangi algoritma ile yaklaşmalıyım?


10

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.


Yayınınız oldukça uzun, konuyla ilgili kısa bir bölüme sahip olmanız, ekstra arka plan bilgisi olmadan soruyu net terimlerle belirtmeniz okuyuculara yardımcı olacaktır.
Kaveh

@Kaveh: Bunun uzunluğunu anlıyorum, ancak sorunun doğası nedeniyle daraltılması oldukça zor, çünkü bunu nasıl daraltacağımı soruyorum. :(

Yanıtlar:


6

Sorunuzda verdiğiniz bilgilerden, standart optimizasyon yöntemlerinin (bildiğim) nasıl uygulanacağını göremiyorum. Nesneleriniz o kadar karmaşık değil (daha sonra daha fazla), ancak hedef işleviniz kötü bir işlevdir: değerleri, kontrolünüz dışındaki harici bir sistem tarafından tanımlanır, herhangi bir hoş özelliğe sahip olması olası değildir. Bu nedenle, genetik algoritmalar kullanmak burada mümkün değil ve belki de iyi bir yaklaşım değil; Sorununuzun yapısı hakkında hiçbir fikriniz yoksa, genellikle diğer yöntemlerden daha iyi çalışırlar. Dikkate alınması gereken çok şey var

  • nesne alanı,
  • hedef fonksiyon ve
  • genetik algoritmanızın parametreleri,

bu yüzden detaylandırmama izin ver.

Nesneleriniz neler?

Şunu zaten cevapladınız: her biri bir kare alan bir dizi eyleme bakıyorsunuz. Bunun çok ince taneli olabileceğini düşünüyorum; belki her biri bir süre (kare sayısı olarak) olan bir dizi eylem deneyin. Bu, "A'ya bir baskı yapmak" dan farklı olasılıklara sahip olmak için "biraz daha uzun yürüme" gibi mutasyonların doğal bir şekilde elde edilmesini sağlayacaktır. Neyin en iyi çalıştığını deneyin; diğer malzemeleri düşündükten sonra bu öğeyi tekrar ziyaret etmeniz gerekebilir.

Hedef fonksiyonunuz nedir?

Bu gerçekten çok önemli. Neyi optimize etmek istiyorsunuz? Hedefe ulaşma zamanı? Farklı eylem sayısı? Toplanan yıldız sayısı? Birkaç faktörün kombinasyonu? Birden fazla hedef alır almaz, işler kıllılaşır - orada (genellikle) artık optima olmaz!

Hedefe zaman ayırdınız. Bu muhtemelen iyi bir hedef işlevi değildir. Neden? Çoğu sekans hedefe bile ulaşamayacağı için, sabit bir noktaya kadar dip çizgisi oluşturacak ve böyle bir fitness manzarası oluşturacak (bir boyutta kavramsal çizim):

resim açıklamasını buraya girin
[ kaynak ]

00

11+final distance to goal+11+time to goal

011

Peki mesafeyi nasıl ölçersiniz? Doğrusal mesafe cazip gelebilir, ancak sorunları vardır; yine yanlış sinyaller gönderilebilir. Bu basit senaryoyu düşünün:

resim açıklamasını buraya girin
[ kaynak ]

Üst koridora atlayarak başlayan her dizi, hedefin hemen üzerinde bir noktaya ulaşıncaya kadar iyileşir, ancak aslında hedefe ulaşamaz! Daha da kötüsü, hedefe ulaşmayan tüm diziler arasında, yükselenler aşağı inenler kadar iyidir, bu nedenle GA açıkça mahkum olan dizileri reddedemez. Başka bir deyişle, doğrusal mesafe, seviyede ölü uçlar varsa GA'yı yakalayabilen özellikle kötü yerel optima oluşturur.

Bu nedenle, oyun karakteri birinden diğerine geçebiliyorsa, seviyenize bir ızgara yerleştirmenizi ve komşu noktaları bağlamanızı öneririm. Ardından hedeften uzaklığı, dizinin karakteri hedefe en yakın noktaya indirdiği noktaya en yakın noktadan en kısa yolun uzunluğunu hesaplarsınız. Bu hesaplamak kolaydır ve ölülere (yerel optima) yürümek hemen cezalandırılır¹. Tabii ki seviye verilere erişmeniz gerekiyor, ama bunlara sahip olduğunuzu varsayıyorum.

GA'nız nasıl çalışır?

Şimdi gerçek genetik algoritmaya ulaşabiliriz. Kilit hususlar popülasyon, seçim, üreme / mutasyon ve durdurma kriteridir.

nüfus

Nasıl büyük senin nüfus olacak? Çok küçükse, iyi bir çözüme ulaşmak için gerekli çeşitliliği sağlamayabilir . Çok büyükse, işlemi yavaşlatan gereksiz önemsiz taşımanız daha olasıdır.

Nüfusunuzu nasıl başlatırsınız ? Rastgele aksiyon dizileri seçiyor musunuz? Eğer öyleyse, hangi uzunlukta? Belki de hedefe ulaşacak şekilde (az sayıda) elle üretilmiş, makul bir çözümünüz var mı?

seçim

k

Buradaki temel kavram seçim baskısıdır : hayatta kalmak ne kadar zor? Çok küçük yapın ve bok çözümlerini ayıklamayın. Çok yüksek yapın ve değişikliği (özellikle yerel optima arasında hareket etmek) zorlaştırırsınız.

Üreme ve Mutasyon

Bir turda hayatta kalanlarınızı seçtikten sonra, onlardan gelecek nesli oluşturmanız gerekir (ebeveynler hayatta kalır ve bir sonraki neslin bir parçası mıdır?). İki ana strateji vardır: mutasyon ve rekombinasyon.

Mutasyonlar oldukça açıktır, ancak özellikler farklı olabilir. Bireyin sekansındaki her pozisyon için, onu bir olasılıkla mutasyona uğratın. Bunu her pozisyon için bağımsız olarak yapabilir veya mutasyon sayısını rastgele seçebilir veya farklı olasılıklarla farklı mutasyonlar gerçekleştirebilirsiniz (yeni bir eleman eklemek, birini kaldırmak, birini değiştirmek, ... gibi). Mutasyon genellikle küçük değişikliklerle ilgilidir.

İki veya daha fazla çözümün yönlerini yeni bir çözümle birleştiren rekombinasyon daha zordur, ancak büyük adımlara izin verebilir , bu da bir "fitness dağ" ı bırakarak doğrudan bir başkasının eğimine doğru hareket eder (daha yüksek olabilir). Klasik bir fikir geçittir ; Burada bunun mantıklı olup olmadığını bilmiyorum (bana göre belirli bir dizinin önekini başka bir şey için değiştirmenin büyük olasılıkla soneki devalüe edeceği). Belki bunu yönlendirmek için sıranın farklı noktalarındaki oyun karakterinin seviyesi ve pozisyonları hakkındaki bilgileri kullanabilirsiniz, yani sadece karakterin her iki dizide de aynı konumda olduğu çapraz noktalar yaratır.

Sonlandırma

Nk1n


Gördüğünüz gibi, tüm bunlar gerçek performansı etkilemek için iç içe geçiyor. Paralel olarak birden fazla popülasyon çalıştırırsanız, göç ve / veya felaketler nedeniyle genetik sürüklenme uygulamayı düşünebilirsiniz . Yolunuza rehberlik edecek çok az teori var, bu yüzden farklı kurulumları denemeniz ve sizi nereye götürdüğüne bakmanız gerekiyor. Umarım, bir seviye için işe yarayan başkaları için de işe yarayacaktır. Müjde mutlu!

Not: Yukarıdakilerin ışığında BoxCar 2D'ye bakın . Bazı şeyleri oldukça iyi yapıyorlar (diğerleri değil,) ve bir GA'nın parametrelerinin performansını nasıl etkileyebileceğine dair bir sezgi alabilirsiniz.


  1. Aslında, bu uygunluğu kullanarak açgözlülükle bir dizi oluşturmak, yani olası tüm sonraki eylemlerden hedefe mesafeyi en aza indiren eylemi seçmek oldukça iyi çalışabilir. GA'yı kullanmadan önce bunu deneyin!
  2. Elbette, gözlemci olarak şimdiye kadar karşılaşılan en iyi çözümü hatırlarsınız.

1
Güzel! İki soru. MOO'da (genellikle) hiç optima olmadığını söyleten nedir? Noktalar Pareto optimal, yani başka bir şeyden ödün vermeden bir şey üzerinde gelişemezsiniz. Onlara değer vermek modelleyiciye kalmış. Ayrıca, küçük olasılıkla küçük değişiklikler hakkında mutasyon değil mi? Büyük mutasyon olasılıkları ile, arama genellikle performansa zarar veren rastgele, yönlendirilmemiş hareketler yapma eğilimindedir. Küçük mutasyon olasılıklarının en iyi sonucu verdiğini düşünüyorum.
Juho

1/nn1

Tamam anlıyorum. Üçüncü noktaya gelince, evet, tam olarak böyle bir şey demek istedim. Teşekkürler!
Juho

Tüm bilgiler için teşekkürler.! Gerçekten güzelce benim anlayış açıklayan cevap ortaya koydu.
GManNickG

1

Öğretme-öğrenme tabanlı optimizasyon (TLBO) yöntemi ve kodu hakkında daha fazla bilgi için aşağıdaki makaleye bakın:

R. Venkata Rao ve V. Patel'in karmaşık kısıtlı optimizasyon problemlerini çözmek için elitist bir öğretme-öğrenme tabanlı optimizasyon algoritması ; Uluslararası Endüstri Mühendisliği Hesaplamaları Dergisi 3 (4): 535–560 (2012)

Ek okuma için:


1
Cs.SE'ye hoş geldiniz ve cevabınız için teşekkür ederiz! Gönderilerinizi biçimlendirmek için Markdown'u kullanabileceğinizi unutmayın; Düzenlememi incelemenizi öneririm. İçeriğe gelince, bunun problemini nasıl modelleyeceğini bilmek isteyen OP'nin belirli bir teknikle ilgili ayrıntılara değil, yardımcı olduğuna inanmıyorum . Ayrıca, TLBO üzerinde çalışan sadece bir kişi var mı?
Raphael
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.