Grafik düğümleri arasında rastgele kenarlar oluşturmak için iyi bir yöntem nedir?


10

4X uzay oyunu için rastgele bir harita üreticisi yapıyorum.

Oyundaki her bir düğüm 2d ızgara üzerinde rastgele bir (x, y) koordinatına yerleştirilir. Bir düğüm, başka bir düğüme (solucan deliklerini temsil eden) bir veya daha fazla çift yönlü kenara sahip olabilir. Tüm düğümlerin en az bir solucan deliği olmalı ve tüm düğümler aynı grafiğe ait olmalıdır.

İdeal olarak, bir solucan deliği maksimum uzunluğu geçmemeli ve mümkünse solucan delikleri birbirini geçmemelidir.

Benim naif uygulama tüm düğümleri yinelemek ve en yakın 3 düğüme düğüm bağlantısı var. Ancak, çok sayıda alt grafikle sonuçlanıyorum. Düğümler için kenarlar oluşturmak için iyi bir yöntem nedir?


düğümler galaksiye nasıl dağılmış? Yani galaksideki her nokta için (X, Y) bir düğüm olduğunu varsayabilir miyim? ya da en azından çoğu için ya da değil?
Ali1S232

Tüm koordinatların bir düğümü olmayacaktır. Yaklaşık% 40 diyebilirim.
Extrakun

Yanıtlar:


9

İşte benzer bir soru için iyi bir cevap.

İlk önce bağlı bir grafik yapın, belki de yukarıdaki bağlantıdaki gibi minimum yayılan ağaç kullanın. "Minimum" ağacı rastgele yapmak için rasgele kenar ağırlıkları kullanmanızı önerir. Sonra rastgele daha fazla kenar ekleyebilirsiniz, böylece sadece minimum ağaç değildir. Rastgele kenarları tam olarak nasıl ekleyeceğiniz, istediğiniz grafik türüne bağlıdır.


Aslında, sorun sadece düğümlerin aynı grafiğe ait olduğundan emin olmaksa, mevcut rastgele nesil yönteminizi (veya başka bir yöntemi) alabilir ve Prim'in algoritmasını üzerine uygulayabilirsiniz. Alt bölümlerin hepsinin bağlı olduğundan emin olmak için grafikte minimum değişiklikler yapmak isterseniz, zaten var olan kenarlar için kenar maliyetini 0 olarak ayarlayabilirsiniz.


+1 çünkü çok iyi bir cevap ama bu tür bir nesli sevmiyorum, bu yüzden önümüzdeki birkaç gün içinde daha iyi bir algoritma düşüneceğim!
Ali1S232

Evet, bunun 'doğru' cevabı yok, başkalarının ne bulduğunu görmek istiyorum.
Philip

Offtopic, ama ben de cevabımla bağlantı kuracaktım! : p
r2d2rigo

Bu şekilde puan kazanıyorum, ha!
Philip

7

Sorununuzun başlıca kısıtlamaları iki yönlüdür: 1 bağlantılı bir grafik oluşturmak; ve proksimal bağlantılarla oluşturma. Philip'in cevabı, biraz değerli olsa da, probleminizin tüm kısıtlamalarını ele almıyor

İdeal olarak, bir solucan deliği maksimum uzunluğu geçmemeli ve mümkünse solucan delikleri birbirini geçmemelidir.

Noktaları bir bulutta saf bir şekilde bağladığınızda, bu koşulların yerine getirilmeme riskini (ve bunun yüksek bir noktasını) çalıştırırsınız.

Gördüğünüz gibi, sorun bu bağlantılardaki yakınlıklardan biri kadar bağlantı değil. Bir grafikteki her düğümü diğer düğümlere bağlamak önemsizdir, ancak genel grafiğin 1 bağlantılılığını korurken yalnızca en yakın olanlara bağlanmak biraz daha zordur.

Delaunay üçgenlemesinin n boyutlarında yarattığı şey budur . Delaunay nirengi kullanmanın ilk nedeni, her ikisini de dolaylı olarak yerine getirmesidir. İkinci neden, böyle bir grafikten (istemediğiniz kenarları ve köşeleri çıkarma) geriye doğru çalışmanın, başka şekillerde oluşturmaya çalışmaktan çok daha kolay olmasıdır.

  1. Tam nokta bulutunuzu rastgele oluşturun.
  2. Delaunay üçgenleyin.
  3. Grafiği oluşturun (noktaların bağlantısı). Burada, ilk olarak tüm grafiği (her yıldız) oluşturabilir ve daha sonra 4. adımı uygularken grafiği solucan deliğine bağlı bölgeleri temsil eden küçükler olarak türetebilirsiniz . Alternatif olarak, yalnızca solucan deliğine bağlı bölgeleri oluşturarak başka bir şekilde de çalışabilirsiniz. önce supergraph düğümleri olarak ve daha sonra ikinci aşamada, bu bölgelerin sınırlayıcı hacimleri içinde (bunlar için Delaunay üçgenleme grafiğini çift - 3 boyutta Voronoi diyagramı) ayrı ayrı yıldızlar oluşturun. Artık proksimal olarak bağlı yıldız kümeleriniz var ve tüm kümeler daha nadir solucan delikleriyle birbirine bağlı: topolojiniz ve topografya oyuncuya mantıklı geliyor.
  4. 3. adımda nasıl ele almayı seçtiğinize bağlı olarak süper ve alt çizimleri şekillendirmek için akıllı yöntemler uygulayın.

Bunun hiyerarşik bir süreç olduğunu görmek önemlidir. Birinci seviye solucan deliği bağlantısıyla ilgilidir; ikincisi, standart bir gemi sürüşü kullanılarak muhtemelen geçilebilen mesafelerle ilgilidir. Kısıtlamalarınızı karşılamak için Delaunay'ı bir veya iki düzeyde uygulayabilirsiniz.

Bunu tamamen topolojik olarak yapmak, anlamsız olan solucan delikleri bırakacaktır, çünkü galaksinin bir tarafını diğerine bağlayabilirler, yüksek yoğunluklu yıldızlara rağmen (ve hatta solucan deliğinin doğrudan rotasına düşerler). Topoloji topografya değildir; ikincisi, öncekinin üzerinde ve üstünde bir düşüncedir. Yakınlık ve dolayısıyla topoğrafya ile ilgileniyorsunuz.


Delaunay üçgenleme iyi bir fikirdir, ancak rastgele kenarlar oluşturmaz. Delaunay üçgenlemesi tarafından oluşturulan kenarlardan rasgele kenarları kaldırabilirsiniz, ancak daha sonra tekrar ayrı grafikler alma riskiniz olacak ...
bummzack

@Bummzack "Rasgele kenarlar oluşturmuyor". Küçükleri hiç duydunuz mu? Delaunay kullanarak daha zor kısıtlamalar çözüldükten sonra, bu grafikte istediğiniz gibi eklemeler veya kaldırmalar yapmak önemsizdir.
Mühendis

@Bummzack, tekrar güncelledim - geri bildiriminiz için teşekkürler.
Mühendis
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.