Genetik programlama [kapalı]


13

Son zamanlarda Reddit'e göz atıyordum ve bir "JavaScript genetik algoritması" örneğine bağlantı veren bir gönderiyle karşılaştım. Genetik algoritmalar ve programlama kavramlarından gerçekten çok etkilendim, ancak bazı Google'lardan sonra bile hala biraz kafam karıştı. O nasıl çalışır?

Sanırım kelime terimleri beni her şeyden daha fazla karıştırıyor. Kısa örnekleri ve belki de açıklamaları takdir ediyorum. Sadece genetik programlama kavramı ve bunu projelerimde nasıl uygulayabilirim ve neden?


1
Mat Buckland tarafından kitabın yarısının genetik algoritmaları kapsadığı "Oyun Programlama için AI Teknikleri" ( amazon.com/Techniques-Programming-Premier-Press-Development/dp/… ) adında iyi bir kitap var . Kitabın adı biraz yanlış isim, GA'lar ve Sinir Ağları üzerine bir kitap. Konuya büyük bir giriş.
Steven Evers

Yanıtlar:


19

Genetik Algoritmalardan Genetik Programlama'dan daha çok bahsettiğiniz gibi görünüyor, ama işte anlayışınıza katkım.


GA'ları, oluşturdukları parçalar açısından düşünmek kullanışlı olabilir.

Diyelim ki bir çeşit sorununuz var. İhtiyacınız olan ilk şey, bir çözümün nasıl görüneceğini ifade etmenin bir yoludur. Eğer A, B, C, D, E şehirleri ile ilgili seyahat eden bir satıcı sorununuz varsa , o zaman bir çözümün neye benzeyebileceğini zaten biliyorsunuzdur.

Bu Gene .

Aksi takdirde soruna potansiyel bir çözüm olarak bilinir. Steven A. Lowe gibi, bit dizeleri genleri kodlamanın yaygın bir yoludur, ancak gerekli değildir; sadece bazı şeyleri kolaylaştırır. Önemli olan, bu diziye benzer şekilde bir çözümü temsil etmenin bir yolunun olmasıdır.

Şimdi. Çözümün iyi olup olmadığını nasıl anlarsınız? Size söyleyebilecek ve çözümü derecelendirebilecek bir işleve ihtiyacınız var. Böylece, yine TSP'de [B, C, A, D, E] yolunu kullanarak kat edilen mesafeyi ölçen bir fonksiyonunuz olabilir. Atadığınız 'not' sadece kat edilen mesafe olabilir, ancak daha karmaşık sorunlara seyahat masrafı ve diğer şeyler gibi şeyler ekleyebilirsiniz.

Bu Fitness Fonksiyonudur .

Böylece şimdi potansiyel bir çözüm alabilir ve bunun iyi olup olmadığını öğrenebilirsiniz. Sıradaki ne?

Sonra ilk neslimize başlamamız gerekiyor. Bu yüzden bir grup rastgele çözüm üretiyoruz. İyi olup olmadıkları önemli değil. Bu sizin ilk ya da tohum popülasyonunuzdur. Buna gen havuzunuz diyebilirsiniz.

Böylece ilk gen havuzunuzu alırsınız ve fitness fonksiyonunuzu hepsine uygular ve hepsine not verirsiniz. Şimdi iki tanesini almanız ve onlardan yeni bir nüfus yaratmanız gerekiyor - gelecek nesil için. Kimi seçiyorsun? Eh, sadece bazı sorunlara yol açabilecek sadece en uygun olanı seçmek istemezsiniz. Bunun yerine bir seçim işlevine ihtiyacınız var .

Görselleştirmesi kolay seçmenin bir yolu, bir tür tekerlek kullanmaktır: her gen, bir tekerlek üzerindeki bir dilimdir ve fitness skorları, dilimlerinin ne kadar büyük olduğunu gösterir (uygunluk ne kadar iyi olursa, dilim o kadar büyüktür). Tekerleği işaret eden bir pim koyun ve ona bir dönüş verin (yani rastgele bir sayı oluşturun). Raptiye ilk ebeveyni gösterir. İkinci ebeveyn için tekrar yapın.

Şimdi yeni çocuklar yaratmalısın. Yeni bir nüfus üretmek için ebeveynleri birleştirmek istiyorsunuz. Bunu yapmanın çeşitli yolları vardır, ancak hepsi çaprazlama işlevi olarak adlandırılır . Onları ikiye bölebilir ve yarımları ebeveynler arasında değiştirebilir veya bir tür serpiştirme yapabilirsiniz. Bu, yeni çocuk üreten memeli ebeveynlere çok benzer - her ikisi de genlerini yeni çocuğa katkıda bulunur.

Bu yeni nesle sahip olduğunuzda , her çocuğa rastgele, ancak nadir görülen mutasyon atıyorsunuz . Sıklıkla mutasyon oranlarının% 1'in altında olduğunu gördüm. Mutasyon fonksiyonu rastgele kodlanmış gen şey değişecektir. Geniniz biraz dize ise, biraz değişebilir, bir dizi şehirse, listede 2 şehri değiştirebilir. Önemli olan, nispeten nadir bir olay olması ve işleri karıştırmasıdır.

İstediğiniz sayıda nesile kadar veya fitness fonksiyonunuz sürekli olarak yüksek fitness skorlarına sahip ebeveynler üretene ve (umarım her şeyi doğru yaptıysanız) optimal olan bir çözümünüz olana kadar bu işlemi tekrarlayın.


Bu biraz garipti, bu yüzden bir metaforla özetleyeyim:

  1. Genler insandır: insanlar problemleri çözer
  2. Fitness İşlevleri notlar: İnsanlar bir sorunu ne kadar iyi çözdüklerine göre not alırlar
  3. Yeni bir popülasyon üretmek için 2 kişi seçiyorsunuz: daha iyi derecelere sahip insanlara daha iyi üreme şansı veriyorsunuz
  4. Ebeveynler ürediğinde, çocuk üretmek için birleşirler.
  5. Çocuklarını nadiren ve rastgele değiştirirsiniz
  6. Yeni nüfusun çocuklarını derecelendiriyorsun
  7. Durulayın ve tekrarlayın

Bu yardımcı olur umarım.


Bu harika bir açıklama. Her zaman genetik algoritmaların darvin algoritmaları veya evrimsel algoritmalar olarak daha iyi tanımlandığını düşünürdüm, ancak "genetik" kesinlikle mekaniği daha iyi tarif eder (genel fikri olmasa bile). Onlara Darvinli genetik algoritmalar diyeceğim.
Steven Lu

Conway'in yaşam oyunu genetik bir algoritma mıdır?
Florian Margaine

@Florian Margaine: Yaşam oyunu, hücresel bir otomat, ilgisiz bir kavramdır (yaşam oyununun tamamen belirleyici olduğu, GA stokastik olduğu gerçeğinden başlayarak).
scrwtp

1
Bu, eller aşağı, şimdiye kadar duyduğum GA'nın en iyi açıklaması. Geçmişte birçok kez, genellikle hazırlıksız açıklamalarla bahsedilen genetik algoritmaları gördüm, ancak şimdiye kadar ne olduklarını gerçekten anlamadım. Teşekkürler!
Locke

Keşke GA'ları öğrenmeye ilk başladığımda bu açıklamayı görseydim!
Avrohom Yisroel

7

bir soruna çözümü bit-string olarak kodlamak

kodlanmış çözümün bir bit-string'in ne kadar iyi verildiğini değerlendiren bir işlev ("uygunluk" işlevi olarak adlandırılır) yazın - sonuç genellikle 0 ile 1 arasında bir sayıdır

rastgele bu bit dizelerinden bir grup oluşturmak ve uygunluklarını değerlendirmek

bir grup seçin - tipik olarak daha uygun olanları - ve ikiye kesin ve yeni bit dizeleri yapmak için yarıları değiştirin (çaprazlama)

o zaman bazen, yeni bit dizgilerinin bazılarında rasgele birkaç bit çevirin (mutasyon)

iyi bir çözüm gelişene kadar tekrarlayın

neden bunu yapıyorsunuz: bazı sorunların muazzam olası çözüm alanları var, tüm olasılıkları değerlendirmek pratik değildir (cf Seyahat Satıcısı Sorunu)

Arama, Optimizasyon ve Makine Öğreniminde Genetik Algoritmalar kitabını şiddetle tavsiye ederim


"Genetik Algoritmalar" ile ilgili bir Amazon araştırması bana dört sayfalık bir şey verdi. Sadece ilk sayfaya baktım, ama oradaki kitapların hiçbirinde "Genetik Algoritma" adı yoktu. Kitap hakkında tam başlık ve yazar gibi daha ayrıntılı bilgi verebilir misiniz?
David Thornley

Zorluk: cevabı genetik bir algoritma olarak yeniden ifade edin. [-:
veryfoolish

@David bağlantısı eklendi; 1989'da yayınlandı, bu yüzden şimdi daha iyi olanlar olabilir, ancak bu iyi bir şey sergiledi
Steven A. Lowe

1
@veryfoolish: ilk önce soruyu sınırlı bir ayrık alan çözümü olarak yeniden ifade edin
Steven A. Lowe

@David Genetik algoritmaların yapay zeka hakkında daha büyük bir kitapta bir veya iki bölüm olması muhtemeldir.
Barry Brown

6

Genetik programlama, bilgisayarın sizin için programlar yazmasını sağlamanın bir yoludur!

MS Word gibi "programları" düşünmeyin, "programları" aşağıdaki gibi düşünün:

function(x){ return x*2; }

Bu işlevin (veya programın) kendi başına bir nedeni yoktur. Sorunlara çözümler arıyoruz. İki sayının toplamını bulmanız gerekiyorsa, hesap makinesini açmanız ve matematiği yapmanız yeterlidir. Birisi size aşağıdaki tabloyu verdiğinde resultve xile arasındaki ilişkiyi belirlemenizi isterse y:

x   y   result
99  1   (3.02)
79  88   2.01 
21  62   5.01 
84  52  (6.58)
12  70   5.54 
67  18   0.73 

Bu veriler sizin "egzersiz" verilerinizdir. Bilgisayarınız bu verileri bir hipotez oluşturmak için kullanacak, daha sonra gerçek verilere karşı test edeceksiniz.

İstatistikleri bilmediğinizi ve bu sorunun kendi başınıza çözülmesinin çok zor olduğuna karar verdiğinizden, bilgisayarı sizin için çözmesini sağlayabilirsiniz.

Bilgisayarın rastgele tahminler üretmesini sağlayın

Bilgisayarınız bir milyon cevap üretiyor ve bunlardan herhangi birinin yapışıp kalmayacağını görüyorsunuz (tahmin edin ... bir milyon kez!). Aşağıda birkaç tahmine bir örnek verilmiştir:

function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly

Bunu biliyor ya da bilmiyor olabilirsiniz, ancak işlevler veya programlar ağaç olarak da temsil edilebilir, örneğin, ikinci işlev şöyle olur:

(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)

Bu şekilde girintili olarak daha çok bir ağaç gibi görünmesini sağlayabilirsiniz (btw, ters lehçe gösterimi ve lisp sözdizimine bakın ... ama bunun gibi programları neden kısa bir süre temsil ettiğimizi anlayacaksınız):

(+ 
    (/ x 
        (* 1 
            (* 1 
                (* 1 
                    (* 1 
                        (* 1 1)))) 
    y)

( +İki "yapraklar" ile üst kısmındadır /ve y. /Kendisi gibi birkaç çocuğu var)

Bu nedenle genetik programlamada "ağaçlar" hakkında çok şey okudunuz. Her durumda, biz değerlerine takın xve ybu işlev içine ve bize YANLIŞ cevap verir. Bunu rastgele yarattığımız için şaşırtıcı değil.

Şimdi böyle bir milyon çözüm üretmeye karar veriyorsunuz. Hepsi yanlış. Ancak, bazı cevapların doğru cevaba diğerlerinden daha yakın olduğunu fark ettiniz. Başka bir deyişle, bazı çözümler diğerlerinden daha "zinde". Bilgisayarın "doğru" ve "yanlış" olanı bilmediğini ve bu nedenle kendi "fitness" işlevinizi sağlamanız gerektiğini unutmayın. Bu fonksiyon potansiyel bir çözümü, eğitim verilerini alır ve GP sistemine bu çözümün ne kadar "uygun" olduğunu söylemekten sorumludur. Tahmin edebileceğiniz gibi, bu işlev milyonlarca kez milyonlarca kez çalıştırılır.

GP'yi farklı kılan nedir

Genetik programlamayı vahşi tahminlerden farklı kılan şey budur. Milyonlarca tahmin daha yapmaya karar veriyorsunuz; ancak bunu biraz daha akıllıca yaparsınız. Tahminlerin ilk% 10'unu (gerçek değerlere yakın olanlar) alıp ikinci neslin bir parçası haline getirirsiniz. Ayrıca bu çözümlerin birçoğunu alıyorsunuz (belki aynı% 10 ... hatırlamıyorum) ve “bunları karıştırmaya” karar veriyorsunuz.

Rastgele iki çözüm seçiyorsunuz, rastgele alt ağaçları seçiyor ve değiştirmeye başlıyorsunuz. Bu nedenle A çözeltisinin bir kısmı B çözeltisinin altına girer ve bunun tersi de geçerlidir - siz onları "geçtiniz". Ayrıca bazı çözümler alıyorsunuz ve basitçe onları "mutasyona uğratıyorsunuz" ... biraz alt ağaç alın ve biraz 'vidalayın' (hey, çözüm korkunçsa, 'sebepsiz yere vidalamak' aslında onu geliştirebilir).

Bunu düşünmenin iyi bir yolu şudur: annenizin ve babanızın bazı nitelikleri vardır - saç rengi, boy, hastalık olasılığı vb. Siz, bir çocuk olarak her iki ebeveyninizden de farklı nitelikleri miras alırsınız. Ebeveynlerinizin ikisi de olimpik sporcu olsaydı, siz de süper bir sporcu olacaksınız, değil mi? Biyologlar, sosyologlar ve hatta tarihçiler bu fikirle ilgilenebilirler, ancak bilgisayar bilimcileri burada öjeni ahlakıyla ilgilenmiyorlar. Çözümler sağlayan oldukça iyi bir iş çıkardıkları bir "sistem" gördüler, bu yüzden bunu yazılımda modellemeye karar verdiler.

Aslında biyolojiyle eşleşmiyor, ancak yine de iyi cevaplar veriyorsa ... birçok bilgisayar bilimcisi topluca "ne olursa olsun dostum ve terminoloji için teşekkürler" der. Ayrıca, tüm kardeşlerinizin tam olarak aynı olmadığını unutmayın ... hatta ebeveynleri aynı olsa bile. Her insanın herhangi bir nedenle mutasyona uğrayan genleri vardır (lütfen bunu bir biyologa göstermeyin, amaç terminolojinin arkasındaki motivasyonu anlamaktır).

Şimdi bilgisayarı milyonlarca program üretmeye ve kondisyonlarını ölçmeye başlıyoruz. En iyi çözümler gelecek kuşaklara kadar varlığını sürdürüyor. Ayrıca "mutasyona uğrarız" ve "popülasyon" üzerinde çapraz geçiş yaparız (genetik ve biyoloji dilinin nasıl kullanıldığına dikkat edin). İkinci nesil yaratıldıktan sonra, uygunluk tekrar ölçülür. Bu nesil önceki neslin en iyi çözümlerine sahip olduğundan VE en iyi çözümleri (vasat nüfusla birlikte - çeşitliliği korumak için) geçip mutasyona uğrattığımızdan, bu nesil en az önceki nesle göre biraz daha iyi olmalıdır.

Buna çok sayıda nesil boyunca devam ediyoruz. Her nesil (umarım) doğru cevabı alana kadar daha iyi ve daha iyi çözümler sunar. Örneğin:

(+ (- 2.2 (/ x 11) (* 7 (cos y))))

Şuna bir bak, bu doğru!
(Ben bu kopyalanan http://en.wikipedia.org/wiki/Genetic_programming da bu ağacın bir grafik gösterimini olan,)

Ivır zıvır

+, -, *, /, cos, sin, tanGP sisteminiz için hangi "terminallerin" ( ) kullanılabilir olduğuna nasıl karar verdiğiniz, kondisyon fonksiyonunu nasıl yazdığınız ve sistemin (1 + cos)veya (2 / "hello")(ve diğerleri gibi) gibi duyusal olmayan programları nasıl ele alacağı gibi bazı önemli sorunlar vardır .

Denklemler geliştirmek oldukça sıkıcı. Terminal setiniz aşağıdaki gibi görünüyorsa daha ilginç hale gelir: (ateş, düşmanı hissedin, hareket edin ...) ve fitness fonksiyonunuz sağlığınızı ve savaş canavarlarının ölü bedenlerinin sayısını ölçer.

Bunların çoğunu bellekten yazdım ama temel fikir bu. Üniversite yıllarımda biraz GP yaptım. Kesinlikle onunla oynamalısın. Tüm terminolojiyi anlama konusunda endişelenmeyin, sadece bazı ücretsiz GP sistemlerini indirin, bunu hissetmek için birkaç örnek çalıştırın ve kendi ilginç örneklerinizi oluşturun (farklı veri kümeleri arasındaki ilişkileri bulun, oyuna bağlamayı deneyin) API'lar vb.)


1

En Uygun Olanın Hayatta Kalması: Windows Forms ile Doğal Seçim, Genetik Programlamaya nasıl tanıtıldım. İndirilebilir kod ile kolay bir okuma. Dezavantajı, GP'nin çalışma zamanında oluşturulan kodu yürütmek için bir araç gerektirmesidir ve makale yazıldığı sırada C # bu göreve uygun değildir. Bu nedenle örnek, çalışma zamanında kod oluşturmak, derlemek ve çalıştırmak için CodeDOM'u kullanır ve bu da kendisine başka bir karmaşıklık katmanı ekler.

O zamandan beri işler artık .NET ile kendi ExpressionTree API'sine sahip, bu da muhtemelen makalede açıklanandan daha şık bir GP uygulamasına izin verecek. Ancak GP'nin nasıl çalıştığını anlamak için yeterince iyi.

Burada GP'de de ilginç bulabileceğiniz çok kısa bir java kodu örneği içeren ücretsiz bir e-kitap indirebilirsiniz.


-1

Genetik algoritmalar ve genetik programlama birbiriyle ilişkilidir ancak farklı kavramlardır.

Genetik algoritmalar (GA'lar) karmaşık optimizasyon problemleri için arama algoritmalarıdır. Bir GA'da, bir çözümün parametrelerini bir "DNA" bit dizesindeki bazı problemlere kodlarsınız, daha sonra bu bit dizelerini rastgele "ürer": bunların parçalarını birleştirerek çoğalmasını ve tüm bit dizelerini silerek "en uygun olanın hayatta kalmasını" uygularsınız sorununuzu en iyi çözenler dışında olanlar var.

Genetik programlama (GP) daha da karmaşıktır: burada, DNA'ları (bit dizeleri) ile değil, ürettiğiniz ve seçtiğiniz ayrıştırma ağaçlarıyla programları temsil edersiniz.

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.