Bu, Fortnightly Challenge # 3'tür. Tema: Genetik Algoritmalar
Bu zorluk bir deney biraz. Genetik algoritmalarla ne yapabileceğimizi görmek istedik. Her şey en uygun olmayabilir, ancak erişilebilir duruma getirmek için elimizden geleni yaptık. Bu işe yararsa, gelecekte neler görebileceğimizi kim bilebilir. Belki tepenin genetik kralı?
Spec oldukça uzun! Spesifikasyonu Temeller'e ayırmaya çalıştık - çerçeve ile oynamaya başlamak ve bir cevap göndermek için bilmeniz gereken en düşük miktar - ve The Gory Ayrıntıları - tam şartname, denetleyiciyle ilgili tüm detayları içeren, kendi yazabilir.
Herhangi bir sorunuz varsa, bize sohbette katılmaktan çekinmeyin!
Davranış psikolojisinde bir araştırmacısın. Cuma akşamı ve siz ve meslektaşlarınız biraz eğlenmeye karar verin ve laboratuar farelerinizi küçük bir fare yarışı için kullanın. Aslında, onlara duygusal olarak bağlanmadan önce, onlara örnek diyelim .
Örnekler için küçük bir yarış pisti kurdunuz ve daha ilginç hale getirmek için pistte birkaç duvar, tuzak ve ışınlayıcı kullandınız. Şimdi, örnekleriniz hala fareler ... bir tuzağın ya da bir telsizin ne olduğu hakkında hiçbir fikirleri yok. Tek gördükleri farklı renklerde bazı şeyler. Ayrıca herhangi bir belleğe de sahip değiller - tek yapabildikleri mevcut çevrelerine göre kararlar almak. Sanırım doğal seleksiyon yapmayanlardan tuzaktan nasıl kaçınılacağını bilen örnekleri seçecek (bu yarış biraz zaman alacak ...). Oyunlar başlasın! †
Bu zorluğun ortaya çıkmasında 84.465 örnek zarar görmüştür.
Temeller
Bu tek oyunculu bir oyundur (siz ve meslektaşlarınız popülasyonları karıştırmak istemediniz, böylece her biri kendi yarış pistini kurdu). Yarış pisti, 15 hücre yüksekliğinde ve 50 hücre genişliğinde dikdörtgen bir ızgaradır . Sol kenardaki rastgele (zorunlu olarak farklı) hücrelerde 15 örnekle başlarsınız (burada x = 0 ). Numuneleriniz, x ≥ 49 ve 0 ≤ y ≤ 14'teki herhangi bir hücre olan hedefe ulaşmaya çalışmalıdır (örnekler pisti sağa aştırabilir). Bu ne zaman olursa olsun, bir puan kazanıyorsun. Ayrıca oyuna 1 puanla başlıyorsunuz. 10.000 dönüşün ardından puanlarınızı en üst düzeye çıkarmaya çalışmalısınız .
Birden fazla örnek aynı hücreyi işgal edebilir ve etkileşime girmez.
Her dönüşte, her bir örnek, çevresinin 5x5'lik bir ızgarasını (kendisi de ortada) görür. Bu ızgaranın her bir hücre, bir renk içerir -1
için 15
. -1
sınır dışı olan hücreleri temsil eder. Numuneniz sınırların dışına çıkarsa ölür. Diğer renklere gelince, bunlar boş hücreleri, tuzakları, duvarları ve teleportları temsil eder. Ancak, numuneniz hangi rengin neyi temsil ettiğini ve neyin sizi temsil ettiğini bilmiyor. Yine de bazı kısıtlamalar var:
- 8 renk boş hücreleri temsil eder.
- 4 renk bir telsizi temsil edecektir. Bir telsiz, örneği 9x9 mahallesindeki belirli bir hücreye gönderir. Bu ofset, aynı renkteki tüm ışınlayıcılar için aynı olacaktır.
- 2 renk duvarları temsil eder. Bir duvara taşınmak, durmakla aynıdır.
- 2 renk bir tuzağı temsil eder. Bir tuzak göstermektedir bir kendi yakında 9 hücreleri öldürücü (ille tuzak hücre kendisi) 'dir. Bu ofset aynı renkteki tüm tuzaklar için aynı olacaktır.
Şimdi, bu doğal seçilimle ilgili olarak, her numunede 100 bitlik bir sayı olan bir genom vardır . Mevcut iki numunenin çapraz yetiştirilmesi ve ardından genomun hafifçe mutasyona uğramasıyla yeni örnekler oluşturulacaktır. Bir numune ne kadar başarılı olursa, çoğalma şansı o kadar büyük olur.
İşte sizin göreviniz: Bir numunenin gördüğü 5x5 renk ızgarasını ve genomunu girdi olarak alan tek bir fonksiyon yazacaksınız. İşleviniz, örnek için movex ve Δy'nin biri olacağı bir hareket (Δx, ,y) döndürür {-1, 0, 1}
. İşlev çağrıları arasında hiçbir veri sürdürmemelisiniz. Bu, kendi rasgele sayı üreteçlerinizi kullanmanızı içerir. İşleviniz, istediğiniz gibi kullanmakta özgür olduğunuz seri bir RNG ile sağlanacaktır.
Gönderiminizin puanı, 50 rastgele parçadaki puan sayısının geometrik ortalaması olacaktır . Bu puanın adil bir miktar değişime tabi olduğunu tespit ettik. Bu nedenle, bu puanlar ön olacaktır . Bu zorluk bir kez sona erdiğinde, son tarih açıklanacak. Son teslim tarihinin sonunda, 100 kurul rastgele seçilecek ve tüm yazılar bu 100 kurulda yeniden değerlendirilecektir. Cevabınıza tahmini bir puan vermek için çekinmeyin, ancak kimsenin aldatmadığından emin olmak için her gönderimi kendimiz puanlayacağız.
Kontrolör programlarını birkaç dilde sağladık. Şu anda, gönderinizi Python (2 veya 3), Ruby , C ++ , C # veya Java ile yazabilirsiniz . Kontrolör tahtaları oluşturur, oyunu çalıştırır ve genetik algoritma için bir çerçeve sağlar. Tek yapmanız gereken hareket eden işlevi sağlamak.
Bekle, peki genomla tam olarak ne yapacağım?
Zorluk, bunu çözmektir!
Örneklerin hafızası olmadığı için, belirli bir sıra ile sahip olduğunuz tek şey, sizin için hiçbir şey ifade etmeyen 5x5 renk ızgarasıdır. Bu nedenle, hedefe ulaşmak için genomu kullanmanız gerekecek. Genel fikir, renkler veya ızgara düzeni hakkındaki bilgileri depolamak için genomun bölümlerini kullanmanızdır ve botunuz kararlarını genomda depolanan ek bilgilere dayandırmaktadır.
Şimdi, elbette orada hiçbir şeyi manuel olarak saklayamazsınız. Böylece orada depolanan gerçek bilgiler başlangıçta tamamen rasgele olacaktır. Ancak, genetik algoritma, yakında yanlış bilgiye sahip olanları öldürürken, genomu doğru bilgiyi içeren örnekleri seçecektir. Amacınız, genom bitlerinden ve görüş alanınıza bir hamle yapmak için bir eşleme bulmaktır, bu da hedefe çabucak bir yol bulmanızı sağlar ve sürekli olarak kazanan bir stratejiye dönüşür.
Başlamanız için bu yeterli bilgi olmalı. İsterseniz, bir sonraki bölümü atlayabilir ve alt kısımdaki denetleyiciler listesinden (bu belirli denetleyicinin nasıl kullanılacağına ilişkin bilgiler de içeren) seçeceğiniz denetleyicinizi seçebilirsiniz.
Hepsini istersen oku ...
Kanlı Detaylar
Bu şartname tamamlandı. Tüm kontrolörler bu kuralları uygulamak zorundadır.
Aksi belirtilmediği sürece tüm rastgelelik düzgün bir dağılım kullanır.
Parça üretimi:
- İz, dikdörtgen bir ızgaradır, X = 53 hücre genişliğinde ve Y = 15 hücre yüksekliğindedir. İçeren hücreler x ≥ 49 olan hedef hücreler (burada x sıfır bazlı).
- Her hücre tek bir renge sahiptir ve öldürücü olabilir veya olmayabilir - hücreler, aşağıdaki hücre türlerinden biri tarafından belirtilmedikçe öldürücü değildir.
- Orada 16 den etiketli farklı hücre renkler,
0
için15
, anlamı oyundan oyuna değişir. Ek olarak,-1
sınırları aşan hücreleri temsil eder - bunlar öldürücüdür . - 8 rastgele renk seçin . Bunlar boş hücreler olacak (etkisiz).
- 4 daha rastgele renk seçin . Bunlar teleporterler. Bu renklerin ikisi için, 9x9 semtinde sıfır olmayan bir ofset seçin ((0,0) hariç (-4, -4) ila (4,4) arası). Diğer iki renk için bu ofsetleri ters çevirin. Bir örnek bir telici üzerine basarsa, derhal o ofset tarafından taşınır.
- 2 rastgele renk daha seçin . Bunlar tuzaklar. Bu renklerin her biri için 3x3 semtinde bir ofset seçin ((-1, -1) ila (1,1)). Bir tuzak, bu uzaklıktaki hücrenin öldürücü olduğunu gösterir . Not: Tuzak hücresinin kendisi mutlaka öldürücü değildir.
- Kalan 2 renk , hareketi engelleyen duvarlardır. Bir duvar hücresine doğru hareket etmeye çalışmak, hareketi hareketsiz kalmaya dönüştürecektir. Duvar hücrelerinin kendileri öldürücüdür .
- Kılavuzun hedef olmayan her hücresi için rastgele bir renk seçin. Her hedef hücre için rastgele boş bir renk seçin.
- Pistin sol kenarındaki her hücre için, hedefe 100 tur içinde ulaşılıp ulaşılamayacağını belirleyin ( aşağıdaki sıra sırası kurallarına göre ). Eğer öyleyse, bu hücre kabul edilebilir bir başlangıç hücresidir . 10'dan az başlangıç hücresi varsa, parçayı atın ve yeni bir tane oluşturun.
- Her biri rastgele genom ve 0 yaşında olan 15 örnek oluşturun . Her örneği rastgele bir başlangıç hücresine yerleştirin.
Dönüş sırası:
- Her numune için sırasıyla aşağıdaki adımlar uygulanacaktır. Örnekler etkileşime girmez veya birbirlerini görmez ve aynı hücreyi işgal edebilir.
- Örnek yaşı 100 ise , ölür. Aksi takdirde, yaşı 1 ile artar.
- Örneğe görüş alanı verilmiştir - numuneye merkezlenmiş 5x5 renk ızgarası - ve 3x3 mahallesinde bir hamle. Bu aralığın dışına taşınması denetleyicinin sonlandırılmasına neden olur.
- Hedef hücre bir duvar ise, hareket (0,0) olarak değiştirilir.
- Eğer hedef hücre bir teleporter ise, örnek teleporter ofseti tarafından taşınır. Not: Bu adım yinelemeli değil , bir kez gerçekleştirilir .
- Hali hazırda örnek tarafından işgal edilen (potansiyel olarak bir teleporter kullandıktan sonra) hücre öldürücü ise, örnek ölür. Bu örneklerin öldüğü tek zamandır (yukarıdaki 1.1. Adımdan ayrı). Özellikle, ölümcül bir hücreye açılan yeni bir numune hemen ölmeyecek, ancak önce tehlikeli hücreden ayrılma şansına sahip olacaktır.
- Örnek bir hedef hücreyi kapsıyorsa, bir puan kazanın, örneği rastgele bir başlangıç hücresine taşıyın ve yaşını 0'a ayarlayın.
- Tahtada ikiden az numune kalıyorsa, oyun biter.
- 0 yaşında 10 yeni örnek oluşturun . Her genom (ayrı ayrı) aşağıdaki üreme kuralları ile belirlenir. Her örneği rastgele bir başlangıç hücresine yerleştirin.
Yetiştirme:
Yeni bir örnek oluşturulduğunda , sağa doğru ilerlemiş olan örneklere karşı önyargılı, rastgele iki ayrı ebeveyn seçin . Bir örneğin seçilebilme olasılığı, mevcut zindelik puanıyla orantılıdır . Bir numunenin fitness puanı
1 + x + 50 * hedefe ulaşma sayısı
buradaki x , 0 tabanlı yatay dizindir. Aynı sırada oluşturulan örnekler ebeveyn olarak seçilemez.
İki ebeveynden ilk genom bitini almak için rastgele birini seçin.
- Şimdi genom boyunca yürürken, ebeveynleri 0.05 olasılıkla değiştirin ve ortaya çıkan ebeveynden bit almaya devam edin.
- Tam olarak monte edilmiş genomu mutasyona uğratın: Her bir bit için, olasılık 0.01 ile çevir .
Puanlama:
- Bir oyun 10.000 tur sürer .
- Oyuncular oyuna 1 puan ile başlar (geometrik ortalamanın kullanılmasına izin vermek için).
- Bir örnek hedefe her ulaştığında, oyuncu bir puan alır.
- Şimdilik, her oyuncunun teslimi , her biri farklı bir rastgele parçaya sahip olan 50 oyun için çalıştırılacak .
- Yukarıdaki yaklaşım, istenenden daha fazla varyansa neden olur. Bu zorluk bir kez sona erdiğinde, son tarih açıklanacak. Son teslim tarihinin sonunda, 100 kurul rastgele seçilecek ve tüm yazılar bu 100 kurulda yeniden değerlendirilecektir.
- Bir oyuncunun genel puanı, bu bireysel oyunların puanlarının geometrik ortalamasıdır .
Kontrolörler
Aşağıdaki kontrol cihazlarından herhangi birini seçebilirsiniz (fonksiyonel olarak eşdeğer oldukları için). Bunların hepsini test ettik, ancak bir hata görürseniz, kodu veya performansı geliştirmek istiyorsanız veya grafiksel çıktı gibi bir özellik eklerseniz, lütfen bir sorun yaratın veya GitHub! Ayrıca başka bir dilde yeni bir denetleyici ekleyebilirsin!
README.md
Tam kullanım talimatlarını içeren GitHub'da doğru dizine ulaşmak için her denetleyicinin dil adını tıklayın .
Git ve / veya GitHub’a aşina değilseniz, tüm havuzu ön sayfadan ZIP olarak indirebilirsiniz (kenar çubuğundaki düğmeye bakın).
piton
- En iyisi test edildi. Bu bizim referans uygulamamız.
- Hem Python 2.6+ hem de Python 3.2+ ile çalışır!
- Çok yavaş. Önemli bir hızlandırma için PyPy ile çalıştırmanızı öneririz .
pygame
Veya kullanarak grafik çıktısını desteklertkinter
.
Yakut
- Ruby 2.0.0 ile test edilmiştir. Daha yeni sürümlerle çalışmalı.
- Aynı zamanda oldukça yavaş, ama Ruby bir sunum için bir fikir prototipleme için uygun olabilir.
C ++
- C ++ 11 gerektirir.
- İsteğe bağlı olarak çoklu kullanım destekler.
- Gruptaki en hızlı kontrolör.
C #
- LINQ kullanır, bu yüzden .NET 3.5 gerektirir.
- Oldukça Yavaş.
Java
- Özellikle yavaş değil. Çok hızlı değil.
Ön Afiş
Tüm puanlar ön. Yine de, eğer bir şey yanlış ya da güncel değilse, lütfen bana bildirin. Örnek gönderimimiz karşılaştırma için listelenmiştir ancak tartışmaya dahil değildir.
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
Kredi
Bu zorluk büyük bir işbirlikçi çaba oldu:
- Nathan Merril: Python ve Java denetleyicileri yazdı. Meydan kavramını bir Tepenin Kralı'ndan bir Sıçan Yarışına çevirdim
- trichoplax: Oyun testi . Python denetleyicisinde çalıştı.
- feersum: C ++ denetleyicisini yazdı.
- VisualMelon: C # kontrol cihazını yazdı.
- Martin Büttner: Kavramı. Ruby denetleyicisi yazdı. Playtesting. Python denetleyicisinde çalıştı.
- T Abraham: Oynama testi. Test Python ve C # ve C ++ denetleyicisini inceledi.
Yukarıdaki kullanıcıların tümü (ve muhtemelen unuttuğum bir kaç tane daha) meydan okumanın genel tasarımına katkıda bulunmuştur.
C ++ denetleyici güncellemesi
Visual Studio ile C ++ kullanıyorsanız ve çoklu okuma kullanıyorsanız, çoğaltılmış panoların üretilmesine olanak tanıyan rastgele sayı üreteci tohumlamasıyla ilgili bir hata nedeniyle en son güncellemeyi edinmelisiniz .
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'