Dolaylı karşılıklılık

Doğrudan karşılıklılıkta birisine karlı vereceğimiz kararı, o kişinin bize geçmişte nasıl davrandığına bakarak veriyorduk. Dolaylı karşılıklılıkta bu kararı o birisinin geçmişte başkalarına nasıl davrandığına bakarak veriyoruz.

Oyuncular arasında tutsak ikilemindeki gibi oyunlar oynanıyor. Bu karşılaşmalar da diğer oyuncular tarafından izleniyor. Karşılaşmalarda işbirliğinin getirisi az. Buna karşın ihanetin kısa vadede getirisi fazlayken aynı zamanda kötü ün de kazandırıyor.

Karşılaşmaların oynanması şu şekilde. İhanet edenler kimle oynarsa oynasın ihanet ediyor. İşbirlikçiler işbirlikçilere karşı her zaman işbirliği yapıyor. İşbirlikçiler bir ihanetçiyi \(q \) ihtimalle tanıyor ve ihanetçiyle sadece \(1 – q \) ihtimalle işbirliği yapıyor. Bu şartlar altında payoff matrisi aşağıdaki şekle dönüşüyor.

\(M = \begin{bmatrix} R&&(1-q)S+qP\\(1-q)T+qP&&P \end{bmatrix} \)

Bir başkasının ününü bilme şansı \(q \) aşağıdaki eşitsizliği sağladığında doğrudan karşılıklılıkla aynı sonuçlar elde ediliyor.

\(q > \frac{T-R}{T-P} \)

Makaledeki bu sonuçları denemek için aşağıdaki python programını yazdım ve denemeler yaptım.

import numpy as np
import matplotlib.pyplot as plt

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

R = 5
S = 1
T = 7
P = 3
q = 0.51
prisoner_dilemma_payoff = np.array([[R, (1 - q)*S + q*P], [(1-q)*T + q*P, P]])

number_of_iterations = 100

payoff = prisoner_dilemma_payoff

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 = (strategies.dot(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("1. türün sondaki oranı")
plt.xlabel("1. türün başlangıçtaki oranı")
plt.show()

Programdaki R, S, T ve P değerleri için yukarıdaki eşitsizlik aşağıdaki gibi oluyor.

\(q > \frac{7 – 5}{7 – 3} = \frac {2}{4} = 0.5 \)

Yani programdaki \(q = 0.51\) değeri için işbirlikçi stratejinin kararlı olduğu bir dağılım da olmasını bekliyordum. Programı çalıştırınca aşağıdaki sonucu aldım.

\(q = 0.51\)

Bu sonuç doğrudan karşılıklılıktaki simülasyonun aksine verilen eşitsizliğe uygun çıktı. \(q \) değeri yükseldikçe işbirliği daha etkili bir strateji olacak mı diye bir uç değeri de denedim.

\(q = 0.99 \)

Gerçekten de bu simülasyona göre ihanet stratejisi uygulayanlar popülasyonda tanındığı zaman toplum işbirliği stratejisini benimsemeye başlıyor.

Doğrudan karşılıklılık

Evrimsel oyun teorisi kitabında bir sonraki konu karşılıklılık konusuydu. Cevap aranan soru anladığım kadarıyla şöyleydi: Oyun teorisi karşımızdakine ihanet etmemiz gerekir derken, toplum için daha iyi çözümler olan kooperasyon stratejilerine gerçek hayatta hangi mekanizmalarla erişebiliyoruz?

Martin Nowak bu soruya cevap veren beş adet mekanizma bulmuş. Kitap bu konuya kısaca değindiğinden bu konuyu Christine Taylor ve Martin Nowak’ın “Transforming the dilemma” başlıklı makalesinden öğrenmeye karar verdim.

Makalede ilk mekanizma olarak doğrudan karşılıklılık mekanizmasından bahsediliyor. Toplumlarda ikilemlere dayalı oyunlar oynanırken sonsuz büyüklükte bir toplumda herkesin rastgele kişilerle oyunlar oynadığını varsaymıştık. Gerçek hayatta ise bu oyunlar değişik şekilde oynanıyor. Örneğin bu mekanizmada olduğu gibi aynı kişiler aynı oyunu birbirleriyle defalarca oynayabiliyor. Bu durumda ikisi de diğer oyuncunun daha önce hangi stratejileri kullandığını biliyor ve kendi stratejilerini buna göre güncelleyebiliyor.

Bu mekanizmada iki oyuncu arasındaki karşılaşmadan sonra \(\omega \) olasılıkla tekrar karşılaşma oluyor. Bu durumda iki oyuncu arasında ortalama karşılaşma sayısı da \(\frac{1}{1 – \omega} \) formülüyle hesaplanabilir. İki oyuncunun karşılaşma kuralları şöyle:

İki oyuncu da işbirlikçiyse o zaman ikisi de işbirlikçi kalır. İhanet stratejisini seçen her zaman ihanet stratejisini uygular. İşbirlikçi ihanet stratejisi kullanan oyuncuyla karşılaştığında ikinci karşılaşmadan itibaren ihanet stratejisi kullanmaya başlar.

Bu durumda payoff matrisi aşağıdaki şekle dönüşür:

\(M = \begin{bmatrix} \frac {R}{1-\omega}&&S+\frac{\omega \cdot P}{1 – \omega}\\T+\frac{\omega \cdot P}{1 – \omega}&&\frac{P}{1-\omega} \end{bmatrix} \)

Aşağıdaki programla \(\omega \) değişkeninin etkisini denemeye çalıştım. Aslında bu değişkenle matrisin elemanları ve dolayısıyla elemanlar arasındaki ilişkiler değişeceğinden bu ikilemin başka bir oyun tipine dönüşmesini beklemek çok normal. Aslında bunu daha iyi görmek için oyuncuların karşılaşmalarını tek tek simüle edip aynı sonuca yaklaştığını göstermek lazım ama bu denemeleri ilerideki yazılarda yapmak istiyorum. Makalede bu dönüşüm için bir eşitsizlik veriliyor:

\(\omega > \frac{T-R}{T-P} \)

Eğer eşitsizlik sağlanmıyorsa ihanet eden strateji her durumda popülasyonu domine ediyor. Eğer eşitsizlik sağlanıyorsa işbirlikçi strateji de evrimsel açıdan kararlı bir durum olabiliyor. \(\omega \) değeri büyüdükçe, yani oyuncular arasındaki karşılaşma sayısı arttıkça işbirlikçi strateji de daha dominant olmaya başlıyor. Bu sonuçları denemek için aşağıdaki python programını kullandım:

import numpy as np
import matplotlib.pyplot as plt

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

R = 5
S = 1
T = 7
P = 3
omega = 0.60
prisoner_dilemma_payoff = np.array([[R/(1-omega), S + (omega*P)/(1 - omega)], [T + (omega*P)/(1-omega), P/(1-omega)]])

number_of_iterations = 100

payoff = prisoner_dilemma_payoff

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 = (strategies.dot(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("1. türün sondaki oranı")
plt.xlabel("1. türün başlangıçtaki oranı")
plt.show()

\(\omega = 0.6 \) değeri için aşağıdaki sonucu aldım

\(\omega = 0.6 \) değeri için işbirlikçi strateji belli bir yoğunluktan sonra kararlı bir strateji oluyor.

Programdaki R, S, T ve P değerlerini eşitsizlikte yerlerine koyduğumda

\(\omega > \frac{7 – 5}{7 – 3} = \frac {2}{4} = 0.5 \)

eşitsizliğini buluyoruz. Bu eşitsizliği sınıra yakın bir yerde denemek istedim.

\(\omega = 0.51\) değeri için şu grafiği elde ettim.

\(\omega = 0.51 \)

Eşitsizliğin söylediğinin aksine hiçbir durumda işbirlikçi stratejisi kararlı olamadı. Belki de programda küçük bir hata yapmışımdır. Bunu da incelemem lazım.

Eğer \(\omega \) değeri bire yaklaşırsa oyuncular arasında karşılaşma sayısı da artar. Bu durumda grafiğin nasıl olduğuna da bakmak istedim.

\(\omega = 0.99 \)

Gerçekten de hemen hemen her başlangıç durumu için işbirlikçi strateji kararlı bir strateji oldu.

İskenderiyeli Heron’la tanışmam

Şirkette bazen yapmam gereken işler varken küçük değişikliklere ihtiyacım oluyor. Bugün de işi rölantide yaparken youtube’da video seyredeyim dedim. Geçen binyılın ikinci yarısında MIT’de verilen bir bilgisayar dersine takıldım. Bazı derslerde hocalar kendi tecrübelerinden, kendi bilgeliklerinden bahsettiği için bu dersleri arada seyrediyorum. O dersteki bir cümleleri benim için genelde bütün o anlattığı konudan daha faydalı olabiliyor.

Konuya giriş dersinde hoca karekök hesaplama için İskenderiyeli Heron’un kullandığı yöntemi örnek olarak kullandı. Karekök öğrenim ve meslek hayatım boyunca sürekli kullandığım bir fonksiyondu ve nasıl hesaplandığını hiç düşünmemiştim. Lisede bunu kağıt kalemle yapan arkadaşlar vardı ama kullandıkları yöntemi öğrenmeyi düşünmemiştim. Ben bunu hesaplamaya kalksam sonucu heralde tahmini kökün yakınlarında taylor serileri yardımıyla arardım.

İskenderiyeli Heron’un yöntemi çok daha basit görünüyor ama. Peki bu yöntem nasıl işliyor?

Karekökünü bulmak istediğimiz sayı 40 olsun. Önce bir başlangıç noktası seçelim. Mesela 1. Her adımda bu başlangıç sayısını aradığımız sayıya yaklaştırmaya çalışacağız, yani her adımda güncellediğimiz bu başlangıç sayısı bir sonraki adımın başlangıç sayısı olacak. En iyisi bu örneği hareket halinde görelim.

Aradığımız sayının karesi 40 ve başlangıç noktamız 1.

\(\frac{1 + \frac{40}{1}}{2} = 20.5 \)

yani başlangıç sayısı ile aradığımız sayının karesinin başlangıç sayısına bölümünün aritmetik ortalamasını hesapladık. Bu sonuç bir sonraki adımın başlangıç sayısı olacak.

\(\frac{20.5 + \frac{40}{20.5}}{2} = 11.2256 \)

Bu şekilde diğer adımları da hesaplamaya devam edelim.

\(\frac{11.2256 + \frac{40}{11.2256}}{2} = 7.3944 \)

\(\frac{7.3944 + \frac{40}{7.3944}}{2} = 6.4019 \)

\(\frac{6.4019 + \frac{40}{6.4019}}{2} = 6.3250 \)

\(\frac{6.3250 + \frac{40}{6.3250}}{2} = 6.3245 \)

\(\frac{6.3245 + \frac{40}{6.3245}}{2} = 6.3245\)

Sadece dört ondalık basamak kullandığımdan bu noktadan sonra adımlarda bir değişiklik olmuyor. Peki bu bulduğumuz sonuç 40’ın karekökü mü?

\(6.3245² = 39.99930025 \)

Tabii ki değil ama oldukça yakın. Böyle basit bir yöntem için oldukça başarılı. Tabii ki bu yöntemle ilgili kafamda bazı sorular vardı. Birincisi neden çalışıyor?

Önce şunu bir kontrol edelim. Herhangi bir adımda bulduğumuz sayı verilen sayının karekökü ise bir sonraki adımın sonucu ne olur?

x sayısının karekökünü aradığımızı varsayalım. Yani bir adımda bulduğumuz sayı \(\sqrt{x} \) ise bir sonraki adım için hesabımız

\(\frac{\sqrt{x} + \frac{x}{\sqrt{x}}}{2} = \frac{\sqrt{x}\cdot{\sqrt{x} + x}}{2\sqrt{x}} = \frac{x + x}{2\sqrt{x}} = \frac{2x}{2\sqrt{x}} = \sqrt{x}\)

Yani bu yöntem bir kere karekökü bulursa hep o noktada kalıyor. Peki şimdi ikinci soru: Bu yöntem her zaman kareköke yaklaşır mı?

Bunun da cevabı evet ve ispatı bu adreste mevcut. İspatta kullanılan adımlar kısaca şöyle. Her adımda elde ettiğimiz arasonuç sıfırdan büyüktür. İkinci adımdan itibaren elde ettiğimiz arasonuçlar aradığımız karekökten büyüktür ya da kareköke eşittir.İkinci adımdan sonra her adımda bulunan arasonuç bir önceki adımda bulunan arasonuçtan büyük değildir. Yani elde ettiğimiz dizi monoton azalan ve altta sınırlı bir dizi. Bu durumda bu dizinin limiti vardır ve bu yöntemde o limit verilen sayının kareköküdür.

Aslında ikinci soru birinci soruyu da içeriyor ama her zaman soruları doğru sırada soramayabiliyorum. O tarihlerde bu kadar basit ve güzel yöntemlerin biliniyor ve kullanılıyor olması gerçekten de etkileyici.