Bölüm 2: Minimaks ve Alfa-Beta Budaması

Algoritmik Oyun Kuramı · Çalışma Soruları
Oyun ağacıMinimaksNim: P ve N konumlarıXOX'ta derinlik cezasıAlfa-beta budamasıHamle sıralamasıDörtlü Bağla ve ufuk etkisiKod yazma
Sercan KÜLCÜ

Çoktan Seçmeli · Dallanma etkeni

Soru 1

Bir oyunda her konumda 10 yasal hamle var. Minimaksın arama derinliği 4 yarım hamleden 6 yarım hamleye çıkarılırsa okunan yaprak sayısı yaklaşık kaç katına çıkar?

Doğru cevap C. Her iç düğümün b çocuğu olan ağaçta d derinlikte bd yaprak vardır: 104 = 10.000 yaprak 106 = 1.000.000 olur, yani 100 kat. Her yarım hamle işi b = 10 katına çıkarır; iki yarım hamle 10 · 10 = 100 eder. B katları toplar, çarpmaz. A ve D büyümenin derinlikle doğrusal olduğunu varsayar; oysa büyüme üsteldir.

Çoktan Seçmeli · Minimaksın garantisi

Soru 2

Bir konumun minimaks değeri +2. MAX her hamlesinde minimaks hamlesini oynuyor; MIN ise zaman zaman hata yapan bir rakip. MAX'ın oyun sonunda alacağı fayda için hangisi kesinlikle doğrudur?

Doğru cevap A. Minimaks değeri, MIN'in her hamlesine en iyi cevabı verdiği varsayımıyla MAX'ın garanti ettiği değerdir. MIN en iyi cevaptan saparsa MAX en az bu değeri alır, daha azını hiçbir zaman almaz: minimaks değeri güvenli bir alt sınırdır. Sonucun tam 2 olması (B) yalnız iki taraf da hatasız oynarsa kesindir. Minimaks, zayıf rakibe karşı kazancı en büyük yapan hamleyi aramaz; ama garantisi de düşmez (C ve D yanlış).

Hesaplama Sorusu · Elle minimaks

Soru 3: Üç Katmanlı Ağaçta Minimaks

Kök A (MAX), ikinci katman MIN, üçüncü katman MAX. Yapraklar soldan sağa E = [2, 8], F = [5, 3], G = [9, 1], H = [4, 6], I = [7, 2], J = [3, 10].

ABE28F53CG91H46DI72J310

a) Kökün minimaks değeri nedir, MAX hangi hamleyi seçer?
b) İki taraf da en iyi oynarsa oyun hangi yaprakta biter?
c) En büyük yaprak (10) neden ulaşılamaz bir sonuçtur?

Cevabı göster

a) Üçüncü katman (MAX): E = 8, F = 5, G = 9, H = 6, I = 7, J = 10.

İkinci katman (MIN): B = min(8, 5) = 5, C = min(9, 6) = 6, D = min(7, 10) = 7.

Kök: A = max(5, 6, 7) = 7; MAX D'yi seçer.

A7B5E828F553C6G991H646D7I772J10310

b) Yol A → D → I → 7: D'de MIN, I'yı (7) J'ye (10) tercih eder; I'da MAX 7'yi seçer.

c) 10, J'nin altındadır. J'ye gidilip gidilmeyeceğine D'de MIN karar verir ve 7 veren I'yı seçer: MAX'ın 10'a ulaşması için MIN'in hata yapması gerekir. G'deki 9 da aynı nedenle ulaşılamaz.

Çoktan Seçmeli · P ve N konumları

Soru 4

Son jetonu alanın kazandığı Nim'de hangisi bir P konumudur (sıradaki oyuncu, rakip hatasız oynarsa kaybeder)?

Doğru cevap D. Bouton kuralına göre konum P'dir ⇔ yığınların nim toplamı (XOR) 0'dır. 1 ⊕ 4 ⊕ 5 = 001 ⊕ 100 ⊕ 101 = 000 = 0: (1, 4, 5) P'dir. Ötekilerde toplam sıfırdan farklıdır: 2 ⊕ 4 ⊕ 5 = 3, 1 ⊕ 3 ⊕ 5 = 7, 2 ⊕ 3 ⊕ 4 = 5; bunlar N konumudur. Tam ağaçta negamaks da aynı sonucu verir: (1, 4, 5)'in değeri sıradaki oyuncu için −1, ötekilerinki +1.

Hesaplama Sorusu · Negamaks ve XOR kuralı

Soru 5: Nim'de Negamaks

Nim konumu (2, 4); son jetonu alan kazanır. Değer sıradaki oyuncunun gözünden yazılıyor: değer(s) = maxa −değer(sonuç(s, a)), hamlesi olmayan konum −1.

a) (k, k) biçimindeki konumların (eşit iki yığın) değeri nedir? Neden?
b) (2, 4)'ün altı çocuğunun değerleri ve (2, 4)'ün değeri nedir? Kazandıran hamle hangisidir?
c) XOR kuralı aynı hamleyi verir mi?
d) Kökü (2, 4) olan tam ağaçta kaç düğüm vardır?

Cevabı göster

a) (0, 0)'ın hamlesi yoktur: −1. (k, k)'den yapılan her hamle yığınları eşitsiz bırakır; rakip öteki yığından aynı sayıda jeton alıp yine (j, j) yapar. Bu ayna stratejisiyle (k, k) her k için −1, yani P'dir.

b) Çocuklar ve sıradakine değerleri: (1, 4): +1, (0, 4): +1, (2, 3): +1, (2, 2): −1, (2, 1): +1, (2, 0): +1.

(2, 2) = −1 olduğundan değer(2, 4) = −(−1) = +1 (N). Tek kazandıran hamle ikinci yığından 2 jeton alıp (2, 2) bırakmaktır; öteki beş çocuk +1'dir, yani rakibe kazandırır.

c) 2 ⊕ 4 = 010 ⊕ 100 = 110 = 6. 4 ⊕ 6 = 2 < 4: ikinci yığın 2'ye iner. 2 ⊕ 6 = 4 > 2: birinci yığından böyle bir hamle yok. İki yöntem aynı hamleyi bulur.

d) Kök dâhil 216 düğüm; bunun 33'i yalnız (2, 2) alt ağacıdır. XOR kuralı birkaç işlemle biter.

Çoktan Seçmeli · Derinlik cezası

Soru 6

XOX'ta derinlik cezası ±(10 − d) kullanılıyor; değerler X'in gözünden yazılıyor ve sıra O'da (MIN). O'nun dört hamlesi sırasıyla şu sonuçlara gidiyor: (1) kökten 1 yarım hamle sonra O kazanır, (2) 3 yarım hamle sonra O kazanır, (3) berabere, (4) 2 yarım hamle sonra X kazanır. Değerler ve O'nun seçimi nedir?

Doğru cevap B. O kazanırsa değer −(10 − d)'dir: d = 1 için −9, d = 3 için −7. X kazanırsa +(10 − d): d = 2 için +8; beraberlik 0. O, MIN olduğu için en küçük değeri, −9'u, yani hemen kazanan hamleyi seçer. A bakış açısını karıştırır: ağaçta tek sayı vardır ve hep X'in gözündendir. “Kaybı geciktirmek” kaybeden taraf içindir; burada kaybeden X'tir (C). D ±1 ölçeğidir; hızlı ve yavaş kazancı ayırt edemez.

Hesaplama Sorusu · XOX ve derinlik cezası

Soru 7: XOX Konumunu Değerlendirme

X sol üstte ve üst ortada, O sağ üstte ve sol ortada; sıra X'te (MAX). Değerler X'in gözünden, derinlik cezasıyla: X kazanırsa +(10 − d), O kazanırsa −(10 − d), berabere 0; d kökten hamle sayısı.

XXOO

a) Beş boş karenin minimaks değeri nedir?
b) X hangi kareyi seçer? Gerekçesi nedir?
c) Alt satırdaki kareler neden kaybettirir?

Cevabı göster
XXOO+70−6−6−6

a) Merkez +7, sağ orta 0, sol alt, alt orta ve sağ alt −6.

b) Merkez: çatal kurar. X'in iki tehdidi oluşur: orta sütun (alt orta boş) ve çapraz (sağ alt boş). O birini kapatır, X üçüncü hamlesinde ötekini tamamlar: 10 − 3 = +7.

c) X alt satıra oynarsa O çatal kurar: X sol alta oynarsa O sağ ortaya (tehditler: merkez ve sağ alt), alt orta ya da sağ alta oynarsa O merkeze (tehditler: sağ orta ve sol alt). X birini kapatır, O kökten dört hamle sonra kazanır: −(10 − 4) = −6. Sağ orta bu çatalları önler ama X'e tehdit kazandırmaz: 0.

Çoktan Seçmeli · α ve β

Soru 8

Bir MAX düğümüne [α, β] = [3, 9] aralığı gelmiştir. İlk çocuğu bir MIN düğümüdür ve aynı aralıkla çağrılır; çocukta β 5'e iner ve çocuk 5 döndürür. MAX düğümündeki aralık şimdi nedir?

Doğru cevap A. Aralık ebeveynden çocuğa aynen iner; ebeveyne yalnız değer döner. MAX düğümü dönen 5 ile deger = 5 ve α = max(3, 5) = 5 yapar; β = 9 değişmez: [5, 9]. Çocuktaki β = 5 çocuğun yerel değişkenidir, ebeveyne taşınmaz (B). β'yı yalnız MIN düğümleri küçültür (C). D, dönen değerin ebeveynde α'yı büyüttüğünü unutur.

Adım Adım İzleme · Alfa-beta budaması

Soru 9: Alfa-Beta Kodunu İzleme

Kök A (MAX), B, C, D (MIN). Program ne yazdırır? Hangi yapraklar hiç okunmaz, budama hangi düğümlerde olur?

from math import inf
T = {"A": ["B", "C", "D"], "B": [5, 8],
     "C": [6, 2, 9], "D": [4, 8]}
def alfabeta(n, a, b, maks):
  if isinstance(n, int):        # yaprak
    return n
  deger = -inf if maks else inf
  for c in T[n]:
    v = alfabeta(c, a, b, not maks)
    if maks:
      deger = max(deger, v); a = max(a, deger)
    else:
      deger = min(deger, v); b = min(b, deger)
    if a >= b:
      break                  # budama
  return deger
print(alfabeta("A", -inf, inf, True))
AB58C629D48

Kodun kurduğu ağaç: kök MAX, ikinci katman MIN. Henüz hiçbir yaprak okunmadı.

A−∞[−∞, +∞]B58C629D48

İlk çağrı: kök A bir MAX düğümü; deger = -inf, a = -inf, b = inf.

A−∞[−∞, +∞]B+∞[−∞, +∞]58C629D48

alfabeta("B") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [-inf, inf].

A−∞[−∞, +∞]B5[−∞, 5]58C629D48

alfabeta(5) bir yaprak: 5 döner. min ile deger = 5, b = 5; a < b, devam.

A−∞[−∞, +∞]B5[−∞, 5]58C629D48

alfabeta(8) bir yaprak: 8 döner. min ile deger = 5, b = 5; a < b, devam; B bitti, 5 döner.

A5[5, +∞]B5[−∞, 5]58C629D48

B çağrısı 5 döndürdü. max ile deger = 5, a = 5; a < b, devam.

A5[5, +∞]B5[−∞, 5]58C+∞[5, +∞]629D48

alfabeta("C") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [5, inf].

A5[5, +∞]B5[−∞, 5]58C6[5, 6]629D48

alfabeta(6) bir yaprak: 6 döner. min ile deger = 6, b = 6; a < b, devam.

A5[5, +∞]B5[−∞, 5]58C2[5, 2]629D48

alfabeta(2) bir yaprak: 2 döner. min ile deger = 2, b = 2; a ≥ b.

budandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D48

a = 5 ≥ b = 2: break. C en fazla 2 verir; A zaten 5 değerini garanti etti. Yaprak 9 hiç okunmaz; C, 2 döndürür.

budandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D48

C çağrısı 2 döndürdü. max ile deger = 5, a = 5; a < b, devam.

budandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D+∞[5, +∞]48

alfabeta("D") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [5, inf].

budandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D4[5, 4]48

alfabeta(4) bir yaprak: 4 döner. min ile deger = 4, b = 4; a ≥ b.

budandıbudandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D4[5, 4]48

a = 5 ≥ b = 4: break. D en fazla 4 verir; A zaten 5 değerini garanti etti. Yaprak 8 hiç okunmaz; D, 4 döndürür.

budandıbudandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D4[5, 4]48

D çağrısı 4 döndürdü. max ile deger = 5, a = 5; a < b, devam; A bitti, 5 döner.

budandıbudandıA5[5, +∞]B5[−∞, 5]58C2[5, 2]629D4[5, 4]48

Program 5 yazdırır: A, B'ye giden hamleyi seçer. 7 yaprağın 5'i okundu; C'nin 9'u ve D'nin 8'i budandı. Minimaks da 5 bulur (C = 2, D = 4).

Adım Adım İzleme · MAX düğümünde budama

Soru 10: Kök MIN Olunca

Aynı kod bu kez kök MIN ile çağrılıyor (son satırda False); B, C, D birer MAX düğümü. Program ne yazdırır? Budama hangi düğümde olur?

from math import inf
T = {"A": ["B", "C", "D"], "B": [3, 6],
     "C": [4, 7, 2], "D": [5, 1]}
def alfabeta(n, a, b, maks):
  if isinstance(n, int):        # yaprak
    return n
  deger = -inf if maks else inf
  for c in T[n]:
    v = alfabeta(c, a, b, not maks)
    if maks:
      deger = max(deger, v); a = max(a, deger)
    else:
      deger = min(deger, v); b = min(b, deger)
    if a >= b:
      break                  # budama
  return deger
print(alfabeta("A", -inf, inf, False))
AB36C472D51

Kodun kurduğu ağaç: kök MIN, ikinci katman MAX. Henüz hiçbir yaprak okunmadı.

A+∞[−∞, +∞]B36C472D51

İlk çağrı: kök A bir MIN düğümü; deger = inf, a = -inf, b = inf.

A+∞[−∞, +∞]B−∞[−∞, +∞]36C472D51

alfabeta("B") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, inf].

A+∞[−∞, +∞]B3[3, +∞]36C472D51

alfabeta(3) bir yaprak: 3 döner. max ile deger = 3, a = 3; a < b, devam.

A+∞[−∞, +∞]B6[6, +∞]36C472D51

alfabeta(6) bir yaprak: 6 döner. max ile deger = 6, a = 6; a < b, devam; B bitti, 6 döner.

A6[−∞, 6]B6[6, +∞]36C472D51

B çağrısı 6 döndürdü. min ile deger = 6, b = 6; a < b, devam.

A6[−∞, 6]B6[6, +∞]36C−∞[−∞, 6]472D51

alfabeta("C") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, 6].

A6[−∞, 6]B6[6, +∞]36C4[4, 6]472D51

alfabeta(4) bir yaprak: 4 döner. max ile deger = 4, a = 4; a < b, devam.

A6[−∞, 6]B6[6, +∞]36C7[7, 6]472D51

alfabeta(7) bir yaprak: 7 döner. max ile deger = 7, a = 7; a ≥ b.

budandıA6[−∞, 6]B6[6, +∞]36C7[7, 6]472D51

a = 7 ≥ b = 6: break. C en az 7 verir; A zaten 6 değerini garanti etti. Yaprak 2 hiç okunmaz; C, 7 döndürür.

budandıA6[−∞, 6]B6[6, +∞]36C7[7, 6]472D51

C çağrısı 7 döndürdü. min ile deger = 6, b = 6; a < b, devam.

budandıA6[−∞, 6]B6[6, +∞]36C7[7, 6]472D−∞[−∞, 6]51

alfabeta("D") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, 6].

budandıA6[−∞, 6]B6[6, +∞]36C7[7, 6]472D5[5, 6]51

alfabeta(5) bir yaprak: 5 döner. max ile deger = 5, a = 5; a < b, devam.

budandıA6[−∞, 6]B6[6, +∞]36C7[7, 6]472D5[5, 6]51

alfabeta(1) bir yaprak: 1 döner. max ile deger = 5, a = 5; a < b, devam; D bitti, 5 döner.

budandıA5[−∞, 5]B6[6, +∞]36C7[7, 6]472D5[5, 6]51

D çağrısı 5 döndürdü. min ile deger = 5, b = 5; a < b, devam; A bitti, 5 döner.

budandıA5[−∞, 5]B6[6, +∞]36C7[7, 6]472D5[5, 6]51

Program 5 yazdırır: kök MIN, D'ye giden hamleyi seçer. Budama yalnız C'de (bir MAX düğümünde) oldu: C'nin 2'si okunmadı. D'de budama yok: D'nin değeri 5, gelen [−∞, 6] aralığının içinde.

Hesaplama Sorusu · Elle alfa-beta

Soru 11: Elle Alfa-Beta

ABE47F93CG25H16DI86J92

Kök A (MAX), B, C, D (MIN), E–J (MAX); çocuklar soldan sağa denenir.

a) Minimaksla kökün değeri ve MAX'ın hamlesi nedir?
b) Alfa-betada her iç düğüme hangi [α, β] aralığı gelir?
c) Hangi yapraklar budanır, kaç yaprak okunur?

Cevabı göster

a) E = 7, F = 9, B = 7; G = 5, H = 6, C = 5; I = 8, J = 9, D = 8. Kök = max(7, 5, 8) = 8, MAX D'yi seçer.

DüğümGelen [α, β]Döner
B[−∞, +∞]7
E[−∞, +∞]7
F[−∞, 7]9
C[7, +∞]5
G[7, +∞]5
D[7, +∞]8
I[7, +∞]8
J[7, 8]9
A8B7E747F993C5G525H16D8I886J992
  • F: 9 ≥ β = 7 → 3 budanır.
  • C: G = 5 ile β = 5 ≤ α = 7 → H (1, 6) budanır.
  • J: 9 ≥ β = 8 → 2 budanır.

c) On iki yapraktan 8'i okunur. F ve J'nin döndürdüğü 9 kesin değer değil, alt sınırdır. Kök D'de 7'den 8'e yükselir: D'nin değeri gelen aralığın içindedir.

Çoktan Seçmeli · Kod okuma

Soru 12

Alfa-beta kodundaki if a >= b: satırı if a > b: olarak değiştiriliyor. Ne olur?

Doğru cevap D. α = β iken düğümün değeri kökü değiştiremez: sonucu etkileyebilecek bir değer α ile β arasında kalmalıdır ve böyle bir değer yoktur. a > b bu durumda budamaz; kalan dallar boşuna okunur ama kök değeri değişmez. Örnek: kök MAX, B = [5, 7], C = [5, 9]. B = 5 ile α = 5; C'nin ilk yaprağı 5 ile β = 5. a >= b 9'u budar (3 yaprak), a > b okur (4 yaprak); iki kod da 5 bulur. α > β olunca budama sürer (B yanlış); koşul iki düğüm türünde aynı satırdır (C).

Çoktan Seçmeli · Knuth–Moore formülü

Soru 13

Her iç düğümün 5 çocuğu olan, derinliği 5 olan düzgün bir ağaçta çocuklar en iyi sırayla deneniyor. Alfa-beta kaç yaprak okur?

Doğru cevap C. En iyi sırada okunan yaprak sayısı b⌈d/2⌉ + b⌊d/2⌋ − 1'dir: 53 + 52 − 1 = 125 + 25 − 1 = 149. 3.125 = 55, budamasız aramanın ya da en kötü sıranın sayısıdır. 125 yalnız ilk terimdir; 250 ise 2 · 53'tür. d tek olduğunda iki üs farklıdır (3 ve 2). Minimaksın 3.125 yaprağına karşı yaklaşık 21 kat az okuma.

Adım Adım İzleme · Hamle sıralaması

Soru 14: Sıralama ve Okunan Yapraklar

Çocuklar en iyi sırada verilmiştir. Program ne yazdırır? En kötü sırada kaç yaprak okunurdu?

from math import inf
T = {"A": ["B", "C", "D"], "B": [7, 9, 8],
     "C": [3, 8, 10], "D": [5, 12, 6]}
okunan = []
def alfabeta(n, a, b, maks):
  if isinstance(n, int):        # yaprak
    okunan.append(n)
    return n
  deger = -inf if maks else inf
  for c in T[n]:
    v = alfabeta(c, a, b, not maks)
    if maks:
      deger = max(deger, v); a = max(a, deger)
    else:
      deger = min(deger, v); b = min(b, deger)
    if a >= b:
      break                  # budama
  return deger
print(alfabeta("A", -inf, inf, True), okunan)
AB798C3810D5126

Kodun kurduğu ağaç: kök MAX, ikinci katman MIN. Henüz hiçbir yaprak okunmadı.

A−∞[−∞, +∞]B798C3810D5126

İlk çağrı: kök A bir MAX düğümü; deger = -inf, a = -inf, b = inf.

A−∞[−∞, +∞]B+∞[−∞, +∞]798C3810D5126

alfabeta("B") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [-inf, inf].

A−∞[−∞, +∞]B7[−∞, 7]798C3810D5126

alfabeta(7) bir yaprak: 7 döner. min ile deger = 7, b = 7; a < b, devam.

A−∞[−∞, +∞]B7[−∞, 7]798C3810D5126

alfabeta(9) bir yaprak: 9 döner. min ile deger = 7, b = 7; a < b, devam.

A−∞[−∞, +∞]B7[−∞, 7]798C3810D5126

alfabeta(8) bir yaprak: 8 döner. min ile deger = 7, b = 7; a < b, devam; B bitti, 7 döner.

A7[7, +∞]B7[−∞, 7]798C3810D5126

B çağrısı 7 döndürdü. max ile deger = 7, a = 7; a < b, devam.

A7[7, +∞]B7[−∞, 7]798C+∞[7, +∞]3810D5126

alfabeta("C") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [7, inf].

A7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5126

alfabeta(3) bir yaprak: 3 döner. min ile deger = 3, b = 3; a ≥ b.

budandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5126

a = 7 ≥ b = 3: break. C en fazla 3 verir; A zaten 7 değerini garanti etti. Yapraklar 8 ve 10 hiç okunmaz; C, 3 döndürür.

budandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5126

C çağrısı 3 döndürdü. max ile deger = 7, a = 7; a < b, devam.

budandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D+∞[7, +∞]5126

alfabeta("D") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [7, inf].

budandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5[7, 5]5126

alfabeta(5) bir yaprak: 5 döner. min ile deger = 5, b = 5; a ≥ b.

budandıbudandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5[7, 5]5126

a = 7 ≥ b = 5: break. D en fazla 5 verir; A zaten 7 değerini garanti etti. Yapraklar 12 ve 6 hiç okunmaz; D, 5 döndürür.

budandıbudandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5[7, 5]5126

D çağrısı 5 döndürdü. max ile deger = 7, a = 7; a < b, devam; A bitti, 7 döner.

budandıbudandıA7[7, +∞]B7[−∞, 7]798C3[7, 3]3810D5[7, 5]5126

Çıktı: 7 [7, 9, 8, 3, 5]. 9 yapraktan 5'i okunur: 3 + 3 − 1 = 5. En kötü sırada (kökte C, D, B; yapraklar büyükten küçüğe) budama olmaz, 9 yaprağın hepsi okunur; kök yine 7.

Hesaplama Sorusu · Değerlendirme fonksiyonu

Soru 15: Dörtlü Bağla: E(s) Hesabı

E(s) = Σ p(w) + 3 · (Korta − Morta); pencere puanı: 3 kırmızı + 1 boş +5, 2 kırmızı + 2 boş +2, maviler için −5 ve −2, öteki pencereler 0. Kırmızı = MAX.

1234567

a) Bu konumda hangi pencereler puan alır, E(s) kaçtır?
b) Sıra Kırmızı'da; Kırmızı 5. sütuna oynarsa taş 2. satıra düşer. Yeni konumda E(s) kaçtır?

Cevabı göster
1234567

Kareler (sütun, satır), satır alttan. a) Yatay ve dikey pencerelerin hepsi iki renkli, tek taşlı ya da boştur: 0. Puan alan iki çapraz:

  • (5, 1), (4, 2), (3, 3), (2, 4): iki kırmızı + iki boş → +2
  • (6, 1), (5, 2), (4, 3), (3, 4): iki mavi + iki boş → −2

Orta sütun: 3 · (2 − 1) = +3. E(s) = 2 − 2 + 3 = +3.

b) Yeni taş (5, 2) mavi çaprazı iki renkli yapar: −2 kaybolur. +2 alan altı pencere: 2. satırda (2–5), (3–6), (4–7) yatayları; 5. sütunda (5, 1)–(5, 4) dikeyi; (4, 1)–(7, 4) ve (5, 1)–(2, 4) çaprazları. E(s) = 6 · 2 + 3 = +15.

Çoktan Seçmeli · Ufuk etkisi

Soru 16

Derinlik sınırlı arama yapan bir satranç programı, bir taşını kurtaramayacağını görünce boş yere şah çekerek taş kaybını arama sınırının ötesine itiyor. Bu olgunun adı ve onu en doğrudan azaltan yöntem nedir?

Doğru cevap B. Arama sınırın ötesini göremez; kaçınılmaz kaybı ufkun ötesine iten hamleler kaybı ortadan kaldırmaz, yalnız görünmez yapar: ufuk etkisi. Sınırdaki konumda taş alımı ya da şah gibi hareketli bir durum sürüyorsa arama yalnız bu hamlelerle sürdürülür ve konum sakinleşince değerlendirilir: sakinlik araması. Geçiş tablosu (C) aynı konumu tekrar aramamayı sağlar, ufku uzatmaz. Hamle sıralaması (A) ve budama koşulu (D) yalnız maliyeti değiştirir; kök değerini değiştirmez.

Hesaplama Sorusu · Ufuk etkisi

Soru 17: Derinlik 2 mi, Derinlik 3 mü?

Kırmızı (MAX) kökte. D, E, F, G derinlik 2'deki konumlardır; sağlarındaki sayı E(s). Yapraklar, derinlik 3'teki konumların E(s) değerleridir. Kesik çizgi derinlik 2 sınırıdır.

ABD+5−6−8E+786CF+231G+452

a) Derinlik 2 araması hangi hamleyi seçer, kök değeri nedir?
b) Derinlik 3 araması neyi seçer?
c) Fark neden doğar? Derinlik 3'ün değeri kesin midir?

Cevabı göster

a) Derinlik 2: B = min(+5, +7) = +5, C = min(+2, +4) = +2. Kök +5, seçim B.

b) Derinlik 3: D = max(−6, −8) = −6, E = +8, B = min(−6, +8) = −6; F = +3, G = +5, C = +3. Kök +3, seçim C.

A+3B−6D−6−6−8E+886C+3F+331G+552

c) D, derinlik 2'de +5 ile iyi görünür; oysa sıra Kırmızı'ya geldiğinde her hamlesi kötü bir konuma (−6, −8) gider. Derinlik 2 araması bunu sınırın ötesinde kaldığı için göremez: ufuk etkisi. Derinlik 3'ün değeri de bir tahmindir; ufuk yalnız bir yarım hamle uzaklaşmıştır.

Kod Yazma Sorusu · Negamaks

Soru 18: Negamaks ile Nim

Bir Nim konumu yığın boylarının demetidir, örneğin (1, 2, 3). Özyinelemeli minimaks koduyla aynı üslupta iki fonksiyon yazılacak:

  • deger(y): sıradaki oyuncu en iyi oyunla kazanıyorsa +1, kaybediyorsa −1 (negamaks).
  • kazandiran(y): değeri −1 olan çocuk konumların listesi.

Şu üç satır ne yazdırır?

print(deger((1, 2)), deger((2, 2)))
print(deger((1, 2, 3)), deger((2, 5)))
print(kazandiran((2, 5)))
Cevabı göster
def cocuklar(y):              # bütün hamlelerin sonuçları
  return [y[:i] + (y[i] - k,) + y[i+1:]
          for i in range(len(y)) for k in range(1, y[i] + 1)]
def deger(y):                 # y: yığın boyları
  if sum(y) == 0:             # hamle yok: P
    return -1
  return max(-deger(z) for z in cocuklar(y))
def kazandiran(y):
  return [z for z in cocuklar(y) if deger(z) == -1]
print(deger((1, 2)), deger((2, 2)))
print(deger((1, 2, 3)), deger((2, 5)))
print(kazandiran((2, 5)))

Çıktı:

1 -1
-1 1
[(2, 2)]

Bir çocuk −1 ise max(−değer) = +1 (N); bütün çocuklar +1 ise −1 (P). (2, 5)'te tek kazandıran hamle ikinci yığını 2'ye indirmektir: 2 ⊕ 5 = 7, 5 ⊕ 7 = 2. Aynı konumlar tekrar tekrar aranır; functools.lru_cache her konumu bir kez hesaplatır (geçiş tablosu).

Son

Bölüm 2: Minimaks ve Alfa-Beta Budaması · Çalışma Soruları
Konu anlatımı: Bölüm 2: Minimaks ve Alfa-Beta Budaması sunumu · Ders notu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.