Yapay zekada DFS, A * aramaları ile ilgili grafik arama ve ağaç arama sürümleri arasındaki fark nedir ?
Yapay zekada DFS, A * aramaları ile ilgili grafik arama ve ağaç arama sürümleri arasındaki fark nedir ?
Yanıtlar:
Mevcut cevaplara bakıldığında, bu kavramla ilgili çok fazla kafa karışıklığı var gibi görünüyor.
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.
Temel grafik arama algoritmanız aşağıdaki gibi görünür. Bir başlangıç düğümü start
, yönlendirilmiş kenarlar successors
ve goal
dö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).
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.
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 next
zaten 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
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.
Bazı uygulama yöntemleri, select
en 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.
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 .
Basit olması açısından, sunulan kod şunları sağlamaz:
state
ya da node
köşeleri için daha uygun olan , altta yatan geçişi grafik aksine, duruma bağlıdır, sorun grafik. Ancak state
problemli grafik köşeleri ve node
geçiş grafiği için kullanmak, cevabın netliğini kesinlikle artırabilir. Yakında yeniden yazmaya çalışacağım. Teşekkür ederim.
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.
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.
GRAPH VS AĞAÇ
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.
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.