T: tema · Z: kodu büyüt · S: konuşmacı notları · F: tam ekran · Esc: genel bakış · ⌂ ders haritası
OYUNLARDA YAPAY ZEKÂ · GRAFLAR
Yönlü Graflar
Tek yönlü kapılar, teknoloji ağaçları, görev zincirleri — oklar önemli!
PRESS ▶ TO START

Bu derste oyunun haritası 🗺️

  1. Terimler — yönlü kenar, giriş/çıkış derecesi digraph
  2. Erişilebilirlik — DFS yine iş başında; bonus: çöp toplayıcı nasıl çalışır?
  3. Topolojik sıralama — teknoloji ağacında araştırma sırası
  4. Döngü tespiti — kilitlenen görev zincirini bulmak
  5. Güçlü bileşenler — oyuncu bir yere sıkışıp kalabilir mi?
🎮 Bu dersin sonunda…

…Civilization’daki teknoloji ağacını doğru sırayla araştıran, görev bağımlılıklarındaki ölümcül hataları bulan ve “oyuncu bu odaya girerse bir daha çıkamaz mı?” (soft-lock) sorusunu yanıtlayan kodu anlayacaksınız.

🤔 ISINMA: TEK YÖNLÜ
  • Bir uçurumdan aşağı atlayabilirsiniz ama yukarı tırmanamazsınız.
  • “Bronz”u araştırmadan “Demir”i araştıramazsınız; tersi değil.
  • Takip ettiğiniz yayıncı sizi takip etmek zorunda değil.
  • Düşman YZ’si “devriye”den “saldırı”ya geçebilir ama “ölü”den “devriye”ye dönemez.

Hepsinde kenarların bir yönü var: v → w, w → v demek değil. Yönsüz graf algoritmalarının çoğu çalışmaya devam ediyor — ama yeni ve çok faydalı sorular da doğuyor.

Mini sözlük

digraph · directed edgeyönlü graf · yönlü kenarv → w: v’den w’ye gidilir (tersi değil)
outdegree · indegreeçıkış / giriş derecesiDüğümden çıkan / düğüme giren ok sayısı
reachableerişilebilirv’den w’ye yönlü bir yol var
DAGyönlü döngüsüz grafdirected acyclic graph: hiç yönlü döngü yok
topological ordertopolojik sıraHer ok soldan sağa gidecek şekilde düğümleri dizmek
postordersonsıraDFS’de düğümlerin bitme sırası
strongly connectedgüçlü bağlıv’den w’ye ve w’den v’ye yol var
garbage collectionçöp toplamaUlaşılamayan nesnelerin belleğini otomatik geri almak
LEVEL 0
Terimler
yönlü graf ve API’si
  • terimler
  • erişilebilirlik ve çöp toplayıcı
  • topolojik sıralama
  • döngü tespiti
  • güçlü bileşenler

🎮 Oyunlarda yönlü graflar

sistemdüğümv → w kenarı
Metroidvania / platform haritasıbölgev’den w’ye geçilebilir (tek yönlü kapı, uçurum, portal)
Teknoloji / yetenek ağacıteknolojiv, w’nin ön koşulu
Görev zincirigörevv bitmeden w açılmaz
YZ sonlu durum makinesi (FSM)durum (devriye, saldırı…)v’den w’ye geçiş kuralı
Diyalog ağacıreplikbu seçenek → şu replik
Bellek (çalışma zamanı)nesnev, w’ye bir referans tutuyor

🔗 Ayrıntısı: Y2 · Sonlu Durum Makineleri (durumlar düğüm, geçişler yönlü kenar) sunumunda.

Yönlü graf sınıfı

Yönsüz Graph’tan tek fark: addEdge(v, w) sadece adj[v]’ye ekler.

  • adj[v] = v’den çıkan oklar
  • Toplam kayıt: E (yönsüzde 2E)
  • reverse(): bütün okları çevir — “v’ye kim geliyor?” sorusu ve güçlü bileşenler için

🔗 Başka gözle: etkileşimli anlatımlar ve yazılar

Aynı konuyu başka bir anlatımla, kendi elinizle oynayarak görmek çok işe yarar. Kartlar yeni sekmede açılır; çoğu İngilizce ama görsel ve etkileşimli.

Quiz 1 · terimler
Bir yönlü grafta bütün düğümlerin çıkış derecelerinin toplamı neye eşittir?
Her okun tam bir başlangıç noktası var → çıkış dereceleri toplamı = E. Aynı şekilde giriş dereceleri toplamı da E. (Yönsüz grafta her kenar iki uca birden sayılıyordu: 2E.)
LEVEL 1
Erişilebilirlik ve çöp toplayıcı
DFS ve BFS yönlü graflarda da aynen çalışır
  • terimler
  • erişilebilirlik ve çöp toplayıcı
  • topolojik sıralama
  • döngü tespiti
  • güçlü bileşenler

Yönlü DFS — iz tablosu

Kod yönsüz DFS ile birebir aynı: sadece okların yönünde ilerler. 0’dan başlayınca 6, 7, 8, 9… hiç işaretlenmez: oralara 0’dan ok yönünde yol yok. Düğüme tıklayıp başka kaynaklar deneyin (ör. 6 ya da 7).

♻️ Çöp toplayıcı: erişilebilirliğin en meşhur uygulaması

Düğüm = bellekteki nesne, ok = referans. Kökler: global/static değişkenler ve o an çalışan fonksiyonların yerel değişkenleri. İşaretle mark: köklerden DFS. Süpür sweep: işaretsiz her nesneyi sil. (1960, John McCarthy, Lisp)

⚙️ Oyunlarda GC neden önemli?
  • C#, Java, JavaScript, Python: hepsinde çöp toplayıcı var. Unity C# betikleri de öyle.
  • İşaretleme sırasında programın (bir kısmı) durur → oyunda takılma (GC spike). 16,6 ms’lik kare bütçesinde 5 ms’lik bir GC fark edilir!
  • Çözüm: her karede yeni nesne üretme allocation. Mermi, partikül, düşman → nesne havuzu object pool (Bağlı Listeler sunumu!). string birleştirmeyi ve LINQ’yu Update() içinde azalt.
  • Referans sayma (Python’un ana yöntemi, Swift, C++ shared_ptr): her nesne kendisine kaç ok geldiğini sayar, 0 olunca silinir. Hızlı ama döngüleri kaçırır → Python ayrıca döngü bulan bir toplayıcı çalıştırır.

Yönlü BFS: en kısa yönlü yollar

BFS de aynen çalışır: kaynaktan ok yönünde en az kenarlı yollar.

  • Çok kaynaklı BFS: başta kuyruğa birden fazla düğüm koy → “herhangi bir kaynaktan en yakın uzaklık”. 🎮 “En yakın can paketine kaç adım?” haritasını her kare için bir kez hesapla (bütün can paketleri kaynak).
  • Web tarayıcı web crawler: başlangıç sayfasından BFS; kuyruk = ziyaret edilecek adresler, küme = görülen adresler.
📜 UyarıBuradaki web tarayıcısı 10 satır! Gerçek bir tarayıcı ise “aynı sayfanın farklı adresleri”, robots.txt, hız sınırı… ile milyonlarca satır. Algoritma iskelet, mühendislik et.
Quiz 2 · erişilebilirlik
Mark-and-sweep çöp toplayıcı, birbirini gösteren ama hiçbir kökten ulaşılamayan iki nesneyi (A → B, B → A) ne yapar?
Mark-and-sweep “referansı var mı?” diye değil, “köklerden erişilebilir mi?” diye sorar. Döngü erişilemezse ikisi de çöp. Referans sayma ise burada ikisinde de sayacı 1 görür ve silemez (bellek sızıntısı).
LEVEL 2
Topolojik sıralama
ön koşulları bozmadan sıraya dizmek
  • terimler
  • erişilebilirlik ve çöp toplayıcı
  • topolojik sıralama
  • döngü tespiti
  • güçlü bileşenler

Problem: hangi sırayla?

Görevler ve “v, w’den önce yapılmalı” kuralları var. Bütün kurallara uyan bir sıra bul.

  • 🎮 Teknoloji ağacı: araştırma sırası
  • 🎮 RTS yapı sırası (kışla → atölye → fabrika)
  • 🎮 Oyun motoru: varlıkları derlerken bağımlılık sırası; sahnede güncelleme sırası (önce ebeveyn, sonra çocuk)
  • Üniversite: ön koşullu dersler; Excel formülleri; make, npm, pip paket kurulumu
ÖnermeBir yönlü grafın topolojik sırası ancak ve ancak grafta yönlü döngü yoksa (DAG ise) vardır.

Döngü varsa: A, B’den önce; B, C’den önce; C, A’dan önce → imkânsız. (Görev zincirindeki kilitlenme!)

Saf yaklaşım: bütün sıraları dene

Taş aletAteşTekerlekÇömlekBronzAraba

Altı teknoloji, altı kural: her ok “önce bu, sonra şu”. Örneğin Araba için hem Tekerlek hem Bronz gerekli.

Saf yol 1: her sırayı yaz, kuralları kontrol et
  • 6 teknoloji → 6! = 720 sıra. Kurallara uyan yalnızca 11 tane; 709’u boşa yazıldı.
  • 11 teknoloji (demodaki ağaç) → 11! = 39 916 800 sıra.
  • 80 teknolojilik bir strateji oyunu → 80! ≈ 7 × 10118 sıra. Evrendeki atom sayısı yaklaşık 1080.
Saf yol 2: her turda listeyi baştan tara Ön koşulları bitmiş ilk teknolojiyi bul, sıraya ekle, baştan tara. Doğru çalışır; ama her tur bütün okları yeniden kontrol eder: V tur × (V + E) iş. 10 000 düğümlü bir bağımlılık grafında yüz milyonlarca kontrol.
Bu sunumdaki yolDFS grafı bir kez gezer: V + E. Kahn algoritması da saf yol 2’nin akıllı hâli: “kalan ön koşul sayısını” saklar, taramayı hiç yapmaz.

Teknoloji ağacı — topolojik sıralama

Algoritma şaşırtıcı derecede kısa: DFS yap, her düğüm bitince listeye ekle (sonsıra), sonunda listeyi ters çevir.

Elle izleme: DFS ile topolojik sıra

Taş alet6Ateş4Tekerlek5Çömlek1Bronz3Araba2

Komşu listeleri (bu sırayla bakılır): Taş: Ateş, Tekerlek · Ateş: Çömlek, Bronz · Tekerlek: Araba · Bronz: Araba. Turuncu sayı = bitiş sırası; yeşil oklar DFS’in yürüdüğü oklar, kırmızı kesikli ok işaretli düğüme çarpıp geri döndü.

#ne oldu?yığın (açık çağrılar)sonsıra
1dfs(Taş) başlarTaş—
2Taş → Ateş: dfs(Ateş)Taş, Ateş—
3Ateş → Çömlek: dfs(Çömlek); oku yok, biterTaş, AteşÇömlek
4Ateş → Bronz: dfs(Bronz)Taş, Ateş, BronzÇömlek
5Bronz → Araba: dfs(Araba); oku yok, biterTaş, Ateş, Bronz+ Araba
6Bronz’un okları bitti, biterTaş, Ateş+ Bronz
7Ateş’in okları bitti, biterTaş+ Ateş
8Taş → Tekerlek: dfs(Tekerlek); Tekerlek → Araba: Araba zaten işaretli, atla; Tekerlek biterTaş+ Tekerlek
9Taş’ın okları bitti, biter—+ Taş

10. Sonsırayı ters çevir: Taş, Tekerlek, Ateş, Bronz, Araba, Çömlek. Altı kuralın altısı da tutuyor ✔

Dikkat: bir düğüm ancak bütün okları bitince listeye girer; okun ucundakiler ondan önce girmiştir. Ters çevirince her ok soldan sağa bakar.

Neden işe yarıyor?

ÖnermeBir DAG’in DFS ters sonsırası bir topolojik sıradır.
KanıtHerhangi bir v → w okuna bakalım. dfs(v) bu oka baktığında üç durum var:
  • dfs(w) daha çağrılmamış → şimdi çağrılır ve v’den önce biter
  • dfs(w) zaten bitmiş → w zaten listede, v’den önce
  • dfs(w) çağrılmış ama bitmemiş → w yığında, yani w’den v’ye yol var + v → w = döngü! DAG’de imkânsız.

Her durumda w, sonsırada v’den önce → ters sırada v, w’den önce. ∎

Topolojik sıralama — kod

🎒 Fonksiyon içinde fonksiyon (C# “local function”, Python/JS iç fonksiyon): iç fonksiyon dıştakinin değişkenlerini (marked, post) görebilir ve değiştirebilir.

🎒 Kodu okuyalım

ifadene demekneden böyle
post.push(v) döngüden sonrav’nin bütün torunları bitti, şimdi v bittibir görev ancak ondan sonra gelecek her şey listeye girdikten sonra eklenir
post.reverse()sonsırayı ters çeviren son biten (hiçbir şeyin ön koşulu olmayan değil, en “temel” olan) başa gelir: ön koşullar önce
dış döngü for v …her işaretsiz düğümden yeni bir DFSgraf tek parça olmayabilir; hiçbir görev atlanmasın
markedbu görev zaten sıraya konduher düğüm bir kez: toplam iş ~V + E
döngü kontrolü yokbu kod grafın DAG olduğunu varsayardöngü varsa çıktı anlamsızdır: önce sonraki slayttaki döngü testi

Alternatif: Kahn algoritması (giriş derecesiyle)

  1. Her düğümün giriş derecesini say (kaç ön koşulu var?)
  2. Giriş derecesi 0 olanları (ön koşulu olmayanları) kuyruğa koy
  3. Kuyruktan v çıkar, sıraya ekle; v’nin her okunu “sil”: indeg[w]--; 0 olan w’yi kuyruğa koy
  4. Sonunda sırada V’den az düğüm varsa → döngü var!
🎮 Oyuncunun gözündenKahn tam bir oyuncu gibi düşünür: “Şu an araştırabileceğim (bütün ön koşulları tamam) teknolojiler hangileri?” Bu kuyruk, teknoloji ekranındaki parlayan, tıklanabilir kutular!

Elle izleme: Kahn algoritması

Taş alet0Ateş1Tekerlek1Çömlek1Bronz1Araba2

Rozetler başlangıçtaki giriş dereceleri (kalan ön koşul sayısı). Yeşil = hemen araştırılabilir.

🎮 Oyuncu ekranıHer adımdaki kuyruk, teknoloji ekranında parlayan kutular. 3. adımda Araba hâlâ gri: Bronz bitmeden açılmaz.
#kuyruktan çıkanokları “sil”: giriş derecesi azalırkuyruk (sonra)
0—giriş dereceleri sayılır; 0 olan tek düğüm Taş[Taş]
1TaşAteş 1 → 0, Tekerlek 1 → 0: ikisi de kuyruğa[Ateş, Tekerlek]
2AteşÇömlek 1 → 0, Bronz 1 → 0: kuyruğa[Tekerlek, Çömlek, Bronz]
3TekerlekAraba 2 → 1: hâlâ Bronz’u bekliyor[Çömlek, Bronz]
4Çömlekoku yok[Bronz]
5BronzAraba 1 → 0: kuyruğa[Araba]
6Arabaoku yok[ ]

Sıra: Taş, Ateş, Tekerlek, Çömlek, Bronz, Araba. Sıraya 6 düğüm girdi = V → döngü yok ✔

DFS “Taş, Tekerlek, Ateş, …” demişti; Kahn başka bir sıra buldu. İkisi de doğru: 11 geçerli sıradan ikisi. Döngü olsaydı döngüdeki düğümlerin giriş derecesi hiç 0’a inmez, sıra V’den kısa kalırdı.

🎬 Ara: topolojik sıralama, görsel

Topological Sort Visualized and Explained
Carl the Person · 3 dk 27 sn · YouTube’da aç

Topolojik sıralamanın kısa ve çok görsel bir anlatımı. Teknoloji ağacı demosundaki iki yöntemle (DFS sonsırası ve Kahn) karşılaştırarak izleyin.

🤔 İzlerkenVideodaki yöntem bizim iki yöntemimizden hangisine benziyor? Aynı graf için birden fazla doğru sıra çıkabilir mi? Döngü olsaydı ne olurdu; görev zinciri demosundaki hata bununla nasıl bulunur?
Quiz 3 · topolojik sıralama
Teknoloji ağacında Kahn algoritmasının kuyruğu herhangi bir anda neyi temsil eder?
Bir teknoloji, giriş derecesi (kalan ön koşul sayısı) 0 olduğunda kuyruğa girer. Oyuncu arayüzünde “araştırılabilir” durumdaki kutular tam bu küme. Birden fazla seçenek varsa birden fazla geçerli topolojik sıra vardır — oyuncunun stratejisi!
LEVEL 3
Döngü tespiti
kilitlenen görevleri bulmak
  • terimler
  • erişilebilirlik ve çöp toplayıcı
  • topolojik sıralama
  • döngü tespiti
  • güçlü bileşenler

Görev zincirinde ölümcül hata

Tasarımcı hata yaptı: “Demirciyle konuş” için kılıç, kılıç için maden, maden için demirci gerekiyor. Oyuncu sonsuza kadar takılır! Fikir: DFS sırasında şu an yığında olan bir düğüme geri dönen ok = döngü. Graf seçicisinden teknoloji ağacını deneyin (döngü yok).

Döngü tespiti — kod

Her düğüm için üç durum:

  • beyaz: hiç ziyaret edilmedi
  • gri (on_stack): ziyaret ediliyor, yığında
  • siyah: bitti

Gri bir düğüme ok → geri kenar back edge → döngü.

⚠️ Yönsüz graftan farkıSiyah (bitmiş) bir düğüme ok döngü değildir: A → C ve B → C, C’ye iki yoldan gelmek döngü yapmaz.

Elle izleme: döngüyü yakalamak

Köye gir1Demirciyle konuş2Kılıcı bul3Madeni temizle7Ejderhayı yen4Hazine5

Komşu listeleri demodaki sırayla: Kılıç önce Ejderha’ya, sonra Maden’e bakar. Turuncu = gri (yığında), siyah = bitti; rozet = ziyaret sırası. Kırmızı ok = geri kenar.

#ne oldu?gri düğümler (yığın)siyah (bitti)
1dfs(Köy)Köy—
2Köy → Demirci: dfs(Demirci)Köy, Demirci—
3Demirci → Kılıç: dfs(Kılıç)Köy, Demirci, Kılıç—
4Kılıç → Ejderha: dfs(Ejderha)…, Kılıç, Ejderha—
5Ejderha → Hazine: dfs(Hazine); oku yok…, Kılıç, EjderhaHazine
6Ejderha’nın okları bitti…, Kılıç+ Ejderha
7Kılıç → Maden: dfs(Maden)Köy, Demirci, Kılıç, Maden…
8Maden → Demirci: Demirci gri (yığında)! Geri kenar → döngü

9. Döngüyü yazdır: Maden’den edgeTo ile geri yürü (Maden ← Kılıç ← Demirci), Demirci’ye gelince dur: Demirci → Kılıç → Maden → Demirci.

Karşılaştırın: topolojik sıra izlemesinin 8. adımında Tekerlek → Araba oku siyah (bitmiş) bir düğüme gidiyordu: o döngü değildi. Fark tek bir soru: okun ucu şu an yığında mı?

🎒 Kodu okuyalım

ifadene demekneden böyle
onStack[v] = true (gri)v şu an açık: DFS’in içindeyizyığındaki düğümler kökten v’ye giden yol üzerindedir
if (onStack[w]) return trueyoldaki bir düğüme geri okyol + bu ok = döngü; bulundu
onStack[v] = false (siyah)v ve altındakiler bittisonradan v’ye ok gelmesi döngü değildir, yalnızca başka bir yoldan ulaşmaktır
marked ve onStack ayrı“bir kez gezildi” ile “şu an yolda” farklı şeylertek dizi kullanılırsa çapraz oklar yanlışlıkla döngü sayılır
&& dfs(w)alt aramada döngü bulunduysa hemen dönilk döngüde dur; bütün grafı gezmeye gerek yok

🐍 Kod laboratuvarı: döngü var mı? (Python)

Bu kod “işaretli bir düğüme ok” gördüğü an döngü diyor. Neden yanlış? (İpucu: [[1, 2], [2], []] grafında döngü var mı?) Bir on_stack dizisi ekleyerek düzeltin.
Quiz 4 · döngü tespiti
Bir Excel tablosunda A1 = B1 + 1, B1 = C1 * 2, C1 = A1 − 3 yazıldı. Excel ne der ve neden?
Excel hücreleri bağımlılık grafının topolojik sırasıyla hesaplar. A1 → B1 → C1 → A1 bir döngü: hiçbirini önce hesaplayamazsınız. Excel’in “Döngüsel Başvuru” uyarısı bu sunumdaki döngü tespitinin ta kendisi.
LEVEL 4
Güçlü bileşenler
strong components — karşılıklı ulaşılabilen bölgeler
  • terimler
  • erişilebilirlik ve çöp toplayıcı
  • topolojik sıralama
  • döngü tespiti
  • güçlü bileşenler

Güçlü bağlılık

  • v ve w güçlü bağlı: v’den w’ye ve w’den v’ye yol var
  • Bu bir denklik ilişkisi → düğümler güçlü bileşenlere ayrılır (her düğüm tam birinde)
  • Bileşenleri tek düğüm gibi düşünürseniz kalan graf bir DAG olur: bölgeler arası tek yönlü yolculuk
🎮 Soft-lock tespitiMetroidvania’da tek yönlü kapılar ve uçurumlar var. Oyuncu bir güçlü bileşene girdi; oradan çıkışa giden yol yoksa ve geri dönemiyorsa → sıkıştı (soft-lock)! Seviye tasarım araçları her bölgenin bileşenini hesaplayıp “buradan çıkış bölgesine yol var mı?” diye kontrol eder.

Ekonomide: Web’deki “dev bileşen”, besin ağlarında birbirini yiyen tür grupları.

Kosaraju–Sharir algoritması

İki DFS ile: (1) ters grafta DFS yap ve ters sonsırayı hesapla, (2) asıl grafta düğümleri bu sırayla ele al: işaretsiz her düğümden yapılan DFS tam olarak bir güçlü bileşeni işaretler. Örnek grafın 5 güçlü bileşeni var.

Elle izleme: Kosaraju–Sharir, bir metroidvania haritasında

KöyOrmanMağaraGölKristalBossbileşen 3bileşen 2bileşen 1

Mağara → Göl tek yönlü bir uçurum (atlarsın, tırmanamazsın); Kristal → Boss tek yönlü bir kapı. Ters graf: bütün okları çevir.

Saf yolHer oda çifti için iki yönde “yol var mı?” sor: her odadan bir DFS → V × (V + E). 6 oda için sorun değil; 10 000 odalı açık dünyada 10 000 DFS. Kosaraju–Sharir yalnızca iki DFS yapar.
#ne oldu?sonuç
11. aşama: ters grafta DFS, sonsırayı tut
2dfs(Köy) → Mağara → Orman → (Köy işaretli)Orman, Mağara, Köy
3dfs(Göl) → (Mağara işaretli) → Kristal → (Göl işaretli)+ Kristal, Göl
4dfs(Boss) → (Kristal işaretli)+ Boss
5ters sonsıra: Boss, Göl, Kristal, Köy, Mağara, Orman
62. aşama: asıl grafta, bu sırayla DFS
7dfs(Boss): oku yokbileşen 1 = {Boss}
8dfs(Göl) → Kristal → (Göl, Boss işaretli)bileşen 2 = {Göl, Kristal}
9Kristal işaretli, atla; dfs(Köy) → Orman → Mağara → (Köy, Göl işaretli)bileşen 3 = {Köy, Orman, Mağara}

Sıra neden önemli? 2. aşamaya Köy’den başlasaydık: Köy → Orman → Mağara → Göl → Kristal → Boss, altı oda tek bileşen sanılırdı ✗. Ters sonsıra, “dışarı oku olmayan” Boss bileşeninden başlatır; her DFS kendi bileşeninde kalır.

Kosaraju–Sharir: neden ve ne kadar?

ÖnermeKosaraju–Sharir algoritması güçlü bileşenleri E + V ile orantılı sürede bulur.

İki DFS + bir ters çevirme. Kanıt fikri: ters sonsıra, bileşenleri “kaynak” bileşenden “havuz” bileşene doğru değil, havuzdan başlayarak verir; böylece ikinci DFS bir bileşenden dışarı sızamaz.

📜 “Basit ama gizemli”Robert Tarjan 1972’de ilk doğrusal zamanlı algoritmayı buldu. S. Rao Kosaraju 1978’de daha basit bu yöntemi derste anlattı ama yayımlamadı; Micha Sharir 1981’de bağımsız olarak yayımladı. Algoritma “basit ama gizemli” diye anılır: kodu 10 satır, doğruluğunu anlamak bir saat!
Quiz 5 · güçlü bileşenler
Bir metroidvania haritasının güçlü bileşenleri hesaplandı. Hangi durum bir soft-lock riski gösterir?
Oyuncu o bileşene girebilir (girişten ulaşılabilir) ama oradan çıkışa hiçbir yol yok → sıkışır. Tek yönlü geçişlerin kendisi (D) sorun değil, tasarımın parçası; sorun “geri dönüşü olmayan çıkmaz”. Tüm harita tek bir güçlü bileşense (C) her yerden her yere gidilebilir — güvenli.

🧪 Kod laboratuvarı: Kahn ile topolojik sıra

TODO kısmını doldurun. Bonus: sonunda order.length < V ise ne demektir? (Döngü!) Bu durumda null döndürün.

Derin hikâye: Çöp toplayıcı bir graf algoritmasıdır

  • 1960: John McCarthy, Lisp’i anlatan makalesinde bellekte artık kullanılmayan hücreleri otomatik geri kazanmanın bir yolunu tarif etti: işaretle ve süpür (mark and sweep).
  • Bellek bir yönlü graftır: nesneler düğüm, referanslar kenar. “Kökler”den (yığındaki değişkenler, statik alanlar) başlayan bir DFS/BFS, ulaşılabilen her nesneyi işaretler; işaretlenmeyen her şey çöptür ve süpürülür. Yani çöp toplama, bu sunumdaki ulaşılabilirlik sorusunun ta kendisi.
  • Unity, C# betikleri için muhafazakâr bir çöp toplayıcı (Boehm–Demers–Weiser) kullanır ve 2019’dan beri işi karelere bölen artımlı (incremental) modu sunar. Yine de çok fazla nesne ayırmak, toplama sırasında takılmalara yol açar.
DersOyunlarda her kare yeni nesne ayırmak (new, LINQ, string birleştirme) çöp toplayıcıya iş çıkarır; grafı her taradığında oyun takılabilir. Bu yüzden nesne havuzları (Bağlı Listeler sunumundaki serbest liste) ve “sıfır ayırma” alışkanlığı önemlidir. Grafın ne kadar büyük olduğu = toplayıcının ne kadar çalışacağı.

Kaynak: McCarthy 1960 · Unity: Incremental garbage collection

🧰 Kütüphaneler ve araçlar

adplatformne yapar / sınırlarınasıl eklenir
graphlib.TopologicalSorterPython (3.9+)Standart kütüphanede topolojik sıralama ve döngü tespiti (CycleError); paralel işlenebilir düğümleri de verir.standart kütüphane
NetworkXPythontopological_sort, strongly_connected_components, is_directed_acyclic_graph, find_cycle.pip install networkx
QuikGraphC#Yönlü graflar, topolojik sıralama, güçlü bağlı bileşenler.NuGet: QuikGraph
GraphologyJavaScriptYönlü graflar ve DAG algoritmaları (graphology-dag).npm install graphology graphology-dag

🧩 Oyunlarda yönlü graflar

  • Teknoloji ağacı / yetenek ağacı: bir DAG. Açılma sırası topolojik sıradır; tasarımcı yanlışlıkla döngü kurarsa (A, B’yi; B, A’yı gerektiriyor) hiçbiri açılamaz: editörde döngü kontrolü şart.
  • Görev bağımlılıkları, diyalog grafları, durum makineleri (Y2): hepsi yönlü graf.
  • Varlık bağımlılıkları: bir sahne hangi dokulara, onlar hangi dosyalara bağlı? (derleme sistemleri, Make’ten Unity’nin Addressables’ına kadar)
  • Güçlü bağlı bileşenler: diyalog grafında “içinden çıkılamayan” döngüler.
Sık hatalar
  • Döngü kontrolü yapmadan topolojik sıraya güvenmek.
  • Sıralamayı DFS’nin ön sırasıyla yapmak (doğrusu: ters son sıra).
  • Kosaraju’da ters grafı unutmak.
  • Döngüleri sessizce yutmak: tasarımcıya hangi düğümlerin döngüde olduğunu gösterin.

🤖 Bu konuyu bir YZ kod asistanıyla yazarken

Sık yapılan hatalar — kontrol edin
  • Döngü kontrolü olmadan topolojik sıra
  • Ön sırayı topolojik sıra sanmak
  • Ters grafı unutmak
  • Döngüyü sessizce yok saymak
İyi bir istek (prompt) örneği

“Unity 6, C#. Bir teknoloji ağacı doğrulayıcı yaz: TechNode ScriptableObject’leri (id, önkoşullar listesi). Editör menüsünden çalışan araç: (1) özyinelemesiz DFS ile döngü bul ve döngüdeki düğümleri Console’a yaz, (2) döngü yoksa topolojik sırayı ve her düğümün “en erken açılabileceği katmanı” hesapla, (3) hiçbir şeyin gerektirmediği ve hiçbir şeye ulaşmayan yetim düğümleri raporla. NUnit testleri ekle.”

  • Döngü bulunduğunda döngüdeki düğümleri döndürmesini isteyin
  • Topolojik sıranın ters son sıra olduğunu açıklatın
  • Editör aracı olarak (Unity EditorWindow) isteyin
  • Büyük grafta özyinelemesiz DFS isteyin

🚀 Proje ve araştırma önerileri

  1. [kolay] Teknoloji ağacı doğrulayıcı — Döngü bulma + topolojik sıra + katmanlara göre çizim.
  2. [orta] Görev planlayıcı — Görev bağımlılık grafından oyuncuya “şu an yapabileceğin görevler” listesini çıkarın.
  3. [orta] Çöp baskısı ölçümü — Unity’de her kare çöp üreten bir sistemi profilleyin, havuzlama ile düzeltip ölçün.
  4. [araştırma] Tarjan ve Kosaraju — İki SCC algoritmasını aynı büyük graflarda ölçüp karşılaştırın.

📄 Akademik okumalar ve kaynaklar

McCarthy 1960 · Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I (Communications of the ACM 3(4))
Lisp ve işaretle-süpür çöp toplama.
Tarjan 1972 · Depth-First Search and Linear Graph Algorithms (SIAM Journal on Computing 1(2))
DFS ile güçlü bağlı bileşenler.
Kahn 1962 · Topological Sorting of Large Networks (Communications of the ACM 5(11))
Kuyrukla topolojik sıralama.

Neler öğrendik? 🎒

problemalgoritmasüre🎮 oyunda
erişilebilirlikDFSE + Vbölgeye gidilebilir mi, çöp toplayıcı
en kısa yönlü yol (kenar sayısı)BFSE + Vtek yönlü kapılı haritada rota
topolojik sıralamaDFS ters sonsıra / KahnE + Vteknoloji ağacı, yapı sırası
yönlü döngüDFS + on_stackE + Vkilitlenen görev zinciri
güçlü bileşenlerKosaraju–Sharir (2 DFS)E + Vsoft-lock tespiti

Hepsi doğrusal zaman, hepsi DFS’nin küçük değişiklikleri. DFS graf algoritmalarının İsviçre çakısı.

Alıştırmalar 🏋️

  1. Kâğıt-kalem: teknoloji ağacının üç farklı geçerli topolojik sırasını yazın.
  2. Kahn algoritmasında kuyruk yerine öncelik kuyruğu (en ucuz teknoloji önce) kullanın. Hâlâ geçerli bir sıra mı?
  3. Kendi oyununuzdaki bir düşman FSM’sini yönlü graf olarak çizin. “Ölü” durumundan çıkan ok var mı? Hangi durumlar güçlü bileşen oluşturuyor?
  4. Bir diyalog ağacında oyuncunun hiçbir seçimle ulaşamayacağı replikleri (ölü içerik) bulan kod yazın.
  5. Unity Profiler’da bir sahnenin “GC Alloc” sütununa bakın. Her karede bellek ayıran satırları bulun ve nesne havuzuyla düzeltin.
  6. 🤖 Bir YZ asistanından “Python’da topolojik sıralama” isteyin. graphlib.TopologicalSorter’ı (Python 3.9+) biliyor mu?

🎮 Bu sunumdaki oyunlar

Adı geçen oyunu tanımıyorsanız: oyuncuların kullandığı wiki sayfası ve oyunu kısaca gösteren bir video. ▶ video slaydın üstünde açılır (Esc ile kapanır); 🎯 işaretli bağlantılar doğrudan bu sunumdaki konuya gider.

Civilization 1991– · sıra tabanlı strateji
Bir uygarlığı taş devrinden uzay çağına yönetirsiniz; teknoloji ağacı serinin simgesi.

Kaynaklar: videolar 🎬

Kaynaklar: okuma 📚

NEXT LEVEL ▶
Minimum Yayılan Ağaçlar
Kenarların bir maliyeti olunca: Kruskal, Prim ve prosedürel zindan koridorları
SONRAKİ SUNUM ▶