SORU
22 HAZİRAN 2010, Salı


Programlama teorisi: bir labirent Çözmek

Bir labirent çözmek için olası yolları nelerdir?
Ive iki fikir var, ama çok zarif değil bence.

Temel durum:Bir matris var ve bu matrisin elemanları labirent gibi gösteren bir şekilde, ve tek çıkış yolu olarak sıralanır.

İlk fikrim labirent kadar labirent aracılığıyla bir robot göndermek için, bir yan vardı. Bu çok yavaş bir çözüm olduğunu düşünüyorum.

Her ardışık kalem 1, gidebilir olup olmadığını kontrol eder işaretli (Yukarı, Aşağı, Aşağı, Sol) ile ikinci bir geçiş bir yol seçer ve yoluna orada devam eder. Bu, ilkinden bile daha yavaştır.

Tabii ben iki botlar her kavşakta bir çok iş parçacıklı olun, ama aynı zamanda değil, en iyi yol bu eğer biraz daha hızlı.

Bir labirentin içinde bir bot göndermek için daha iyi çözümler için ihtiyaç vardır.

EDİT
Birincisi: güzel cevaplar için Teşekkürler!

Sorumun ikinci kısmı:Eğer çok boyutlu bir grafik varsa bu durumda ne yapmalı? Bunun için özel yöntemler ya da Justin L. kullanışlı cevabı vardır?
Bu durum için en iyi yol değil bence.

Üçüncü sorum:
Bu labirent çözücü algoritmaları/hızlı mı? (Tamamen varsayımsal olarak)

CEVAP
22 HAZİRAN 2010, Salı


Bir ağaç gibi labirent düşünebilirsiniz.

     A
    / \
   /   \
  B     C
 / \   / \
D   E F   G
   / \     \
  H   I     J
 / \
L   M
   / \
  **  O

(which could possibly represent)

        START
             --- --- 
        | A   C   G |
     ---             
    | D   B | F | J |
 --- ---     --- --- 
| L   H   E   I |
 ---     --- --- 
    | M   O |
         --- 
    FINISH

(ignoring left-right ordering on the tree)

Her düğüm yollarının bir kavşak noktasıdır. D, I, J, L ve O ölüyor, ve ** hedeftir. Gerçek ağaç elbette, her düğüm olarak sahip olasılığı vardırüççocuklar.

Amacınız artık sadece geçiş için ne düğümler bitirmek bulmak için bulmak. Yaşlı ağaç arama algoritması. herhangi bir

Ağaca bakıp, oldukça kolay sadece " * * ağacın en derin kısmı:." izleyerek doğru çözümü görmek

A B E H M **

Bu yaklaşım olur unutmayınsadece birazdaha fazla "" labirent (Olası, backtracing olmadan olduğunda, yani, yeniden girin zaten geçiş yoluyla bir geçit). döngüler olduğunda karmaşık Güzel bir çözüm için yorumlar kontrol edin.

Şimdi, diyelim ki bahsettiğiniz ilk çözüm, bu ağaç uygulanan bak.

İlk çözüm temelde bir gerçekten o kadar da kötü değil Depth-First Search,. Aslında oldukça iyi bir özyinelemeli arama. Diyor ki, "her Zaman sağdaki ilk yaklaşım. temelde Eğer bir şey varsa, geri ilk yere kadar düz gidin veya sol, ve tekrarlayın.

Bir derinlik ilk arama bu sırada yukarıdaki ağaç arar:

A B D (backtrack) E H L (backtrack) M ** (backtrack) O (backtrack thrice) I
(backtrack thrice) C F (backtrack) G J

* * Bulur bulmaz durdurmak unutmayın.

Aslında derinlik öncelikli arama, kodu kullanma ancaközyinelemeli programlamayaptığı her şeyi çok daha kolay hale getirir. Hatta yinelemeli yöntemler çok çalışmak ve asla açıkça vazgeçmek için nasıl bir program gerekiyor. Uygulamaları için bağlantılı makaleyi okuyun.

Bir ağaç arama başka bir yol derinliği tarafından ağaçların arasından arama Breadth-First çözüm vardır. Bu sırada yukarıda ağacı üzerinden arama.

A (next level) B C (next level) D E F G (next level)
H I J (next level) L M (next level) ** O

Bir labirent doğası gereği, genişliği-ilk kontrol düğümleri çok daha yüksek ortalama bir miktarda olduğunu unutmayın. Genişlik öncelikli kolayca uygulayarak sahip sıranın yolları için arama ve her yineleme haşhaş bir yol dışında bir kuyruk, "patlayan" geçinebilmek için tüm yolları olabilir dönüşme sonra bir adım, ve koyarak bu yeni yollar sonunda sıra. "Seviye" komutları Kodu, ve o anlama yardımcı olmak için orada olduğunu. bir sonraki açık var

Aslında expansive list of ways to search a tree bir bütün var. Sadece en basit, en basit iki yolu bahsetmiştim.

Eğer labirent çok uzun ve derin, ve döngüler ve deliler, ve karmaşık, öneririm A* algoritma olan endüstri standardı pathfinding algoritması birleştiren bir Genişlik öncelikli arama ile algoritmalar...gibi bir "akıllı genişlik öncelikli arama".

Temelde bu gibi çalışır:

  1. Bir sıra bir yolunu (sadece bir adım, doğrudan labirent içine yürüyüş yolu) koyun. Bir yol "ağırlık" mevcut boy farkla ucundan düz çizgi mesafesi matematiksel olarak hesaplanabilir) verildi . a
  2. Sıradaki en düşük ağırlık ile yol açılır.
  3. "Patlat bir adım sonra her yol" yol. (eğer yolunuz Sol Sağ Sol Sağ eğer yani, o zaman R R R R R L L L L L edilir patladı yolları, duvarları geçmesi yasa dışı olanlar hariç)
  4. Eğer bu yollar bir hedefi varsa, o zaman Zafer! Aksi takdirde:
  5. Patladı yolları ağırlıkları hesaplamak, ve hepsini tekrar sıraya koymak (orijinal yol dahil değil)
  6. Ağırlık sırası, en düşük ilk sıralama. Adımdan sonra tekrar #2

Ve buBir*ben daha fazla veya daha az endüstri standardı algoritma pathfinding için çünkü bugünkü özel olarak vurgulanmıştümpathfinding uygulamaları, off-road yolları veya dağlar kaçınırken başka haritanın bir ucundan, taşınma, vb. Bir kullandığı için çok iyi çalışıyormümkün olan en kısa mesafe sezgiselo verir , onun "zeka". * Herhangi bir problem verilir, eğer mümkün olan en kısa bir mesafe sezgisel mevcut (kolay düz bir çizgi -- bizimdir) varsa, uygulayabilirsiniz çünkü çok yönlüdür.

AMA* unutmayın için büyük değer taşımaktadırdeğiltek seçenek.

Aslında, wikipedia category of tree traversal algorithms 97 yalnız listeleri! (hala en iyi this page daha önce bağlı olacak)

Uzunluğu =P (ramble eğilimindedir) özür dilerim

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008