A* pathfinding algoritması nasıl çalışır? Heuristic seçimi neyi etkiler?

Cevap

A*, bir başlangıçtan hedefe en kısa yolu bulan, Dijkstra'nın heuristic ile yönlendirilmiş hâlidir. Her düğüm için:

  • g(n): başlangıçtan bu düğüme gerçek maliyet
  • h(n): bu düğümden hedefe tahmini maliyet (heuristic)
  • f(n) = g(n) + h(n): öncelik değeri

Algoritma her adımda open set'teki en düşük f değerli düğümü seçer.

List<Node> FindPath(Node start, Node goal)
{
    var open = new PriorityQueue<Node, float>();
    var cameFrom = new Dictionary<Node, Node>();
    var g = new Dictionary<Node, float> { [start] = 0 };
    open.Enqueue(start, Heuristic(start, goal));

    while (open.Count > 0)
    {
        Node current = open.Dequeue();
        if (current == goal) return Reconstruct(cameFrom, current);

        foreach (Node n in current.Neighbors)
        {
            if (!n.Walkable) continue;
            float tentative = g[current] + Cost(current, n);
            if (!g.TryGetValue(n, out float old) || tentative < old)
            {
                cameFrom[n] = current;
                g[n] = tentative;
                open.Enqueue(n, tentative + Heuristic(n, goal));
            }
        }
    }
    return null; // yol yok
}

Heuristic seçimi

HeuristicKullanım
Manhattan (dx + dy)4 yönlü grid
Octile / Chebyshev8 yönlü grid
Öklid mesafesiSerbest yönlü hareket, navmesh
  • Heuristic admissible ise (gerçek maliyeti asla abartmıyorsa) A* en kısa yolu garanti eder.
  • h = 0 olursa A* Dijkstra'ya dönüşür: doğru ama yavaş.
  • Heuristic abartılırsa (weighted A*) daha az düğüm gezilir, daha hızlı olur ama yol optimal olmayabilir. Oyunlarda bu takas sık yapılır.

Pratik notlar

  • Oyunlarda çoğunlukla grid yerine NavMesh (Unity'de NavMeshAgent) üzerinde çalışılır.
  • Çok sayıda ajan için yol hesaplamayı birkaç kareye yaymak, sonuçları önbelleğe almak veya flow field kullanmak gerekir.
  • Bulunan yol köşeli olabilir; path smoothing (string pulling) uygulanır.
  1. Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?OrtaOyun ProgramlamaGame Dev
  2. Delta time nedir, neden kullanılır?KolayOyun ProgramlamaGame Dev
  3. Object pooling nedir, neden kullanılır?OrtaOyun ProgramlamaGame Dev
  4. Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?ZorOyun ProgramlamaGame Dev
  5. Çarpışma tespitinde broad phase ve narrow phase nedir?ZorOyun ProgramlamaGame Dev
  6. Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?ZorOyun ProgramlamaGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle