Evolving a Terrain Generator

12

Saya baru-baru ini mengajukan pertanyaan ini dan kesimpulannya sepertinya menggunakan pemrograman genetik ( GP ) untuk Pembuatan Konten Game Prosedural belum benar-benar dilakukan. Saya ingin mengubah itu.

Saya cukup yakin GP dapat dikerahkan untuk membantu menemukan generator medan baru. Pertanyaan saya adalah bagaimana hal ini dapat dicapai?

Semua dokter memiliki beberapa bagian dasar yang dapat digeneralisasi untuk semua dokter (pemilihan orang tua, rekombinasi, mutasi, bertahan hidup). Saya bisa mencari tahu sendiri. Masalah muncul di bagian khusus masalah. Ini adalah bagaimana Anda merepresentasikan masalah dalam kode (ini biasanya menggunakan pohon), dan bagaimana Anda mengevaluasi seberapa baik generator (ini bisa menjadi satu atau lebih nilai).

Singkatnya pertanyaan:

  • Bagaimana Anda mewakili generator medan dengan cara yang dapat diurai menjadi pohon?

  • Medan seperti apa yang harus dihasilkan ini? (heightmap, grafik vertex, ...)

    Semakin sedikit ini didasarkan pada hightmap, semakin baik.

  • Apa yang akan digunakan untuk mengevaluasi kesesuaian suatu solusi?

    mis: kita ingin medan yang menarik sehingga kita dapat memiliki salah satu nilai menjadi rata-rata perubahan normals untuk setiap titik pada medan.

Alex Shepard
sumber
1
Saya benar-benar merasa Anda tidak ingin GP untuk ini, tetapi GA. Algoritme untuk membuat kebisingan, misalnya, sangat sulit untuk dihasilkan dengan cepat dan akan lebih sulit untuk membuat fungsi kebugaran daripada menciptakan sistem yang memuaskannya. GA lebih cocok untuk mengutak-atik parameter sistem yang ada.
DampeS8N
GP membuat solusi menarik yang tidak pernah dipikirkan manusia. Itulah yang saya cari. GP sulit digunakan, dan ini mungkin bukan cara terbaik untuk menggunakan ini di industri, tetapi akan menunjukkan beberapa kelayakan besar jika ternyata.
Alex Shepard

Jawaban:

11

Anda mungkin beruntung dengan pendekatan yang mirip dengan gambar genetik Karl Sims .

Dia menggunakan seperangkat operator sederhana dalam bahasa seperti LISP sehingga keluaran operator apa pun dapat digunakan untuk memengaruhi gambar, seperti halnya dalam beberapa bahasa shader (mis. Skalar akan menjadi nilai skala abu-abu, vector3akan RGB, dll.) ).

Meskipun saya kira itu hal implementasi, jadi yang mungkin Anda inginkan adalah kata kuncinya, yang (iirc) berisi semua dasar-dasarnya:

  • fungsi trigonometri ( sin, cos, tan, dll.)
  • posisi ( x, y)
  • operator matematika dasar ( sqrt, pow, abs, inverse)
  • fungsi kebisingan ( fBm, noise2, noise3)
  • fraktal lainnya ( mandelbrot, julia)
  • fungsi interpolasi ( lerp, quad, step, smoothstep)

(Beberapa hal di atas mungkin tidak dalam implementasinya; Saya menemukan pekerjaannya sejak lama dan sebenarnya telah melakukan beberapa upaya pada apa yang Anda gambarkan selama bertahun-tahun - jadi kenangan mungkin bocor :)

Menjaga agar tetap menarik (dan cepat)

Saya memiliki sedikit keberuntungan dengan pendekatan berlapis-lapis yang secara besar-besaran mengurangi jumlah evolusi yang mati.

  1. satu set rentang dihasilkan untuk setiap operator (atau bermutasi dari putaran sebelumnya)
    • ini idealnya menjaga nilai-nilai dalam rentang "waras" untuk setiap fungsi, tetapi dapat berevolusi menjadi rentang yang memiliki hasil yang sangat berguna, yang tampaknya seperti hal yang "tepat" untuk dilakukan
  2. menghasilkan beberapa pohon algoritma
    • untuk masing-masing menghasilkan beberapa peta ketinggian pada posisi acak dan mengevaluasi kebugaran
    • jika kita memiliki banyak kecocokan yang baik maka berevolusi sedikit ke cabang ini, mengganggu rentang dari langkah 1 sedikit di setiap anak
    • jika tidak, kami mungkin memiliki rentang yang buruk, kembali ke langkah 1

Namun...

Sekarang saya telah dengan mudah melewati algoritma kebugaran , saya kebanyakan menggunakan pendekatan Karl Sims tentang "seleksi tidak wajar" di mana Anda melihat generasi saat ini di tengah-tengah sekelompok keturunan (dipopulerkan oleh Kai's Power Tools di masa lalu - inilah sebuah gambar apa yang saya maksud ) ..

Namun Anda mungkin dapat memiliki satu set gambar pelatihan, mungkin beberapa dari citra satelit dan beberapa gambar buatan dengan kualitas tertentu dan kemudian mungkin menggunakan wavelet atau analisis FFT 2D pada mereka vs medan yang Anda uji?

Ini adalah topik yang menarik, tetapi saya ragu apa yang Anda butuhkan jawabannya :)

EDIT: ahh. harus menghapus banyak tautan karena saya pengguna baru: - |

pentaphobe
sumber
Hal ini tampaknya mengarah pada hal yang sama dengan yang saya maksudkan, algoritme tidak dimaksudkan untuk pembuatan konten acak yang konstan tetapi dalam melatih generasi menuju satu set hasil yang terbatas atau terbatas ... dan masih membutuhkan manusia untuk membuat pilihan.
James
Dari apa yang saya bayangkan kebugaran harus didasarkan pada beberapa analisis statistik dari hasil. Faktor-faktor yang dapat saya kemukakan adalah jumlah varians di dalam medan yang dihasilkan rata-rata dibandingkan beberapa medan yang dihasilkan (dimaksimalkan) dan yang menilai standar deviasi (diminimalkan, untuk stabilitas varians). Tapi saya kira kita harus memaksimalkan perubahan rata-rata ketinggian antara dua medan yang dihasilkan juga.
Alex Shepard
1
@ Alex mungkin makalah ini akan menarik juga. Saya membayangkan jika Anda memutar beberapa teknik yang disebutkan di atas kepalanya Anda bisa menggunakannya untuk memandu kebugaran. (Atau bisa jadi itu yang Anda inginkan :)
pentaphobe
@ phobius WOAH !! Keren. Saya perlu menjelajahinya lagi, tetapi terlihat sangat menjanjikan. Sekarang untuk mengubahnya menjadi masalah pencarian ...
Alex Shepard
2

Saya tidak yakin Anda bisa menjawab pertanyaan ini, tetapi saya merasakan penjelasan mengapa mungkin jawaban yang cukup membantu. Jadi, Jawabannya singkatnya:

  • Anda akan ingin memilih generasi terain di mana aspek-aspek tertentu darinya hanya dapat didasarkan dari nilai data. Ini tidak sulit untuk dilakukan tetapi mengharuskan Anda untuk memilih generasi medan. Karena area tempat saya bekerja adalah dalam pembuatan voxel, hal-hal seperti laju sampling, tunneling pass, level ketinggian dll akan menjadi hal-hal yang dapat dimasukkan ke dalam data dan 'dikembangkan'.
  • Jenis berjalan seiring dengan bagian pertama. Tidak masalah bentuk generasi yang Anda jalani selama Anda dapat mengatur properti yang berbeda. Pilihan ini harus lebih berkaitan dengan jenis permainan yang ingin Anda buat.
  • Di sinilah ia rusak. Saya tidak bisa memikirkan cara untuk mengukur ini selain dari Seseorang yang benar-benar melihat dunia dan berkata "Oh, itu bagus". Tapi ini menghapus komputer melakukan iterasi sendiri. Ini juga menyiratkan bahwa Anda akan menggunakan bentuk generasi ini untuk menciptakan satu dunia pada akhirnya, mencari yang 'terbaik' daripada yang acak setiap kali.

Algoritma Genetika biasanya digunakan untuk memecahkan masalah yang diketahui di mana Anda dapat mendefinisikan lingkungan melalui aturan. Kemudian Anda bisa membuat kumpulan data yang mewakili properti berbeda yang memengaruhi cara sesuatu bereaksi terhadap aturan. Komputer kemudian memainkan 'putaran' dengan set data awal, memilih nomor X teratas, mencampurkan nilainya setelah memasangkannya bersama-sama dan melakukan putaran lain .. Contoh umum dari ini adalah 'mengembangbiakan troll yang lebih baik' (melakukan pembiakan untuk temukan serangkaian nilai di mana troll umumnya bekerja dengan sangat baik di lingkungannya (Dapat berburu dan makan, membunuh atau menjauh dari penduduk desa, dapat mengumpulkan harta rampasan dan mengumpulkan semua benda mengkilap yang diinginkannya, dll).

Saya tidak yakin apa yang ingin Anda capai dapat diterapkan di bidang pembuatan medan. Satu-satunya hal yang dapat saya buat adalah evaluasi jenis permainan konten di mana Anda tidak ingin merencanakan dunia tetapi ingin membuat dunia yang AI pathing dapat dihitung dengan baik atau sesuatu seperti itu. Namun dengan ini Anda mencari satu atau set dunia yang paling tidak terbatas.

James
sumber
Ah ... Saya pikir Anda membingungkan algoritma evolusioner dengan program genetik. EA digunakan untuk mengoptimalkan dan menyesuaikan input ke suatu algoritma. Dokter digunakan untuk membangun algoritma itu sendiri dan itulah yang saya cari. Jawaban yang bagus. Sebagai catatan: medan ini tidak harus realistis, cukup menarik.
Alex Shepard
Jika Anda tidak dapat mendefinisikan 'menarik' secara terprogram, maka Anda akan memiliki masalah yang saya coba selesaikan dalam jawabannya.
James
0

Medan seperti apa yang harus dihasilkan ini? (heightmap, grafik vertex, ...)

Jelas grafik vertex (mesh), ini adalah penyimpanan-bijaksana dan dapat dirasterisasi (tesselated) sesuai permintaan.

Bagaimana Anda mewakili generator medan dengan cara yang dapat diurai menjadi pohon?

Automata seluler. Saya dapat memikirkan dua implementasi:

  1. Automata yang diatur aturan, mungkin dengan elemen finite-automata (saat keadaan saat ini, seperti upaya melawan atau waktu idle, diperhitungkan).

    • Setiap node diinisialisasi dengan keadaan acak
    • Setiap node memiliki instance dari solver yang terpasang
    • Setiap pemecah terus menghitung status berikutnya hingga kehabisan aturan atau mencapai kondisi ideal (saya selesai di sini)
    • Semua status berikutnya dihitung terlebih dahulu dan kemudian diterapkan sekaligus sebelum perhitungan berikutnya dimulai, sehingga urutan perhitungan tidak menjadi masalah

Rule-set itu sendiri dapat direpresentasikan sebagai pohon keputusan percabangan atau kumpulan perintah sederhana (tidak yakin apakah itu akan berfungsi)

Hanya satu aturan yang ditetapkan untuk setiap node

  1. Pembangun dunia. Alih-alih menerapkan solver untuk setiap node tunggal Anda dapat membuat hanya beberapa dari mereka dan memungkinkan mereka untuk menavigasi jala.

    • Setiap pembangun memiliki aturannya sendiri
    • Mencegah mereka memasuki node yang ditempati oleh pembangun lain
    • Setiap pembangun dapat direpresentasikan sebagai cabang pohon
    • Selama pembangun evolusi dapat menduplikasi

Namun, saya takut bahwa pendekatan kedua perlu didukung oleh yang pertama: keacakan awal perlu diperhalus dan saya tidak yakin apakah pembangun dapat melakukan trik. Setiap sel hidup memang memiliki mitokondria.

Apa yang akan digunakan untuk mengevaluasi kesesuaian suatu solusi?

Integritas medan yang dihasilkan - seharusnya tidak terlihat seperti mish-mash. Dan keragaman - umumnya kita ingin sebanyak mungkin variasi yang tersedia diwakili (tanah kosong datar dari satu sisi ke sisi yang lain tidak menyenangkan). Mungkin sesuatu yang lebih kompleks seperti bagaimana simpul tetangga saling cocok (tundra di tengah padang pasir, apa?)

Harus mencobanya sendiri dengan generator mesh saya ketika / jika punya waktu luang =)

badunius
sumber