Evrimsel oyunlarda programladığım ilk simulasyon bu oyun. Bu oyun John Maynard Smith’in de kitabında (Evolution and the Theory of Games) ele aldığı ilk örnek. Bu örneğe göre populasyonda iki tür strateji var.
- Şahin: Kendisi yaralanana kadar ya da rakip kaçana kadar mücadeleyi kızıştıran bir strateji.
- Güvercin: Rakip mücadeleyi kızıştırdığı an kaçan bir strateji.
Stratejiden kastedilen şey de oldukça genel bir özellik. Fenotip de olabilir, örneğin mavi göz ya da siyah göz gibi. Oyun için önemli olan bu özelliğin bir sonraki nesle aktarılması ve karşılaşmadan sonra üreme sıklığını etkilemesi.
Populasyondaki bireyler ikişer ikişer birbirleriyle ortak kaynaklar için mücadele edecekler. Bu mücadelede seçtikleri (daha doğrusu kalıtımsal olarak aldıkları) stratejileri uygulayacaklar. Mücadeleden sonra da uygunluk değerleri oyun ekranındaki tablodaki değerlere göre değişecek (ya da aynı kalacak). Bunu daha çok kaynak elde etmek ya da kaynak kaybetmek olarak düşünebiliriz. Örneğin daha çok yiyecek, ya da alan için mücadele ediliyor olabilir. Bütün mücadeleler bittiğinde bireyler uygunluk değerleri oranınca (ya da elde ettikleri kaynaklar) üreyebilecekler. Bu oyunda ortamdaki toplam kaynağın sınırlı olduğunu var sayarak her nesilde populasyon büyüklüğünü sabit tuttum. Bunu yaparken de bir sonraki nesilde sadece yeni doğan çocukları aldım, yani ebeveynler bir sonraki nesle kalmıyorlar.
Bu simülasyonda üremelerin eşeysiz yapıldığını varsayacağız. Yani şahin stratejisine sahip bireylerin çocukları da şahin stratejisine sahip olacak, güvercin stratejisine sahip bireylerin çocukları da yine güvercin stratejisine.
Her bireyin çocuk sayısını belirlemek için de şöyle basit bir algoritma kullandım. Bireyleri uygunluk değerlerine göre sıraya dizdim. Ortalama uygunluk değerini hesapladım. Sonra uygunluk değeri bu ortalamadan yüksek her birey bir çocuk üretti. Her çocuk üreten bireyin uygunluk değerini de ortalama kadar azalttım.
Örnek:
Elimizde aşağıdaki tablodaki gibi 4 birey olsun. Her birinin uygunluk değerleri de tabloda verildiği gibi olsun.
[table id=1 /]
Önce bireyleri en yüksek uygunluktan en düşüğe doğru dizelim.
[table id=2 /]
Şimdi ortalama uygunluk değerini bulmak için uygunluk değerlerini toplayıp birey sayısına bölelim.
\(3+4+4+5=16 \)
\(16/4=4 \)
Şimdi de aşağıdaki tabloda ilk tur sonunda olacak çocukları görelim.
[table id=3 /]
Henüz 4 adet çocuğa ulaşamadığımızdan aynı adımı tekrarlayacağız fakat bütün bireylerin yeni uygunluk değerleri ortalamadan küçük olduğundan daha farklı bir adım uygulayacağız. Toplam çocuk sayısı 4 olana kadar en yüksek bireyden başlayarak en düşüğe kadar sırayla birer çocuk ekleyelim.
[table id=4 /]
Böylece bu örnekte 2 numaralı birey bir sonraki nesle 2 çocuk aktarmış oldu. İki çocuk da 2 numaralı bireyle aynı stratejiyi kullanacak. 3 ve 4 numaralı bireyler bir sonraki nesilde birer çocukla temsil edilecek. 1 numaralı birey ise üreme şansına sahip olmayacak.
Oyun sayfasında önce başlangıçta populasyonda mevcut bulunan güvercin stratejisi ve şahin stratejisini uygulayan bireylerin sayısını giriyoruz. Daha sonra da oyunun kaç nesil süreceğini.
Bu girişlerden sonra stratejilere göre uygunluk değerlerini güncellemek kurallarının tanımlandığı matrisi görüyoruz. Matrisi aşağıdaki örneğe göre okuyabiliriz:
[table id=5 /]
Güvercin stratejisi güvercin stratejisiyle karşılaşırsa iki bireyin uygunluk değerleri de 1 puan artırılıyor.
Güvercin stratejisi şahin stratejisiyle karşılaşırsa güvercin stratejili bireyin uygunluk değeri değişmiyor, şahin stratejili bireyin uygunluk değeri 2 artıyor.
Şahin stratejili iki birey karşılaşırsa ikisinin uygunluk değerleri de 1 puan artırılıyor.
Bu bölümden sonra da bireylerin doğum anındaki uygunluk değerleri tanımlanıyor. Bu parametreler ışığında simülasyon rastgele karşılaşmalar olacak şekilde çalıştırılıyor. Her nesilden sonra aşağıdaki bilgi alanları güncelleniyor. Eğer animasyon seçeneği seçilmişse mücadele aşamaları ve bireylerdeki değişimler de görsel olarak izlenebiliyor.
Bu oyunun amacı basit sistemlerdeki evrimsel kararlı stratejileri incelemek. Evrimsel kararlı stratejilerden kasıt da şu: Acaba populasyonda herkes aynı stratejiye sahip olsa, bu populasyon başka bir stratejiye sahip bir mutant tarafından işgal edilebilir mi? Yani, örneğin dokuz güvercin stratejili bireyden oluşan bir gruba bir şahin stratejili birey katılırsa (ya da mutasyonla oluşursa) şahin stratejisi güvercin stratejisine karşı avantaj sağlayabilir mi?
Oyun sayfasındaki matrise uygun değerler girerek bunu deneyebiliriz. Kitapta da aşağıdaki gibi bir formüller verilmiş.
Populasyondaki şahin stratejisi oranını p ile gösterelim. Yani p, 0 ile 1 arasında bir sayı.
\(W(H) \) şahin stratejili bireyin uygunluk değerini göstersin.
\(W(D) \) güvercin stratejili bireyin uygunluk değerini göstersin.
\(E(D, D) \) Güvercin stratejili bireyin güvercin stratejisiyle karşılaştığında uygunluk değerindeki değişim miktarı. Uygunluk değeri matrisinde birinci satır ve birinci sütundaki değer.
\(E(H, D) \) Şahin stratejili bireyin güvercin stratejisiyle karşılaştığında uygunluk değerindeki değişim miktarı. Uygunluk değeri matrisinde ikinci satır ve birinci sütundaki değer.
\(E(D, H) \) Güvercin stratejili bireyin şahin stratejisiyle karşılaştığında uygunluk değerindeki değişim miktarı. Uygunluk değeri matrisinde birinci satır ve ikinci sütundaki değer.
\(E(H, H) \) Şahin stratejili bireyin şahin stratejisiyle karşılaştığında uygunluk değerindeki değişim miktarı. Uygunluk değeri matrisinde ikinci satır ve ikinci sütundaki değer.
Mücadeleye giren her bireyin yeni uygunluk değerinin ortalama olarak aşağıdaki formüllere göre değişmesi beklenmektedir.
\(W(H)=W_0+p\cdot{E(H,H)}+(1-p)\cdot{E(H,D)} \)
\(W(D)=W_0+p\cdot{E(D,H)}+(1-p)\cdot{E(D,D)} \)
Bu formüllerde \(W_0 \) bireylerin başlangıçtaki uygunluk değerleridir. Oyun sayfasında bu değer kullanıcı tarafından belirleniyor ve her yeni birey oyuna bu değerle başlıyor. Yani üremeden sonra çocuklar da bu sabit değere sahipler.
Bu formüller eşliğinde kitapta evrimsel kararlı strateji için verilen şartlar şöyle:
\(E(H,D)>E(D,D) \) veya \(E(H,D) = E(D,D)\wedge{E(H,H)>E(D,H)} \)
ise şahin stratejisi kararlı bir stratejidir. Güvercin stratejisinin evrimsel kararlı strateji olması için de
\(E(D,D)>E(H,D) \) veya \(E(D,D) = E(H,D)\wedge{E(D,H)>E(H,H)} \)
şartı gerekliymiş (Maynard Smith ve Pierce, 1973,”The logic of Animal Conflict”). Bu şartları çıkarmak çok da zor değil aslında ama o kadar detaya girmeyeceğim şimdi. Çıkarım için \(p \) değerinin \(1-p \) değerine göre çok daha küçük olduğunu görmek yeter.
Bu şartları şimdi simülasyonda deneyelim. Simülasyonu rahat takip edebilmek için toplam popülasyon büyüklüğünü 10 yapmak iyi olabilir. Bu durumda nesiller alt alta gösterilecek ve bütün bireyler ekrana sığacaktır.:
\(E(H,D)>E(D,D) \) : Şahin stratejinin güvercin stratejisine karşı kazancının güvercin stratejisinin güvercin stratejisine karşı kazancından büyük olduğu durumda şahin stratejisinin populasyonu işgal edeceği öngörülüyor.
[table id=6 /]
Bu değerlerle şahin stratejisi tek bir bireyle bile populasyonu işgal edebiliyor. İlk adımda bir şahin bir güvercinle karşılaşacaktır. Geri kalan karşılaşmalar da güvercinler arasında olacaktır. Eğer şahinin güvercine karşı avantajı güvercinlerin kendi aralarındaki avantajlara göre daha üstünse karşılaşmalar sonunda şahin bireyin uygunluk değeri diğer bütün güvercinlerden daha yüksek olacaktır. Bu durumda bir sonraki nesle iki şahin geçecektir. Şahinler birbirleriyle karşılaşmadığı sürece şahin nüfusu artışını sürdürecektir ve bir süre sonra bütün popülasyonu ele geçirecektir. Yukarıdaki tabloya göre şahinler birbiriyle karşılaşması ile güvercinlerin birbiriyle karşılaşması herkesin uygunluk değerini aynı miktarda artırdığından şahin nüfusu asla geri gitmeyecektir. Yani şahinler sürekli birbiriyle karşılaşsa bile nüfuslarını koruyacak ve güvercinlerle karşılaştıklarında da nüfusları artacaktır.
\(E(H,D) = E(D,D)\wedge{E(H,H)>E(D,H)} \) : Şahin stratejinin güvercin stratejisine karşı kazancının güvercin stratejisinin güvercin stratejisine karşı kazancına eşit olduğu ve şahin stratejisinin şahin stratejisine karşı kazancının güvercin stratejisinin şahin stratejisine karşı kazancından fazla olduğu durumda şahin stratejisinin populasyonu işgal edeceği öngörülüyor.
[table id=7 /]
Bu değerlerle şahin stratejisinin populasyonu ele geçirmesi için en az iki şahin gerekli. Aksi durumda populasyon olduğu gibi kalıyor çünkü burada avantaj sağlayan tek durum şahin stratejisiyle şahin stratejisinin karşılaşması ve bunun için de şahin stratejili iki bireye ihtiyaç var. İki şahinle başlandığında şahin nüfusu bu tabloya göre gerileyemiyor ama başlangıçta şahin nüfusu az olduğundan nüfus artışı da yavaş oluyor, çünkü şahinlerin birbiriyle karşılaşma ihtimali az. Şahin nüfusu arttıkça bu ihtimal artıyor ve nüfus artışı da hızlanıyor.
[table id=8 /]
Kitaptaki birinci şartı denerken aklıma bu ihtimal de geldi. Burada şahin stratejisi güvercin stratejisiyle karşılaştığında avantajlı oluyor. Eğer ilk popülasyonda şahin stratejisi az ise bu şahin stratejisi nüfusunu artıracaktır. Fakat aynı zamanda şahin stratejileri birbirleriyle karşılaştıklarında bundan zararlı çıkıyorlar. Güvercin stratejilerinin kendileriyle karşılaşmaları daha avantajlı. Burada hesap yapmadım ama denemelerime göre şahin stratejileri başlangıçta yok olma tehlikesiyle karşı karşıya. Örneğin popülasyonda sadece iki şahin stratejili birey varsa ve bu ikisi birbirleriyle karşılaşırlarsa bir sonraki nesilde hiç şahin stratejisi görülmeyecektir. Bu tehlikeler aşılınca ileride bir denge durumuna erişiliyor. Bunu daha rahat görebilmek için popülasyon büyüklüğünü yüksek (100) seçtim ki şahinlerin başlangıçta birbirleriyle karşılaşma ihtimalleri daha düşük olsun.