Bir engel üzerinde nasıl yol bulabilirim?


10

Aşağıdaki durumun nasıl temsil edileceği - en iyi ajan ( @) hedefe ulaşmalıdır ( $). Yol bir hendek ( ~~~) tarafından engellendi . Engeli aşmayı mümkün kılacak bir tırmık (veya su yürüyüş botları gibi başka bir cihaz) mevcuttur.

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

Nasıl düzgün dan pathfind için @için $mevcut yolu yok hemen orada sağlanan? Yolumun sadece maliyeti değil ön koşulları da olmalı mı?

UPD : Sorun hedefe ulaşılamıyor ve tırmık haritadaki olası birçok nesneden sadece biri. O zaman soru "ajanın tırmığa ihtiyacı olduğunu nasıl anlamasını sağlamaktır?"


Sanırım kullanım durumunuzu açıklığa kavuşturmalısınız çünkü bu, bu sorunu çözmek için gereken yaklaşımı etkileyecektir. Örneğin, kullanım durumu düşmanların yollarını hesaplamaksa, muhtemelen ilk önce hedefe ulaşılıp ulaşılamayacağını, düşmanların tırmık elde etmediği (yani tırmık hedeftir) ve sonra ilkine giden yolu bulmanız gerekir. tekrar gol.
13'te jhocking

Yanıtlar:


6

Bir yığın hedef düşünüyorum, yol bulmaya açıklama eklenecek :

  • Bir hedefle başlayın get $
  • Su yolu $yürüyüşü özelliği ile - patikaya giden yolu bulmaya çalışın .
  • Itme hedefi get waterwalking.
  • Hedef yığını şimdi get waterwalking, get $
  • Bir şekilde tırmığın su yürüyüşü sağladığını görelim, hadi tekneyle yeniden adlandıralım.
  • Komisyon yolu. Top hedefe ulaşıldı, desteden pop, hedef get $.
  • Güzergah $- şimdi yeteneğimiz var ve hedefe ulaşabiliriz.

1
+1 Oyunumla benzer bir şey yaptım ve bir süre önce Birim Görevleri ve yol bulma altında küçük bir yazı yazdım .
MichaelHouse

@ byte66, tırmık kullanmadan bir yol olduğunda özel durumu ele almaz ancak tırmık kullanmak daha kısa bir yolla sonuçlanır
Ali1S232 16:12

@Gajet haklısın. Sanırım bunun için farklı bir yaklaşım gerekiyor.
zzandy

1
Bu sadece ek maliyet ekleme meselesi. Su ile karşılaştığınızda, su yürüyen eşyayı yola alma maliyetini ekleyin. A *, su yolunu en ucuz yol olana kadar atlayacaktır.
MichaelHouse

3

Tüm yol bulma, sadece bir grafik üzerinde en kısa yol arayışıdır. sorununuzu çözmek için uygulamanız gereken tek değişiklik bazı ekstra kenarlar eklemektir (teknenin alabileceği yolu temsil eder) ve basit bir yol bulma algoritması yapmaktır. BFS, Dijkstra veya A * kullanmanız önemli değildir, sadece bazı ekstra kenarlara sahip normal bir yol bulma algoritması uygulayın. grafikteki wiki sayfasında yol bulma hakkında daha fazla bilgi için


+1 Tırmıklarınızı suya tek yönlü bir bağlantı yapın, sudan toprağa tek yönlü bağlantılar da yapın.
Laurent Couvidou

Geometrik aramayı ve özellik aramayı nasıl birleştireceğiniz konusunda net bir anlayışım yok. Nasıl gitmek için no path from @ to $için goto rake, bring it to water, place it, goto $.
zzandy

@zzandy yol bulurken, her bir karo için mümkünse en yakın karolara gidersiniz. sadece mevcut düğüm bir tırmıksa, listeyi açmak için doğrudan nehrin diğer tarafından bir düğüm ekleyebileceğiniz bir koşul eklemeniz gerekir.
Ali1S232

Peki ya cihazı taşıyabilirseniz? Demek istediğimi düşündüm (ve dolayısıyla cevabım.)
kaoD

Evet, demek istediğim cihazın bakımı yapılabilir (ve olmalıdır). @kaoD, cevabınız, bir ajanın komisyona ihtiyacı olduğu fikrini aldığı adımı içermez.
zzandy

2

Bunu bir tür davranış ağacı çözümü ile yapardım - hedefe giden yol ve A *'nızı engelleyen tüm engelleri not edin. Başarısız olursanız, bu engellerin üstesinden gelmeye yardımcı olabilecek nesneler olup olmadığını, bu durumda, o nesnenin yolunu kontrol edersiniz. Tekrar et. Bu, ajanın, araçları kullanma fikrini almadan önce hedefe ulaşmaya çalışması ve başarısız olması gerektiği anlamına gelir; bu, özellikle de hepsinin kontrol edilmesi gereken devasa bir karo dünyası varsa, zaman alabilir. Aracın sorunu nasıl çözeceğini düşünmek için biraz zaman aldığı çok yersiz görünmeyebilir.

Ancak gerçek, sert bir çözüm hayal edebiliyorum. Yol bulma kılavuzunuza başka bir boyut ekleyin. 2B bir harita olması durumunda, yol bulma ızgarasını 3B yaparsınız. Bu basit örnekte bu yeni boyut sadece iki derinliğe sahip olacaktı, ancak gerçek bir oyunda hızla büyüyecekti.

Z = 0'da araziyi normal koşullar altında eşlersiniz, yani su kiremitleri geçilmez olarak kabul edilir.

Z = 1'de, araziyi tırmıkla olduğu gibi eşlersiniz, yani su kiremitleri yürünebilir olarak kabul edilir (ancak örneğin duvar karolarınız varsa, bunlar sağlam kalabilir).

Yol bulma, x ve y boyutlarında sıradan bir A * 'dır, yani her ızgara hücresinin komşularına erişimi olduğu düşünülür. Ancak z boyutunda, A * 'nın yayılmasına izin VERİLMEZ.

Komisyonun bulunduğu yer hariç. Komisyon nesnesi, yol bulma ızgarasında z = 0 ile z = 1 arasında bir açıklık görevi görür.

Bu, A * 'nın z = 0 cinsinden dolguyu dışarı akıtacağı, suya çarpacağı ve seçeneklerin tükeneceği anlamına gelir - daha sonra tırmık karosu aracılığıyla z = 1'e ve z = 1'de (suyun yürünebileceği yerlerde) yayılacağı anlamına gelir. hedefe giden yolu bul. Sonuç, tereddüt etmeden NPC'nin tırmığa hareket etmesi ve ardından hedefe en kısa yolu taşımasıdır.


Örneğimde tırmıktan daha çok "su yürüyüş botları" gibi davranıyorum, yani eğer varsa su karoları üzerinde seyahat etmenizi sağlayan bir nesne. Tırmığın bir arazi parçası olarak "inşa edilmesi" gerekiyorsa ve suya ulaşmak için yeterli olabilecek veya olmayabilecek sınırlı miktarda fayans kaplıyorsa, sorun daha zordur. Benim çözümüm tek kullanımlık öğelere izin veriyor, z = 1'de hareket yaparsanız otomatik olarak tekrar z = 0'a düşer.
Joar Jakobsson
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.