Bir Arazi Jeneratörü Geliştirme


12

Kısa süre önce bu soruyu sordum ve Prosedürel Oyun İçeriği Oluşturma için genetik programlama ( GP ) kullanmanın gerçekten yapılmadığı anlaşılıyor . Bunu değiştirmek istiyorum.

Yeni bir arazi jeneratörü bulmanıza yardımcı olmak için GP'nin dağıtılabileceğinden oldukça eminim. Sormam gereken soru bunun nasıl başarılabileceğidir?

Tüm GP'ler, tüm GP'ler için genelleştirilebilen birkaç temel bölüme sahiptir (ebeveyn seçimi, rekombinasyon, mutasyon, hayatta kalma). Bunları kendi başıma çözebilirim. Sorun, probleme özgü kısımlarda ortaya çıkmaktadır. Koddaki sorunu nasıl temsil ettiğiniz (bu genellikle bir ağaç kullanır) ve bir jeneratörün ne kadar iyi olabileceğini nasıl değerlendirdiğinizdir (bu bir veya daha fazla değer olabilir).

Özetle sorular:

  • Arazi jeneratörünü bir ağaca ayrıştırılabilecek şekilde nasıl temsil edersiniz?

  • Bunun nasıl bir arazi yaratması gerekir? (yükseklik haritası, tepe grafiği, ...)

    Bu ne kadar az bir yüksekliğe dayanırsa o kadar iyidir.

  • Bir çözümün uygunluğunu değerlendirmek için ne kullanılır?

    ör .: ilginç bir arazi istiyoruz, bu yüzden değerlerden biri arazideki her bir tepe noktası için normallerdeki ortalama değişiklik olabilir.


1
Gerçekten bunun için GP istemediğini hissediyorum, ama GA. Örneğin, gürültü yaratma algoritmalarının anında üretilmesi gerçekten zordur ve bir fitness işlevi oluşturmak, onu tatmin eden bir sistem oluşturmaktan daha zordur. GA, mevcut bir sistemin parametrelerini değiştirmek için daha uygundur.
DampeS8N

GP, insanların hiç düşünmediği ilginç çözümler üretir. Aradığım şey bu. GP'nin kullanımı zordur ve bu muhtemelen bunu endüstride kullanmanın en iyi yolu olmayacaktır, ancak ortaya çıkarsa bazı büyük fizibilite gösterecektir.
Alex Shepard

Yanıtlar:


11

Karl Sims'in genetik görüntülerine benzer bir yaklaşımla biraz şansınız olabilir .

LISP benzeri bir dilde basit bir operatör seti kullanır, böylece bazı gölgelendirici dillerinde olduğu gibi görüntüyü etkilemek için herhangi bir operatörün çıktısı kullanılabilir (örn. Bir skaler gri tonlamalı bir değer, bir vector3olabilir RGB, vb.). ).

Sanırım bu uygulama şeyler, bu yüzden muhtemelen istediğiniz (iirc) tüm temelleri içeren onun anahtar kelimeler olduğunu:

  • tetikleme fonksiyonları ( sin, cos, tanvb.)
  • pozisyon ( x, y)
  • temel matematik operatörleri ( sqrt, pow, abs, inverse)
  • gürültü fonksiyonları ( fBm, noise2, noise3)
  • diğer fraktallar ( mandelbrot, julia)
  • enterpolasyon fonksiyonları ( lerp, quad, step, smoothstep)

(Yukarıdakilerin bazıları onun uygulamasında olmayabilir; Uzun zaman önce işini buldum ve yıllar boyunca tanımladığınız şeyde birkaç deneme yaptım - bu yüzden anılar sızıyor olabilir :)

İlginç (ve hızlı) tutma

Ölü evrim miktarını büyük ölçüde azaltan çok katmanlı bir yaklaşımla biraz şansım vardı.

  1. her operatör için bir dizi aralık oluşturulur (veya önceki mermilerden mutasyona uğratılır)
    • bunlar ideal olarak değerleri her bir işlev için "aklı başında" bir aralıkta tutarlar, ancak şaşırtıcı derecede faydalı sonuçlara sahip olan ve yapılacak "doğru" şey gibi görünen aralıklara dönüşebilir
  2. birkaç algoritma ağacı oluştur
    • bunların her biri için rastgele konumlarda birkaç yükseklik haritası oluşturun ve uygunluğu değerlendirin
    • çok iyi eşleşmelerimiz varsa, bu dalda biraz gelişir ve her çocukta 1. adımdaki aralıkları bozar
    • Aksi takdirde, muhtemelen kötü aralığımız var, 1. adıma geri dönün

Ancak...

Şimdi fitness algoritmasını rahatça atladım , çoğunlukla Karl Sims'in "doğal olmayan seçim" yaklaşımını kullandım, burada bir nesil yavruların orta meydanında (Kai'nin Elektrikli El Aletleri tarafından popüler hale getirildi) ne demek istediğimin bir görüntüsü ) ..

Ancak, muhtemelen uydu görüntülerinden ve belirli niteliklere sahip birkaç yapay görüntüden oluşan bir dizi eğitim görüntünüz olabilir ve daha sonra test ettiğiniz araziye karşı dalgacık veya 2D FFT analizi kullanabilir misiniz?

Bu ilginç bir konu, ama cevap için neye ihtiyacınız olduğundan şüphe ediyorum :)

DÜZENLEME: ahh. Ben yeni bir kullanıcı olduğum için bir sürü bağlantı kaldırmak zorunda kaldı: - |


Bu, elde ettiğim aynı şeye yol açıyor gibi görünüyor, algoritmalar sürekli rastgele içerik üretimi için değil, nesli tek veya sınırlı bir sonuç dizisine doğru eğitirken ... ve hala bir insanın seçim yapmasını gerektiriyor.
James

Neyi anlayabileceğimden, sonuçların bazı istatistiksel analizlerine dayanmak zorunda kalacağım. Ortaya koyabileceğim faktörler, bir dizi üretilen arazide ortalanmış (maksimize edilmiş) tek bir üretilen arazinin içindeki varyans miktarıdır ve bu standart sapmaya (varyansın stabilitesi için minimize edilmiştir) değer verir. Ama sonra sanırım üretilen her iki arazi arasındaki yükseklikteki ortalama değişimi en üst düzeye çıkarmak zorundayız.
Alex Shepard

1
@Alex belki de bu yazı da ilgi çekecek. Bahsedilen tekniğin bir kısmını kafasına çevirirseniz, fitness'a rehberlik etmek için kullanabilirsiniz. (Ya da sadece istediğiniz gibi olabilir :)
pentaphobe

@phobius WOAH !! Güzel. Biraz daha keşfetmem gerekiyor, ama gerçekten umut verici görünüyor. Şimdi onu bir arama problemine dönüştürmek için ...
Alex Shepard

2

Bu soruyu cevaplayabileceğinizden emin değilim ama neden yeterince faydalı bir cevap olabileceğine dair bir açıklama hissediyorum. Yani, kısaca cevaplar:

  • Belirli yönlerinin sadece veri değerlerine dayandırılabileceği bir arazi nesli seçmek isteyeceksiniz. Bunu yapmak zor değil ama bir arazi kuşağı seçmenizi gerektiriyor. Çalıştığım alan voksel üretimi içinde olduğundan, örnekleme oranları, tünel geçişleri, yükseklik seviyeleri vb.
  • İlk bölümle el ele gider. Farklı özelliklerini ayarlayabildiğiniz sürece hangi nesil ile devam ettiğiniz gerçekten önemli değil. Bu seçim yapmak istediğiniz oyun türü ile daha fazla ilgili olmalıdır.
  • Burası yıkılıyor. Bunu gerçekten dünyaya bakan ve "Ah bu güzel" diyen bir kişi dışında ölçmenin bir yolunu düşünemiyorum. Ancak bu, bilgisayarı kendi öz yinelemesini yaparak kaldırır. Bu aynı zamanda, bu nesil neslini, sonunda tek bir dünya yaratmak için kullanacağınızı ve her seferinde rastgele bir tanesinin aksine 'en iyi' olanı arayacağınızı gösterir.

Genetik Algoritmalar genellikle çevreyi kurallar aracılığıyla tanımlayabileceğiniz bilinen bir sorunu çözmek için kullanılır. Ardından, işlerin kurallara nasıl tepki vereceğini etkileyen farklı özellikleri temsil eden veri kümeleri oluşturabilirsiniz. Bilgisayar daha sonra ilk veri seti ile bir 'tur' oynar, en iyi X numarasını seçer, bir araya getirdikten sonra değerlerini karıştırır ve başka bir tur yapar. Bunun yaygın bir örneği 'daha iyi bir trol yetiştirmek' ( Trolün çevresinde genellikle çok iyi işlediği bir değer kümesi bulun (Avlamak ve yemek yemek, öldürmek veya köylülerden uzak durmak, yağma toplayabilir ve istediği tüm parlak nesneleri toplayabilir vb.).

Neyi başarmaya çalıştığınızın arazi üretimi alanında uygulanabilir olduğundan emin değilim. Ortaya çıkabileceğim tek şey, bir dünya planlamak istemediğiniz, ancak AI yolunun güzel bir şekilde ya da bunun gibi bir şekilde hesaplanabileceği bir oyun yapmak istediğiniz oyun içeriği çeşit değerlendirmeleri olacaktır. Bununla birlikte bile, tek veya en azından sınırlı bir dünya seti arıyorsunuz.


Ah ... Bence evrimsel algoritmaları genetik programlarla karıştırıyorsunuz. EA'lar, bir algoritmaya girişleri optimize etmek ve ayarlamak için kullanılır. GP'ler algoritmanın kendisini oluşturmak için kullanılır ve aradığım şey budur. Yine de iyi bir cevap. Not olarak: bu araziler gerçekçi olmak zorunda değil, sadece ilginç.
Alex Shepard

'İlginç' i programlı bir şekilde tanımlayamazsanız, o zaman cevapta almaya çalıştığım soruna sahip olacaksınız.
James

0

Bunun nasıl bir arazi yaratması gerekir? (yükseklik haritası, tepe grafiği, ...)

Kesinlikle bir tepe grafiği (ağ), depolama açısından kompakttır ve talep üzerine rasterleştirilebilir (tesselated).

Arazi jeneratörünü bir ağaca ayrıştırılabilecek şekilde nasıl temsil edersiniz?

Hücresel otomata. İki uygulamayı düşünebilirim:

  1. Kurallı otomata, belki sonlu otomata unsurları ile birlikte (mevcut durum, sayaç veya boşta kalma süresi gibi, dikkate alındığında).

    • Her düğüm rastgele bir durumla başlatılır
    • Her düğümün bağlı bir çözücü örneği var
    • Her çözücü, kurallar bitene veya ideal durumuna ulaşana kadar bir sonraki durumu hesaplamaya devam eder (burada işim bitti)
    • İlk olarak sonraki tüm durumlar hesaplanır ve sonraki hesaplamalar başlamadan önce bir kerede uygulanır, bu nedenle hesaplama sırası önemli olmaz

Kural kümesinin kendisi dallanan bir karar ağacı veya basit komut kümesi olarak gösterilebilir (çalışıp çalışmayacağından emin değilim)

Her düğüm için belirlenmiş tek bir kural

  1. Dünya inşaatçılar. Her bir düğüm için bir çözücü uygulamak yerine, sadece bir grup oluşturabilir ve ağda gezinmelerine izin verebilirsiniz.

    • Her inşaatçının kendi kural seti vardır
    • Başka bir kurucu tarafından işgal edilen düğüme girmelerini önleyin
    • Her kurucu ağacın bir dalı olarak temsil edilebilir
    • Evrim sırasında inşaatçılar çoğaltabilir

Yine de, korkuyorum ki ikinci yaklaşım birincisi tarafından desteklenmeli: başlangıçtaki rastgeleliğin düzeltilmesi gerekiyor ve inşaatçıların hile yapıp yapamayacağından emin değilim. Sonuçta her canlı hücrede mitokondri bulunur.

Bir çözümün uygunluğunu değerlendirmek için ne kullanılır?

Ortaya çıkan arazinin bütünlüğü - bu bir mish-mash gibi görünmemelidir. Ve çeşitlilik - genellikle mümkün olan en fazla varyasyonun temsil edilmesini istiyoruz (bir kenardan diğerine düz araziler eğlenceli değildir). Belki komşu düğümlerin birbirine nasıl uyduğu gibi daha karmaşık bir şey (çölün ortasında tundra, ne?)

Bazı boş zamanları olduğunda /) örgü jeneratörüm ile kendim için denemeliyim =)

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.