Izgara üzerinde rastgele yönlendirilmiş grafik oluşturma


11

Ben Pokemon buz sürgülü bulmaca benzer bir bulmaca oyunu yapmak amacıyla rastgele yönlendirilmiş bir grafik oluşturmak için çalışıyorum.
Temelde rastgele oluşturmak istediğim şey bu: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Bir x ve y boyutunda grafik boyutunu sınırlamak gerekir. Bağlantıda verilen örnekte, 8x4 ızgara ile sınırlı olacaktır.
Karşılaştığım sorun, rastgele bir grafik oluşturmak değil, bir düğümün karşı tarafında bir şey (kaya gibi) ihtiyacım olduğu için 2d uzayda düzgün bir şekilde haritalayabileceğim bir grafik oluşturmak. kaymayı bıraktığınızda görsel olarak mantıklı. Buradaki problem, bazen kayanın diğer iki düğüm arasındaki yolda veya muhtemelen başka bir düğümün kendisinde kalması ve tüm grafiğin kırılmasına neden olmasıdır.

Sorunu tanıdığım birkaç insanla tartıştıktan sonra, çözüme yol açabilecek birkaç sonuca vardık.

  • Grafiği oluştururken grafiğin bir parçası olarak ızgaradaki engelleri dahil etmek.
  • Tamamen dolu bir ızgara ile başlayın ve rastgele bir yol çizin ve bu yolu çalıştıracak blokları silin.

Daha sonra ek, daha kısa bir yol eklemekten kaçınmak için hangilerinin silineceğini bulmaya başlar. Dinamik bir programlama algoritmasının faydalı olabileceğini düşünüyoruz, ancak hiçbirimiz hiçbir şeyden dinamik programlama algoritmaları oluşturma konusunda çok yetenekli değiliz. Bu sorunun resmi olarak adlandırıldığı (resmi bir grafik sorunu ise) hakkındaki herhangi bir fikir veya referans en yararlı olacaktır.

Burada, blokları rastgele yerleştirerek ve seçilen başlangıç ​​/ bitişten navigasyon grafiğini oluşturarak şimdiye kadar elde ettiğim bazı örnekler var. Fikir (önceki bağlantıda açıklandığı gibi) yeşil S'den başlayıp yeşil F'ye ulaşmak istiyorsunuz. Bunu yukarı / aşağı / sola / sağa hareket ettirerek yaparsınız ve bir tuşa basıncaya kadar seçilen yönde hareket etmeye devam edersiniz. duvar. Bu resimlerde gri bir duvar, beyaz zemin ve mor çizgi baştan sona minimum uzunluktur ve siyah çizgiler ve gri noktalar olası yolları temsil ediyordu.

Rastgele oluşturulmuş grafiklerden bazı kötü örnekler:

resim açıklamasını buraya girin

Rastgele oluşturulmuş (veya elle ayarlanmış) grafiklere bazı iyi örnekler:

resim açıklamasını buraya girin

Ben de aslında bir bulmaca olarak oynarken daha zor olanları fark gibi görünüyordu asgari yol boyunca çok sayıda yüksek dereceli düğüm olanlardır.


1
Tamamen rastgele bir kaya seti oluşturabilir, ardından karşılık gelen grafiğin bir çözümü olup olmadığını kontrol edebilir ve eğer değilse, atın ve yeniden başlayın. 8x4 ızgara ile bu kadar uzun süremez. Eminim daha temiz çözümler var.
Meslek

Bu benim ilk yaklaşımımdı ama biraz daha büyük ölçekte yapmam gerekiyor ve kaba zorlama biraz zaman almış gibi görünüyordu ve daha iyi bir yaklaşım bulmaya çalışıyordu.
Talon876

Yanıtlar:


2
  • bu buz, bir kayaya çarpmadıkça hareket edeceksin.
  • yön değiştirmenin tek yolu bir kayaya çarpmaktır.
  • Eğer bir kayaya çarptıysanız yön değiştirmelisiniz.
  • açık nedenlerden dolayı döngüler iyidir.
  • birden çok başlangıç ​​ve birden çok uç olabilir.

daha gelişmiş özellikler:

  • bitişik kayaları olmayan hücrelere ulaşılamaz (bazıları geçilebilir)
  • duvarlar da kayalar, eğer onları kaldırırsanız, etrafı sarmaya karar verebilirsiniz.
  • alt ızgaraları desen olarak kullanabilirsiniz ("döşeme" 3x3, 3x4, 5x5, ... vb.)
  • geçilemeyen MxN alanının üstüne bir bulmaca MxN döşemesini bindirebilir ve içeri / dışarı yönlendirmek için bir kaya ekleyebilirsiniz.
  • bir karonun dönmesi veya simetrisi ilginç olabilir
  • buzlu satır / sütun ekleyerek bir döşemeyi genişletebilirsiniz

misal:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

fayans birleştirme örneği:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

Eğer oyun Tsuro gibi olabilir , rastgele bir tahta oluşturmak için fayans kullanır.


0

Belki tersine mühendislik tersine mühendislik size yardımcı olabilir.

Her problem için bir ve tek bir çözüm varsa, muhtemelen benzersiz cevaba dayalı bir grafik oluşturabilirsiniz. Bu, dinamik programlama yapmanızı veya hatta kaba kuvveti atlamanızı ve metodik bir nesli seçmenizi gerektirmez.

Bu konuda şunları yapabilirsiniz:

  1. Bir MxN grafiğini hazır tutma
  2. bir / birden çok çözüm oluşturma
  3. tekil bir çözüm sorunu olup olmadığı hakkında bir soru sormak
  4. soruna birden fazla çözüm varsa, mevcut prosedürü başka bir çözümü engellemeyecek şekilde yukarıdaki prosedürü tekrarlayabilirsiniz.

Gerçi bu soruyu sizin için yaratacak sorun karmaşıklığına ve sorun büyüklüğüne göre bir yol kullanmanız gerekecektir. Sadece kaba kuvvet için gitmeyin. Bunun yerine rastgele bir algoritma deneyin. Bu size yardımcı olabilir.


Geçen yıl bu kitabı geri satarak pişman olacağımı biliyordum, sanırım arkadaşlarımdan birinde kitap var. İçinde aramam gereken belirli bir algoritma var mı? Ya da sadece grafikleri olanların hepsine bakın ve kullanışlı görünen bir tane bulabilir miyim? Oh ve tek bir optimal çözüm var (sanırım bunun için bir kravat olabilir) ve sonsuz diğer çözümler, çünkü iki düğüm arasında ileri geri gidip istediğiniz zaman çözebilirsiniz.
Talon876

0

Başka bir yaklaşıma ne dersiniz? Boş bir labirent ile başlayın ve bunun gibi bloklar ekleyin:

  1. Rastgele başlangıç ​​bloğu ve bitiş bloğu.
  2. 1-3 "kayan" adımları rastgele (ancak geri dönmeyen) yönde ve rastgele uzunlukta (*) yapın. Her adımdan sonra bir blok yerleştirin (slaytı durdurmak için).
  3. Çıkışa en kısa yolu bulun. Çok az segment varsa (düşük seviye zorluk), yolun rastgele bir segmentini alın ve bir blokla bölün. Aksi takdirde, 1. adımdaki gibi bir blok yerleştirin ve çıkın.
  4. 1'i dikkatli bir şekilde tekrarlayın (*): kayan bir adımın uzunluğunu seçtiğinizde, yerleştirdiğiniz bloğun önceki yolu kapatmaması için bunu yapın.

Son dokunuş: sağladığınız algoritma ile en kısa rotayı bulun. Kullanılan tüm hücreleri not edin ve her zaman en kısa yolun kısalmadığından emin olarak geri kalanları rastgele doldurmaya başlayın.

İkinci blokta, kullanılan yolu geçmeyecek şekilde son bloğu koyamayacağınız bir uyarı var, ancak bunun için iki çözüm görüyorum: bitiş bloğunu daha erken hareket ettirin veya birkaç adımı geri alın ve tekrar deneyin.

Ve kayan adımların rastgele uzunluğu için başka bir düşünce - daha önce yerleştirilmiş bir bloğun, yollar üst üste gelmediği sürece yeniden kullanılması için onu seçmek isteyebilirsiniz.


@ Talon876 Bu, bahsettiğim bir tür rastgele algoritma.
c0da
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.