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 result
ve x
ile 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 x
ve y
bu 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, tan
GP 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.)