İki kişilik oyun tipleri

Evrimsel oyun teorisi konusunda okuduğum son kitapta nedense fitness generating function kısmını bir türlü anlayamadım. Teknik kitaplar her şeyi oldukça basit bir şekilde anlatmalarıyla meşhur değiller zaten. Bunun üzerine kitapta bahsedilen makalelere bakmaya başladım ve bu da bir yerde çıkmaz sokakla bitti. Akademisyen olmadığım için belli bir altyapımın olmadığının farkındayım ama bu altyapıyı sağlamanın kolay bir yolu da olmalıdır diye düşünüyordum. Neyse, aramaya devam edeceğim. Bu sırada yoluma Jun Tanimoto’nun Fundamentals of Evolutionary Game Theory and its Applications adlı kitabından devam etmeye karar verdim.

Kitap önce iki kişilik oyunları belli sınıflara ayırıp biraz teoriden bahsediyor. Benim hedefim kuru teori yerine bu oyunları, algoritmaları ve simülasyonlarını programlamak olduğundan hemen python denemelerine başladım.

Bu denemelerden bahsetmeden önce biraz notasyondan bahsetmem gerekecek. İki kişilik ve iki stratejili oyunlarla başladım. Buna 2×2 oyunlar da deniyor, payoff matrisimiz de 2×2 matris.

OyuncularCooperation (C)Defection (D)
Cooperation (C)R, RS, T
Defection (D)T, SP, P

Kısaca bu tabloyu kullanmayı anlatayım. Cooperation işbirliği stratejisi oluyor, Defection da ihanet. Her adımda seçilen iki kişi birbiriyle stratejilerine göre bir oyun oynuyor. Bütün oyun bu tabloda kodlanmış durumda ve seçilen stratejilere göre kazançları da R, S, T, P değerleriyle tanımlanıyor. Oyuncuların biri soldaki sütundaki stratejilerden birine sahip, diğeri de ilk satırdaki stratejilerden birini oynuyor. Bu durumda şu eşleşmeler mümkün:

Birinci oyuncu: Cooperation   İkinci oyuncu: Cooperation
Birinci oyuncu: Cooperation   İkinci oyuncu: Defection
Birinci oyuncu: Defection     İkinci oyuncu: Cooperation
Birinci oyuncu: Defection     İkinci oyuncu: Defection 

Her eşleşme için tablodaki eşleşme hücresindeki değerler oyuncuların kazançlarını belirliyor. Bu durumda yukarıdaki eşleşmeler için sonuçlar şöyle olacak:

Birinci oyuncu: Cooperation   İkinci oyuncu: Cooperation
Bu durumda kazançlar tablodaki R, R değerlerinin olduğu hücreden okunacak. Yani birinci oyuncunun kazancı R değeri kadar, ikinci oyuncunun kazancı da R değeri kadar olacak.

Birinci oyuncu: Cooperation   İkinci oyuncu: Defection
Bu durumda kazançlar tablodaki S, T değerlerinin olduğu hücreden okunacak. Yani birinci oyuncunun kazancı S değeri kadar, ikinci oyuncunun kazancı da T değeri kadar olacak.

Birinci oyuncu: Defection     İkinci oyuncu: Cooperation
Bu durumda kazançlar tablodaki T, S değerlerinin olduğu hücreden okunacak. Yani birinci oyuncunun kazancı T değeri kadar, ikinci oyuncunun kazancı da S değeri kadar olacak.

Birinci oyuncu: Defection     İkinci oyuncu: Defection
Bu durumda kazançlar tablodaki P, P değerlerinin olduğu hücreden okunacak. Yani birinci oyuncunun kazancı P değeri kadar, ikinci oyuncunun kazancı da P değeri kadar olacak.

Programda kullanırken bu tabloyu kitapta da gösterildiği gibi aşağıdaki M matrisi haline getirdim.

\(M = \begin{bmatrix} R&&S\\T&&P \end{bmatrix} \)

Kitapta olası oyunları incelemek için şu iki değer de hesaplanıyor.

\(D_{g} = T - R \)
\(D_{r} = P - S \)

\(D_{g} \) terimi sıfırdan büyükse davranış risk alma ikilemine sahip oluyormuş. \(D_{r} \) terimi sıfırdan büyükse bu sefer de davranış riskten kaçma ikilemine sahip oluyormuş.

Önce bu sınıflamayı kısaca vereyim, ilerki yazılarda bu sınıflamalar üzerine biraz daha düşünmeye çalışırım.

Tutsak ikilemi: Burada hem \(D_{g} \) hem de \(D_{r} \) sıfırdan büyük

Tavuk: Bu tip oyunlarda \(D_{g} \) sıfırdan büyük ve \(D_{r} \) sıfırdan büyük değil.

Geyik avı: Bu tip oyunlarda sadece \(D_{r} \) sıfırdan büyük oluyor.

İkilemsiz tip: Bu tip oyunlarda ne \(D_{g} \) ne de \(D_{r} \) sıfırdan büyüktür.

Bu oyun türleri hakkında internette bir sürü bilgi bulunabilir. Bu nedenle kitapta verilen algoritma ve bu tipler için yazdığım programı göstereceğim. Son olarak da bu tiplerin sonuçlarını grafik üzerinden kısaca anlatmaya çalışacağım.

Seçilen oyuncunun stratejisi iki ihtimalden (Cooperation ya da Defection) biri olacak. Bunları da şu iki vektörle tanımlayalım:

\(\vec{e_{1}} = \begin{pmatrix}1\\0\end{pmatrix} \) Cooperation stratejisini oynayan bireyi simgelesin.

\(\vec{e_{2}} = \begin{pmatrix}0\\1\end{pmatrix} \) de Defection stratejisini oynayan bireyi simgelesin.

Stratejilerin nüfustaki oranları da aşağıdaki vektörle (Transpose edilmiş hali) verilsin.

\(s^{T} =\) $latex \begin{pmatrix}s_1&&s_2\end{pmatrix}

Cooperation stratejisini kullanan bir bireyin rastgele seçilen başka bir bireye karşı beklenen kazancı şu şekilde veriliyor:

\(e_{1}^{T} \cdot M \cdot s \)

Aynı şekilde Defection stratejisini kullanan bir bireyin rastgele seçilen başka bir bireye karşı beklenen kazancı da şu şekilde olur:

\(e_{2}^{T} \cdot M \cdot s \)

Bireylerin çoğalma mekanizması da şu şekilde tanımlanıyor:

\(\frac{\overset {.}{s_{i}}}{s_{i}} = {e_{i}}^{T} \cdot M \cdot s – {s}^{T} \cdot M \cdot s \)

Burada \(\overset {.}{s_{1} \) terimi Cooperation stratejisini kullanan bireylerin oranının değişim miktarını gösteriyor. \(\overset {.}{s_{2} \) terimi de Defection stratejisini kullanan bireylerin oranının değişim miktarını gösteriyor. \(s_{1} \) ve \(s_{2} \) terimleri de bu iki stratejiyi kullanan bireylerin toplam nüfustaki oranları ve toplamları da haliyle bir olmak zorunda. Bu iki toplam hep sabit kaldığından birinin oranındaki artış ile diğer grubun oranındaki azalış da büyüklük olarak birbirine eşit olmak zorunda.

Sistemin dinamik davranışını incelemek için de aşağıdaki python programını yazdım. Program açıklamalarını kodun içine eklemeye çalıştım. İstenen oyun tipi simülasyonunu elde etmek için payoff değişkeni program başındaki tiplerden birine eşitlemek yeterli olacaktır.

import numpy as np
import matplotlib.pyplot as plt

strategies = np.array([[1, 0], [0, 1]]) #strateji vektörleri

prisoner_dilemma_payoff = np.array([[5, 1], [7, 3]]) #tutsak ikilemi oyun tipi

chicken_dilemma_payoff = np.array([[5, 1], [7, 0]]) #tavuk oyun tipi

stag_hunt_dilemma_payoff = np.array([[8, 1], [7, 3]]) #geyik avı oyun tipi

trivial_payoff = np.array([[7, 3], [5, 1]]) #ikilemsiz oyun tipi

number_of_iterations = 100 # her bir oyunun kaç jenerasyon boyunca oynanacağı

payoff = prisoner_dilemma_payoff  # seçilen oyun tipi

increment = 0.01
steady_states = np.array([[0, 0]]) # oyun bittiğinde nüfusun hangi oranlardan oluştuğu

for s1 in np.arange(0, 1.0, increment): #0-1 aralığında değişik başlangıç  konumları yaratılıyor
    s2 = 1 - s1  # nüfus oranları toplamı 1 olmalı
    species = np.array([s1, s2]) # ilk durum olarak türlerin oranı belirlenmiş oldu

    for i in range(0, number_of_iterations): # bu şartlar için oyun belirlenen jenerasyon miktarı kadar oynanacak

        difference = (strategies.dot(payoff).dot(species) - species.dot(payoff).dot(species))*species # strateji vektörlerinin değişim miktarları hesaplanıyor
        species = species + difference # bu stratejileri kullanan bireylerin nüfustaki oranları güncelleniyor
        species = np.clip(species, 0, 1) # nüfus oranlarının her zaman 0 ile 1 arasında olması sağlanıyor

    steady_states = np.append(steady_states, np.array([[s1, species[0]]]), axis = 0)  # oyunun sonunda elde edilen oranlar kayıtlara ekleniyor

#Alttaki kısımda da simülasyon sonuçları grafik olarak hazırlanıyor
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()
Tutsak ikilemi oyununda başlangıçta Cooperation stratejisini uygulayanların oranı ne olursa olsun oyunun sonunda nüfus tamamen Defection stratejili bireyler kalıyor.

Tutsak ikileminde kullandığım matris \(M = \begin{bmatrix} 5&&1\\7&&3 \end{bmatrix} \) şeklindeydi.

Tavuk tipi oyunda dahemen hemen her nüfus dağılımı için iki stratejinin de temsil edildiği denge durumları meydana geldi.

Tavuk tipi oyunda kullandığım matris de \(M = \begin{bmatrix} 5&&1\\7&&0 \end{bmatrix} \) şeklindeydi.

Geyik avı tipi oyunda bir orana kadar hep Cooperation stratejisi kazanıyor, o orandan sonra ise Defection. İki stratejinin bir arada süregeldiği bir durum olmuyor.

Geyik avında kullandığım matris de \(M = \begin{bmatrix} 8&&1\\7&&3 \end{bmatrix} \) şeklindeydi.

İkilemsiz oyun tipinde de her dağılım için Cooperation stratejisi nüfusu ele geçiriyor.

Bu oyun tipinde de \(M = \begin{bmatrix} 7&&3\\5&&1 \end{bmatrix} \) matrisini kullandım.

Şimdilik bu yazıyı burada bitireyim. Amacım basit oyunların simülasyonlarını kolayca yapmanın bir yolunu bulmaktı ve şimdilik bu kitaptaki yöntemle çalışabiliyorum gibi gözüküyor. Umarım konular ilerledikçe buna yakın bir performans gösterebilirim.