Grup seçilimi (4)

Bu seçilim türünde oyunların sadece kişiler arasında değil, gruplar arasında da oynandığı varsayılır. Anladığım kadarıyla geçtiğimiz altmış yıl içinde bu yönde de bir sürü model üzerine çalışılmış. Makalede izlenen yöntem şöyle. Bütün nüfus \(m \) gruba bölünüyor. Her grupta en fazla \(n \) birey olabiliyor. Aynı gruptaki bireyler birbirleriyle tutsak ikilemi şeklinde karşılaşıyorlar. Her adımda bütün nüfustan rastgele bir birey üremek için seçiliyor. Oluşan yeni birey aynı gruba ekleniyor. Eğer bu grup maksimum büyüklüğe ulaşırsa belli bir olasılıkla bu grup iki gruba ayrılıyor ve toplam nüfus sınırsızca büyümesin diye rastgele seçilen bir grup yok ediliyor. Geri kalan olasılıkla ise grup ikiye bölünmüyor, bunun yerine aynı gruptan rastgele seçilen bir birey ölüyor.

Bu modelde yukarıda da anlattığım gibi oyunlar sadece grup içlerinde oynanıyor. Gruplar arası karşılaşmalar yok ama grupların bölünme dinamikleri her gruptaki bireylerin uygunluğu ile ilişkili olduğundan sonuçta sanki gruplar arası bir oyun oynanıyormuş gibi bir sonuç çıkıyor. İşin matematiksel detayına bu aşamada girmek istemiyorum. Belki ileride bu modelleri olduğu gibi programlayıp gerçekten de sonuçtaki modelin oluştuğunu gösterebilirim. Şimdilik sadece makalede verilen sonuç kazanç matrisini vereceğim ve bu matrise uygun programla yaptığım simülasyon sonuçlarına bakacağım.

\(M = \begin{bmatrix} (n+m)\cdot R&&n \cdot S + m \cdot R \\n \cdot T + m \cdot P &&(n + m) \cdot P \end{bmatrix} \)

Aşağıdaki programda önce kazanç matrisini tutsak ikilemi şartlarına uygun bir şekilde kurdum. Sonra grup sayısı ve grup büyüklüğü parametreleriyle oynayarak bu oyunun işbirlikçiler için avantajlı hale getirilebileceğini gösterdim.

import numpy as np
import matplotlib.pyplot as plt

strategies = np.array([[1, 0], [0, 1]])

m = 20 #number_of_groups
n = 10 #size of groups

R = 3
S = 0
T = 5
P = 1
payoff = np.array([[(n+m)*R, (n*S + m*R)], [(n*T + m*P), (n + m)*P]])

number_of_iterations = 100

increment = 0.01
steady_states = np.array([[0, 0]])

for s1 in np.arange(0, 1.0, increment):
    s2 = 1 - s1
    species = np.array([s1, s2])

    for i in range(0, number_of_iterations):

        difference = (payoff.dot(species) - species.dot(payoff).dot(species))*species
        species = species + difference
        species = np.clip(species, 0, 1)

        
    steady_states = np.append(steady_states, np.array([[s1, species[0]]]), axis = 0)

plt.plot(steady_states[:, 0], steady_states[:, 1])
plt.ylabel("işbirlikçi türün sondaki oranı")
plt.xlabel("işbirlikçi türün başlangıçtaki oranı")
plt.show()
m = 20 ve n = 10 için işbirlikçilik kazanan bir strateji oluyor