Sınırlı yüksekliği kapsayan ağaçları rastgele nasıl oluşturabilirim?


9

Üzerinde çalıştığım bir proje için, sınırlı yükseklikte rastgele yayılmış ağaçlar üretmeliyim.

Temel olarak aşağıdakileri yapıyorum: 1) Yayılan bir ağaç oluşturun 2) Fizibiliteyi kontrol edin, mümkünse saklayın.

1) Minimum yayılan ağaçtan (Prim veya Kruskal) Başlangıçta var olmayan bir kenar ekliyorum ve bu bir döngü yaratıyor, bu döngüyü tespit ediyorum ve bu döngünün kenarlarından birini kaldırıyorum ve bana yeni bir yayılan ağaç veriyor ve devam ediyorum yeni bir kenar ekleyerek bu yayılan ağacı ...

2) Özel bir tepe noktası olduğunu varsayalım vcenter. Her köşe içinv, yolun uzunluğu v için Vcenter o zamandan daha az olmalı δ, nerede δ verilen bir parametredir.

Bunu yapmanın daha iyi (akıllı) bir yolu var mı?

PS Diğer kısıtlamayı (hatam) belirtmeyi unuttum: köşe noktalarının derecesi de sınırlandırılmalıdır.


Bunu doğru yapıp yapmadığımdan emin değilim. İlk adımda, kenarı rastgele mı kaldırıyorsunuz yoksa ağacın yüksekliği (muhtemelen) azaltılacak mı?
Sacha

Kenarları rastgele ekler ve kaldırırım.
Arman

Bunun yerine ağaçları kapsayan rastgele en kısa yolu örnekleyebilir misiniz ? İşleri basitleştirir
Yaroslav Bulatov

kenarlarda herhangi bir maliyetiniz var mı? yüksekliği olan bir yayılan ağaç mı arıyorsunuz?δve minimum maliyet? @Pboothe'nin yazdığı gibi, BFS kullanabilirsiniz ve hepsi bu kadar. Tek sorun, BFS'nin çok fazla bellek kullanmasıdır. Maliyetleri önemsiyorsanız, öklid minimum yayılan ağaçlar için wikipedia'da algoritmayı deneyebilirsiniz ( en.wikipedia.org/wiki/Euclidean_minimum_spanning_tree ). Çalışma süresi vardırO(nlogn) ile O(n)boşluk.
Marcos Villagra

Yani probleminizin üç sınırlı miktarı vardır: ağacın yüksekliği, her tepe noktasının derecesi ve v_center'dan uzaklığı, doğru mu? Sadece sınırlı derece kısıtlaması problemi NP zorlaştırıyor, ancak sanırım tam bir algoritma değil, hızlı bir şekilde çözüm üretecek bir yöntem arıyorsunuz.
Jagadish

Yanıtlar:


7

Birkaç yıl önce sınırlı derinlikte yayılan ağaçlar üzerinde çalışıyordum, gerçekten ilginçler. Bazı meslektaşlarım harika bir iş çıkaran mesaj geçiş algoritmaları ile geldi, ancak kodlarının hiçbirini bulamıyorum. Burada bir fizik tarzında yazdık: http://iopscience.iop.org/1742-5468/2009/12/P12010/ . Bana, bunun kağıda girmemesine rağmen, derece sınırları ile de çalıştığını söylediler.

Markov Zinciri Monte Carlo diyeceğim önerdiğin yaklaşım genellikle mesaj geçişi yaklaşımının rakibi. Belirli bir grafiğin sınırlı dereceli, sınırlı derinlikli yayılan ağaçlarından rastgele yaklaşık olarak eşit örnekleme yapmak istiyorsanız, "yumuşak" sınırları kullanma yaklaşımınızı değiştirmenizi öneririm. Yani, ağacın bağlı derinliği ihlal etmesine neden olan bir kenar değişimini reddetmek yerine, kabul edin, ancak sınırı ihlal etmeyen bir değişimden daha düşük olasılıkla. Bu olasılığın ne kadar düşük olduğunu kontrol eden bir parametreniz varsa, kısıtlamayı ihlal eden konfigürasyonları neredeyse eşit olarak rastgele olan uygulanabilir bir çözüme ulaşana kadar daha az ve daha az olası hale getirebilirsiniz.

Büyük soru, zinciri ne kadar süre çalıştırmanız gerektiğidir. Derecesi en fazla 2 olan genişleyen bir ağaç Hamilton yolu olduğu için, herhangi bir jenerik bağın grafiğin boyutunda üstel olmasını beklemelisiniz. Ama belki ilgilendiğiniz grafikler bir şekilde özeldir.


2
Daha fazla ayrıntı artı bir film: healthyalgorithms.wordpress.com/2010/12/23/…
Abraham Flaxman

3

Sorununuz bir kümeden yayılan bir ağacı eşit olarak örneklemekse S, nerede S en çok yayılan yükseklik ağaçlarının kümesidir h, bazı girdiler için h, ardından stratejiniz işe yarar (ör. rastgele yayılan bir ağacı örnekleyin ve en fazla yüksekliği olup olmadığını kontrol edin h).

Ancak, tanımladığınız algoritmanın rastgele yayılan bir ağaç oluşturacağından emin değilim. Bunun yerine standart algoritmalara bakmanızı tavsiye ederim. İki algoritma vardır: Wilson algoritması ve Aldous-Broder algoritması. Burada bir göz atabilirsiniz . Daha yeni (yaklaşık) bir algoritma var, ancak oldukça karmaşık.

Ayrıca, bu yayılmış ağacı doğrudan sınırlı yükseklikte üretmenin bir yolu olabilir. Ama bu tür algoritmaları hiç duymadım.


1

Önce geniş aramayı kullanın! Grafikteki her tepe noktasından bir BFS yapın, elde edilen en küçük yükseklikte ağacı seçin. Bir BFS her zaman kökten diğer tepe noktalarına giden yolu en az atlama ile bulur.


Kesinlikle haklısın. BFS ile çalışmaya başladık, ancak köşelerde derece kısıtlaması nedeniyle işe yaramadı. Bu kısıtlamadan bahsetmeyi unuttum (benim hatam): üretilen ağaçtaki köşe noktalarının derecesi de sınırlandırılmalıdır. Cevabınız şu anki soru ile doğru ama sanırım sorumu düzeltmeliyim.
Arman

O zaman probleminiz Derece Kısıtlı Spanning Tree'den indirilerek neredeyse kesinlikle NPC - en.wikipedia.org/wiki/Degree-constrained_spanning_tree
Peter Boothe
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.