Grafik arama ile ağaç arama arasındaki fark nedir?


Yanıtlar:


187

Mevcut cevaplara bakıldığında, bu kavramla ilgili çok fazla kafa karışıklığı var gibi görünüyor.

Sorun Her Zaman Bir Grafiktir

Ağaç arama ile grafik arama arasındaki ayrım, problem grafiğinin bir ağaç mı yoksa genel bir grafik mi olduğu gerçeğine dayanmaz. Her zaman genel bir grafikle uğraştığınız varsayılır. Ayrım , grafik veya ağaç şeklinde olabilen grafikte arama yapmak için kullanılan geçiş modelinde yatmaktadır .

Ağaç şeklindeki bir problemle uğraşıyorsanız , her iki algoritma değişkeni de eşdeğer sonuçlara yol açar. Böylece daha basit ağaç arama varyantını seçebilirsiniz.

Grafik ve Ağaç Arama Arasındaki Fark

Temel grafik arama algoritmanız aşağıdaki gibi görünür. Bir başlangıç ​​düğümü start, yönlendirilmiş kenarlar successorsve goaldöngü koşulunda kullanılan bir özellik ile. openşu anda değerlendirilmekte olan düğümleri bellekte tutar, açık liste . Aşağıdaki sözde kodun her açıdan doğru olmadığını unutmayın (2).

Ağaç Arama

open <- []
next <- start

while next is not goal {
    add all successors of next to open
    next <- select one node from open
    remove next from open
}

return next

Nasıl uyguladığınıza bağlı olarak select from open, derinlemesine arama (DFS) (en yeni öğeyi seç), genişlikte ilk arama (BFS) (en eski öğeyi seç) veya tek tip maliyet araması (en düşük yol maliyetine sahip öğe seç) gibi farklı arama algoritmaları varyantları elde edersiniz. ), en düşük maliyet artı sezgisel değere sahip düğümü seçerek popüler A-yıldız araması vb.

Yukarıda belirtilen algoritmaya aslında ağaç araması denir . Başlangıç ​​durumunda köklenen birden fazla yönlendirilmiş yol varsa, temeldeki problem grafiğinin bir durumunu birden çok kez ziyaret edecektir. Yönlendirilmiş bir döngüde bulunuyorsa, bir eyaleti sonsuz sayıda ziyaret etmek bile mümkündür. Ancak her ziyaret , arama algoritmamız tarafından oluşturulan ağaçta farklı bir düğüme karşılık gelir . Bu görünürdeki verimsizlik, daha sonra açıklanacağı üzere bazen istenir.

Grafik Arama

Gördüğümüz gibi, ağaç araması bir durumu birden çok kez ziyaret edebilir. Ve bu nedenle, bu durumdan sonra birkaç kez bulunan "alt ağacı" keşfedecek ve bu pahalı olabilir. Grafik arama, ziyaret edilen tüm durumları kapalı bir listede tutarak bunu düzeltir . Yeni bulunan bir halef nextzaten biliniyorsa, açık listeye eklenmez:

open <- []
closed <- []
next <- start

while next is not goal {
    add next to closed
    add all successors of next to open, which are not in closed 
    remove next from open
    next <- select from open
}

return next

Karşılaştırma

Ziyaret edilen tüm durumların kaydını tuttuğu için grafik aramanın daha fazla bellek gerektirdiğini fark ettik. Bu, daha küçük açık liste ile telafi edilebilir ve bu da gelişmiş arama verimliliğiyle sonuçlanır.

Optimal çözümler

Bazı uygulama yöntemleri, selecten uygun çözümleri geri getirmeyi garanti edebilir - yani en kısa yol veya minimum maliyetli bir yol (maliyetlerin kenarlara iliştirildiği grafikler için). Bu, temel olarak, düğümler artan maliyet sırasına göre genişletildiğinde veya maliyet sıfır olmayan pozitif bir sabit olduğunda geçerlidir. Bu tür seçimi uygulayan yaygın bir algoritma, tek tip maliyet araması veya adım maliyetleri aynıysa, BFS veya IDDFS'dir . IDDFS, BFS'nin agresif bellek tüketimini önler ve genellikle adım boyutu sabit olduğunda bilgisiz arama (diğer bir deyişle kaba kuvvet) için önerilir.

A *

Ayrıca (çok popüler) A * ağaç arama algoritması, kabul edilebilir bir buluşsal yöntemle kullanıldığında en uygun çözümü sunar . Bununla birlikte, A * grafik arama algoritması, yalnızca tutarlı (veya "monoton") bir buluşsal yöntemle (kabul edilebilirlikten daha güçlü bir koşul ) kullanıldığında bu garantiyi sağlar .

(2) Sözde kodun kusurları

Basit olması açısından, sunulan kod şunları sağlamaz:

  • başarısız aramaların üstesinden gelin, yani yalnızca bir çözüm bulunabildiğinde çalışır

1
Doğru cevap güzel! Ağaç şeklindeki problemle ne demek istediğinizi biraz daha açabilir misiniz ? Ayrıca, tam geçiş yerine hedefe ulaşmak için algoritmanın kat ettiği yolu kaydetmeyi nasıl önerirsiniz?
Brian

1
@Brian ağacı şeklindeki problem, aradığınız grafiğin bir ağaç olduğu anlamına gelir. Ve ikinci sorunuz için: bu, soruna bağlıdır. Bir olasılık, mümkünse, her genişletilmiş düğümle birlikte bir düğüme giden yolu basitçe depolamaktır.
ziggystar

6
'Tek bir durumun' bir ağaç aramasıyla birden çok kez ziyaret edilebileceğini ve bir düğüm DEĞİLDİĞİNİ söylemek daha resmidir. Arama ağacındaki her düğüm, durum uzayı grafiği boyunca tek bir yola karşılık geldiğinden ve ağaç aramaları tarafından en fazla bir kez ziyaret edilir. (Her ne kadar bu, artan derinlik sınırlarıyla ağacı kateden Yinelemeli Derinleştirme Araması için doğru olmasa da, bu durumda da her yinelemede her düğüm yalnızca bir kez ziyaret edilir)
Nader Ghanbari

1
@NaderhadjiGhanbari olsun stateya da nodeköşeleri için daha uygun olan , altta yatan geçişi grafik aksine, duruma bağlıdır, sorun grafik. Ancak stateproblemli grafik köşeleri ve nodegeçiş grafiği için kullanmak, cevabın netliğini kesinlikle artırabilir. Yakında yeniden yazmaya çalışacağım. Teşekkür ederim.
ziggystar

TL; DR: grafik araması kapalı bir veri yapısı kullanırken ağaç araması kullanmaz.
shinzou

8

Ağaç, grafiğin özel bir halidir, bu nedenle genel grafikler için işe yarayan şey ağaçlar için de işe yarar. Ağaç, her düğüm çifti arasında kesin olarak bir yol bulunan bir grafiktir. Bu, önceki bir yanıtın belirttiği gibi herhangi bir döngü içermediğini, ancak döngüleri olmayan yönlendirilmiş bir grafiğin (bir DAG, yönlendirilmiş döngüsel olmayan grafik) mutlaka bir ağaç olmadığı anlamına gelir.

Bununla birlikte, grafiğinizin bazı kısıtlamaları olduğunu biliyorsanız, örneğin bir ağaç veya bir DAG olduğunu biliyorsanız, genellikle kısıtlanmamış bir grafikten daha verimli bir arama algoritması bulabilirsiniz. Örneğin, bir ağaç üzerinde A * 'yı veya onun sezgisel olmayan karşılığı olan "Dijkstra algoritmasını" kullanmak muhtemelen pek mantıklı değildir (zaten seçebileceğiniz tek bir yol vardır, DFS veya BFS ile bulabileceğiniz) veya DAG üzerinde (burada, topolojik sıralama ile elde edilen sıradaki köşeler dikkate alınarak optimal bir yol bulunabilir).

Yönlendirilmeyen vs yönlendirilmiş için olduğu gibi, bir yönsüz grafik yönlendirilmiş bir, bir kenar (bağlantı, geçiş) olup olmadığını kuralı”aşağıdaki yani durum özel bir durumu olan u için v bir kenar da vardır v için u .

Güncelleme : Eğer ilgilendiğiniz şey, grafiğin yapısından ziyade aramanın geçiş modeliyse , cevabın bu olmadığını unutmayın. Örneğin @ ziggystar'ın cevabına bakınız.


Hm, sorunun bağlamı benim için tam olarak net değil, ancak cevabınızı gördükten sonra tekrar baktığımda, @ ziggystar, A * ve AI'dan bahsetmenin haklı olabileceğinizi gösterdiği hissine kapılıyorum ve cevabım konu dışı. "Ağaç aramayı" "ağaç aramak" olarak yorumladım. Cevabınızın ima ettiği "ağaç şeklindeki bir geçiş deseni kullanarak genel bir grafikte arama" değil.
njlarsson

@njlarsson Cevabıma yeniden ifadenizi ekledim. Açıklığa kavuşturmak için iyidir.
ziggystar

Cevaba bunun bir notu eklendi. Rayhanur Rahman'ın peşinde olduğu bağlam dışında olsa bile, Google vb. Aracılığıyla burada yolunu bulan birçok kişi için cevabımın doğru olduğundan şüpheleniyorum.
njlarsson

Arama algoritmalarını incelemekte güçlük çeken birçok öğrenci gördüm ve cevabınız onları yanlış yönlendiriyor.
Nader Ghanbari

1
Cevap, aynı zamanda arama algoritmaları ile ilgili, ancak posterin sorduğu şeyin bu olmadığı doğru. Yanıttaki "Güncellemeye" bakın - Mart 2014'te soruyu yanlış anladığımı fark ettim. Cevabı silmememin nedeni, arama yoluyla buraya gelen biri için hala yararlı olabileceğidir.
njlarsson

3

Bir grafik ile ağaç arasındaki tek fark döngüdür . Bir grafik döngüleri içerebilir, bir ağaç olamaz. Bu nedenle, bir ağaç üzerinde bir arama algoritması uygulayacağınız zaman, döngülerin varlığını göz önünde bulundurmanız gerekmez, ancak rastgele bir grafikle çalışırken, bunları dikkate almanız gerekir. Döngüleri işlemezseniz, algoritma sonunda sonsuz bir döngüye veya sonsuz bir özyinelemeye düşebilir.

Düşünmeniz gereken başka bir nokta, uğraştığınız grafiğin yönsel özellikleridir. Çoğu durumda, her uçta ebeveyn-çocuk ilişkilerini temsil eden ağaçlarla ilgileniriz. DAG (yönlendirilmiş döngüsel olmayan grafik) de benzer özellikler gösterir. Ancak çift yönlü grafikler farklıdır. Çift yönlü grafiklerdeki her kenar, iki komşuyu temsil eder. Dolayısıyla, algoritmik yaklaşımlar bu iki tür grafik için biraz farklı olmalıdır.


3
Buna eklemek için, gerçekten bir ağacınız varsa, A * 'da yinelenen algılama yapmanıza gerek yoktur. Yine de son yolu çıkarmak için bir yola ihtiyacınız olacak, bu yüzden hala kapalı bir listeniz olabilir.
Nathan S.

Normal terimlerle, bir ağaç, herhangi iki köşe arasında en fazla bir yol bulunan yönlendirilmiş bir grafiktir. Yani, grafikler ve ağaçlar arasında iki fark vardır : Yönlü ve yol benzersizliği. DAG üzerinde çalışan bir algoritmanın döngüleri kontrol etmesine gerek yoktur ve bir ağaç üzerinde çalışan bir algoritmanın kopyaları kontrol etmesine gerek yoktur.
thiton

1
Terminoloji değişir, ancak ağaçlar her zaman yönlendirilmek için alınmaz. Bir İçin köklü bir düğüm kök olmak belirtildiğinde ağacın, yani orada bir zımni yönü olmakla ağaçlar köklü olması gerekmez. Ayrıca, genel grafikler yönlendirilmiş veya yönlendirilmemiş olabilir. Ayrıca, iki köşe arasında en fazla bir yol talep ediyorsanız , ormanları da dahil etmiş olursunuz . Bir ağaç normalde bağlantılı bir grafik olarak tanımlanır, yani tam olarak tek bir yol olmalıdır .
njlarsson

Bu cevap, grafik teorisindeki ağaçlar ve grafikler arasındaki farkta daha çok ortaya çıkıyor, ancak farklı arama algoritmaları türlerinde değil.
mlibby

1

GRAPH VS AĞAÇ

  • Grafiklerin döngüleri vardır
  • Ağaçların döngüleri yoktur "Örneğin kafanızda herhangi bir ağaç hayal edin, dalların kökle doğrudan bağlantıları olmadığını, ancak dalların diğer dallarla yukarı doğru bağlantıları olduğunu düşünün"

Ancak AI Grafik arama ve Ağaç arama durumunda

Grafik arama, algoritma yeni bir düğümü keşfettiğinde ve onu ziyaret edildi olarak işaretlediğinde iyi bir özelliğe sahiptir, "Kullanılan algoritmadan bağımsız olarak", algoritma genellikle mevcut düğümden erişilebilen diğer tüm düğümleri araştırır.

Örneğin, AB ve C olmak üzere 3 köşeli aşağıdaki grafiği ve aşağıdaki kenarları düşünün

AB, BC ve CA, C'den A'ya bir döngü var,

Ve A'dan başlayarak DFS yaptığında, A yeni bir B durumu oluşturacak, B yeni bir C durumu oluşturacak, ancak C keşfedildiğinde algoritma yeni bir A durumu oluşturmaya çalışacak, ancak A zaten ziyaret edildi ve bu nedenle göz ardı edilecektir. Güzel!

Peki ya ağaçlar? ağaç algoritması ziyaret edilen düğümü ziyaret edilmiş olarak işaretlemez, ancak ağaçların döngüleri yoktur, sonsuz döngülere nasıl girebilir?

Bu Ağacı 3 köşeli olarak düşünün ve aşağıdaki kenarları göz önünde bulundurun

A - B - C kökleri A'da aşağı doğru. DFS algoritması kullandığımızı varsayalım

A yeni bir B durumu oluşturacak, B iki durum A ve C oluşturacaktır, çünkü Ağaçlarda "keşfedilmişse ziyaret edilen bir düğümü işaretleme" yoktur, bu nedenle DFS algoritması A'yı yeniden keşfedecek ve böylece yeni bir B durumu oluşturacaktır. sonsuz bir döngüye giriyoruz.

Ama bir şey fark ettiniz mi, yönsüz kenarlar üzerinde çalışıyoruz, yani AB ve BA arasında bir bağlantı var. elbette bu bir döngü değildir, çünkü döngü köşelerin> = 3 olması gerektiğini ve ilk ve son düğümler hariç tüm köşelerin farklı olduğunu ima eder.

ST A-> B-> A-> B-> A Döngü özelliğini ihlal ettiği için bir döngü değildir> = 3. Ama aslında A-> B-> C-> A bir döngüdür> = 3 farklı düğüm Kontrol edildi, ilk ve son düğüm aynıdır Kontrol edildi.

Yine ağaç kenarlarını düşünün, A-> B-> C-> B-> A, elbette bu bir döngü değil, çünkü iki Bs var, bu da tüm düğümlerin farklı olmadığı anlamına geliyor.

Son olarak, aynı düğümü iki kez keşfetmeyi önlemek için bir ağaç arama algoritması uygulayabilirsiniz. Ama bunun sonuçları var.


Bu cevap kafa karıştırıcıdır, çünkü sorunun bir ağaç veya grafik olduğu durumla arama algoritmasının arama sırasında bir ağaç veya grafik kullanıp kullanmadığıyla karıştırdığı görülmektedir.
mlibby

1

Basit bir deyişle, ağaç döngüleri ve grafiğin yapabileceği yerleri içermez. Bu yüzden arama yaptığımızda, sonsuz döngülere girmemek için grafiklerdeki döngülerden kaçınmalıyız.

Diğer bir özellik ise, ağacın tipik olarak bir tür topolojik sıralama veya ikili arama ağacı gibi bir özelliğe sahip olmasıdır, bu da aramayı grafiklere kıyasla çok hızlı ve kolay hale getirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.