Halo, Habr!
Pada 2012, saya menulis posting tentang hobi saya -
Cosmos: memodelkan evolusi organisme multiselulerHampir 7 tahun telah berlalu sejak itu, di mana saya bekerja pada pengembangan proyek ini. Hari ini saya ingin menceritakan sedikit tentang apa yang saya pelajari untuk dilakukan, dan bagaimana saya berencana untuk mengembangkan proyek lebih lanjut.
Motivasi "Evolusi Besar"
Cosmos 2012 adalah contoh yang bagus dari perasaan "efek pencelupan" dari menonton, yang merupakan titik awal dalam pengembangan ide untuk membuat "simulasi kehidupan pada GPU".
Namun, evolusi ini tidak terjadi di sana: prosesnya harus berkembang terus menerus, dan tidak sampai pada tahap akhir beberapa menit setelah peluncuran.
Ternyata hal yang paling sulit adalah mencapai evolusi spesies yang terpanjang yang mungkin "tidak menyatu dengan batas perkembangan", menghasilkan berbagai bentuk nyata. Maka akan mungkin untuk mengeksplorasi formulir-formulir ini, dan kemudian akan ada minat nyata dalam menjalankan simulasi selama berhari-hari, berminggu-minggu, berbulan-bulan - menunggu munculnya bentuk-bentuk yang semakin kompleks dan dikembangkan untuk dipelajari.
Fisika
Anda dapat memikirkan fisika apa pun: menggunakan GPU, Anda dapat membangun berbagai model dengan jumlah elemen yang cukup untuk proses evolusi secara real time. Setiap kombinasi dari prinsip-prinsip interaksi "elemen", "atom", "sel" tertentu - memunculkan konstruktor yang berevolusi bentuk-bentuk di mana beberapa simulasi yang terorganisir secara kompleks dapat secara mandiri merakit diri dari ketiadaan.
Pada awalnya, saya ingin membuat materi multiseluler yang memungkinkan kosmos untuk saling bersentuhan secara langsung, "tanpa terbang", memiliki struktur bola yang saling terhubung dalam mosaik, dengan cara jaringan seluler organisme nyata.
Penting bagi organisme untuk menjadi lebih seperti yang asli, dan makna fisik muncul dalam struktur tubuh yang berbeda. Anda dapat "menggambar" tubuh dengan kulit, anggota badan, otot, kaki, organ internal dengan sel-sel tersebut - dan tubuh seperti itu akan benar-benar ada dan berkembang di dalam simulasi.
Salah satu contoh CUDA SDK adalah realisasi tumbukan partikel bundar berdasarkan kisi spasial, yang memungkinkan partikel untuk berinteraksi hanya dengan yang terdekat.
Saya menemukan cara kerja contoh 3D - dan menulis simulasi saya untuk 2D.
Pada GTX 580 saat itu, ini memungkinkan untuk menghitung 256 ribu partikel secara real time.
CUDA + JavaScript
Masalah lain adalah nyaman bagi saya untuk membuat konsep kosmik dalam JavaScript, sementara simulasi skala besar menjadi mungkin hanya pada GPU.
Sekitar 100 kali lebih nyaman dan lebih cepat di JS.
Dan sekitar 1000 kali lebih cepat pada GPU.
Solusinya adalah menulis fisika interaksi partikel pada CUDA, dan memberikan kesempatan untuk membuat partikel dan mengontrol parameter mereka dari JavaScript, mengintegrasikan mesin Google V8 yang muncul kemudian dalam simulasi sebagai bahasa scripting.
Saya menambahkan kemampuan untuk menghubungkan partikel dengan "karet gelang" yang sama ketika mereka terhubung di ruang pertama. Akibatnya, seseorang dapat menulis kode dalam skrip kontrol JS:
var ball1 = new Ball(); var ball2 = new Ball(); ball1.xy = [0,0]; ball1.rgb = [1,1,1]; ball2.xy = [1,0]; ball2.rgb = [1,1,1]; var link = new Link(ball1, ball2);
dan dua bola putih muncul di layar, terhubung satu sama lain oleh "pita elastis".
Sudah pada tingkat pengembangan mesin ini, peluang menarik muncul untuk percobaan dengan fisika virtual:
Membangun
Dengan menambahkan beberapa properti pada bola, seperti kekuatan ikatan, massa, ukuran, elastisitas - Saya mendapatkan konstruktor yang dikendalikan JavaScript di mana saya dapat menggambar struktur ribuan makhluk yang terdiri dari sel-sel dari sifat fisik yang berbeda - dan semua ini dihitung oleh GPU secara real time.
Sebagai keseimbangan antara harga dan kualitas, bentuk gurita yang ramping dan halus dipilih.
Setiap elemen tubuh (tengah, anggota badan) direalisasikan dengan bantuan jumlah bola minimum yang diperlukan, sementara volume dan massa didistribusikan secara alami - di mana anggota tubuh menebal ke arah pusat - masalahnya menjadi lebih tahan lama dan masif:
Motilitas
Langkah selanjutnya adalah menciptakan motilitas tubuh kosmik. Otot mudah dibuat - itu cukup untuk mengencangkan ikatan antara bola di sepanjang cakar, dan ini menyebabkan efek kontraksi otot.
Neuron akting terhubung ke otot-otot ini, dan jika ada sinyal, otot berkontraksi. Dua otot per tungkai - gurita dua dimensi yang sepenuhnya dapat dikontrol.
Dengan bantuan jaringan saraf berulang kecil bermutasi acak (dari urutan 10-100 neuron) dan pilihan sederhana dari individu terbaik sesuai dengan kriteria, misalnya, "yang bisa bergerak lebih jauh", Anda dapat memanggil kinematika gerakan yang diperlukan untuk setiap bentuk tubuh individu:
Kejadian
Bentuk tubuh lain yang dieksplorasi secara aktif adalah "hexoids". Tubuh makhluk-makhluk tersebut terdiri dari sel-sel yang membentuk bentuk-bentuk acak dari bola-bola dengan ukuran yang sama berdasarkan kisi yang tidak ketat yang dekat dengan heksagonal.
Bentuk ini sangat cocok untuk mempelajari evolusi simultan bentuk tubuh dan motilitas "bersamaan", sambil memaksimalkan potensi percobaan dengan sel-sel dari berbagai jenis, berbeda dalam kekuatan dan fungsinya. Misalnya, benda kosmik dapat terdiri dari kombinasi sel padat yang membentuk kerangka makhluk dan otot yang mengatur struktur dalam gerakan.
Di masa depan, ketika terbenam di habitat yang kompleks, berdasarkan prinsip-prinsip ini, berbagai bentuk makhluk yang berbeda dapat dikembangkan - beberapa di antaranya akan lebih "berlapis baja", yang lain dirancang untuk gerakan cepat, yang lain untuk serangan yang efektif, dll.
Berburu dan berkembang biak
Jika kosmos diajarkan untuk saling berburu, jumlah materi dalam simulasi dapat tetap konstan, sementara generasi makhluk akan saling sukses.
Kemudian rantai makanan yang stabil dapat terbentuk dan proses besar evolusi bersama dari berbagai spesies makhluk dimulai.
Untuk percobaan pertama, saya menggunakan 4 jenis sel:
- sel pencernaan (berwarna) - ketika menyentuh tubuh kosmik lain, gigit sepotong
- armor (cahaya) - sangkar mekanik yang lebih kuat yang tidak bisa digigit
- jaringan ikat (abu-abu) - kain elastis lunak
- sel motorik (gelap) - memungkinkan ruang bergerak lebih cepat
Segera setelah kosmos makan jumlah sel yang cukup, ia "membelah", membentuk di dekatnya salinannya yang sedikit termutasi.
Proses semacam itu sudah menghasilkan bentuk dengan struktur dan perilaku yang berbeda:
Habitat
Ruang dingin yang kosong bukanlah tempat terbaik untuk hidup.
Untuk membuat bioma virtual, Anda dapat menggunakan bahan bangunan dasar - partikel tanah, air, cahaya, dan sel tanaman yang mampu tumbuh.
Partikel-partikel tanah saling menempel, membentuk landasan yang kokoh. Tanah bisa basah jika partikel air menimbunnya.
Di tanah yang lembab, dalam cahaya yang baik, tanaman bisa tumbuh. Massa tanaman adalah sumber utama makanan organik untuk bentuk hewan.
Tubuh hewan, membusuk, mengembalikan zat anorganik kembali ke ekosistem bioma.
PS
Ini adalah artikel ulasan, dimensi yang tidak memungkinkan pengungkapan yang koheren dari semua bidang di mana proyek ini berkembang.
Sekarang saya sedang mengerjakan perancang interaktif berfitur lengkap yang akan memberi Anda kesempatan untuk "bermain game luar angkasa" dalam mode kotak pasir, mendesain jenis makhluk baru, menggambar ekosistem "dalam mode Dewa" dan mengamati evolusi secara real time.
Sedangkan untuk bagian teknis, kemajuan tidak berhenti: sejak 2012, paradigma pengembangan telah berubah 4 kali, secara bertahap bergerak dari konsep CUDA + JS yang dijelaskan dalam artikel ini menuju model ORM GPU yang bekerja sepenuhnya di sisi GPU dan memiliki bahasa objek sendiri untuk prosedur tersimpan.
Sekian, terima kasih atas perhatiannya!Ikuti perkembangan proyek dan dukung pengembangan di sini:
https://www.patreon.com/samadhi_toolboxMasih ada beberapa posting blog, tetapi jika ada pelanggan, saya berjanji untuk mempostingnya, selama 7 tahun saya telah mengumpulkan banyak konten secara tidak hati-hati
Kesimpulannya - sedikit wawasan kerja: