1 poin oleh GN⁺ 2023-12-30 | 1 komentar | Bagikan ke WhatsApp
  • Particle Life Simulation adalah simulasi kehidupan buatan primitif yang menciptakan pola swakelola yang kompleks melalui aturan tarik-menarik dan tolak-menolak sederhana di antara partikel mirip atom
  • Di luar GUI, kodenya kurang dari satu halaman, dan algoritme inti implementasi C++ berada di 100 baris pertama /particle_life/src/ofApp.cpp
  • Demo JavaScript tersedia dalam versi 2D dan 3D, dan README menyertakan contoh yang membuat masing-masing 200 partikel kuning, merah, dan hijau pada kanvas 500x500, lalu menerapkan aturan gaya antargrup warna
  • Untuk menemukan pola menarik, disarankan menggunakan pencarian acak dan penyetelan bertahap daripada parameter yang presisi; sesekali perubahan parameter besar dapat diberikan agar tidak terjebak pada maksimum lokal
  • Batasan saat ini adalah kompleksitas komputasi menjadi waktu kuadrat karena loop bersarang yang menghitung jarak semua pasangan partikel; komputasi paralel GPU, penyimpanan parameter, perluasan tipe partikel, dan UI yang lebih intuitif masih menjadi tugas tersisa

Tujuan Particle Life Simulation

  • Particle Life Simulation adalah program yang mensimulasikan pola kehidupan buatan primitif dengan menerapkan aturan tarik-menarik atau tolak-menolak sederhana di antara partikel mirip atom
  • Fokusnya adalah menunjukkan bahwa swakelola yang kompleks dan pola mirip kehidupan dapat muncul hanya dari aturan sederhana
  • Jika elemen GUI dikecualikan, kodenya kurang dari satu halaman
  • Tutorial dan walkthrough tersedia sebagai video YouTube

Demo dan cara menjalankan

  • Demo online JavaScript tersedia dalam 2D dan 3D
  • Versi C++ dijalankan dengan mengunduh repositori, mengekstraknya, lalu menjalankan particle_life.exe di folder /particle_life/bin/
  • README menyertakan gambar antarmuka versi C++ dan gambar hasil contoh

Cara mengeksplorasi pola

  • Saat mereproduksi pola yang menarik, parameter tidak perlu dicocokkan secara persis
  • Cara terbaik adalah terlebih dahulu mencoba pencarian parameter acak, lalu melakukan penyetelan bertahap saat menemukan pola yang menarik
  • Agar tidak terjebak pada maksimum lokal, sesekali dapat diberikan lompatan parameter besar
  • Dengan cara ini, berbagai pola yang berbeda dan menarik dapat terus muncul

Struktur kode dan implementasi

  • Kode sumber tersedia dalam C++, JavaScript, dan Python
  • Jika ingin berkontribusi pada program C++, algoritme inti berada di 100 baris pertama /particle_life/src/ofApp.cpp
    • Sisanya adalah komponen GUI dan kontrol rendering
    • GUI dan rendering disediakan oleh library openFrameworks
  • Cara build C++
    • Unduh repositori
    • Unduh openFrameworks
    • Gunakan projectGenerator milik openFrameworks untuk mengimpor folder /particle_life/ ke proyek
    • Atau buat proyek openFrameworks baru, tambahkan ofxGui, lalu ganti folder /src/ pada proyek yang dibuat dengan /src/ dari repositori
    • Setelah itu, kode C++ dapat dikompilasi di mesin lokal

Cara kerja contoh JavaScript

  • Contoh JavaScript di README berjalan pada canvas 500x500
  • atom dibuat sebagai objek yang memiliki x, y, vx, vy, dan color
  • Fungsi create membuat grup partikel dengan warna yang sama sebanyak jumlah yang ditentukan dan juga menambahkannya ke array atoms keseluruhan
  • rule(atoms1, atoms2, g) menghitung gaya di antara dua grup partikel
    • Gaya hanya diterapkan ketika jarak d antara dua partikel lebih besar dari 0 dan lebih kecil dari 80
    • Gaya dihitung sebagai (g * 1) / d
    • Nilai g menentukan aturan tarik-menarik atau tolak-menolak antargrup warna
  • Contoh ini membuat masing-masing 200 partikel kuning, merah, dan hijau
  • update menerapkan aturan untuk setiap kombinasi grup warna, lalu membersihkan layar dan menggambar ulang partikel di atas latar belakang hitam
  • Loop animasi dijalankan dengan requestAnimationFrame(update)
  • Versi yang lebih dioptimalkan ada di file particle_life.html

Port lain

Topik terkait dan inspirasi

  • Topik terkait adalah Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata, dan Self organizing patterns
  • Proyek ini terinspirasi oleh Clusters dari Jeffery Ventrella
  • Kode Ventrella tidak dapat diakses
  • Perbedaan utama diperkirakan terletak pada tidak diimplementasikannya deteksi tabrakan
    • Dengan menghilangkan deteksi tabrakan, ribuan partikel dianggap dapat disimulasikan secara real-time
  • Kontrol GUI ditambahkan agar parameter dapat diubah secara real-time
    • Cara ini memudahkan penyetelan dan eksplorasi
    • Pola yang sebelumnya belum pernah terlihat dapat muncul dari model relasi yang sangat sederhana
  • Kode ini dimulai sebagai materi edukasi untuk non-programmer dan masyarakat umum
    • Tujuannya adalah menunjukkan bahwa kompleksitas dapat muncul dari kesederhanaan
    • Diperkirakan kode ini mungkin termasuk yang lebih sederhana, dalam skala satu digit, di antara kode kehidupan buatan

Tugas tersisa

  • Menambahkan fitur menyimpan dan memuat parameter agar pengguna dapat dengan mudah membagikan model yang menarik
  • Memungkinkan penambahan tipe partikel di luar 4 tipe yang saat ini tetap
  • Loop bersarang yang menghitung jarak semua pasangan partikel adalah bottleneck terbesar
    • Kompleksitas komputasinya menjadi waktu kuadrat
    • Diperlukan cara untuk mengatasinya
  • Perhitungan jarak pasangan partikel mudah diparalelkan, sehingga dapat dihitung di GPU
  • Diperlukan fitur pengubahan ukuran layar dan peningkatan pemeriksaan batas
    • Banyak partikel yang bergerak cepat dapat keluar dari batas layar
  • Menambahkan UI yang lebih intuitif agar parameter dapat dikontrol lebih detail
  • Dapat ditambahkan tombol randomisasi atau meta-aturan sederhana yang terus mengubah aturan awal secara rekursif
    • Tujuannya agar pola terus berubah tanpa terjebak pada maksimum lokal
  • Algoritme evolusioner dapat digunakan sebagai cara yang lebih baik untuk memilih dan mengoptimalkan parameter
    • Untuk itu, fungsi fitness perlu ditulis
    • Saat ini belum diketahui apa yang dimaksud fungsi fitness dalam domain program ini
    • Fungsi fitness di dunia nyata adalah kompetisi dan survival of the fittest
    • Di sini, pengguna menyetel dan memilih parameter yang menghasilkan pola menarik, tetapi “kemenarikan” sulit didefinisikan

1 komentar

 
GN⁺ 2023-12-30
Komentar Hacker News
  • Salah satu proyek coding pertama yang kubuat di sekolah adalah Game of Life karya Conway, tetapi hitam-putih saja terasa agak membosankan, jadi aku menambahkan “gen” RGB, membuat sel yang baru lahir mewarisi campuran warna dari induknya, dan juga menambahkan mutasi acak
    Cukup seru melihat “faksi” mana yang menguasai papan
    Demo: https://genetic-life.surge.sh/
    Source: versi aslinya dalam C++ lalu di-port ke Rust/WASM https://github.com/franky47/genetic-life
  • Hal paling menarik yang pernah kuhasilkan adalah ini: https://hunar4321.github.io/particle-life/particle_life.html...
    Pada akhirnya ia mengendap menjadi satu gumpalan besar yang tidak stabil dan satu gumpalan stabil, dan keduanya tidak bergerak, jadi selesai di situ
    Tapi sebelumnya, ia menampilkan pemandangan yang kuharapkan: benda-benda saling bertemu lalu bergabung
  • Sangat menarik. Ini terlihat seperti versi yang lebih kompleks dari Game of Life karya John Conway
    Mengejutkan bahwa pada parameter seperti ini, hal-hal kecil mirip makhluk hidup mudah terbentuk bahkan pada skala yang sangat kecil
    Ada orang yang berpikir parameter alam semesta nyata dibuat agar kehidupan mudah muncul, tetapi justru terasa seperti disetel agar pembentukan kehidupan menjadi sulit
    • Itu lebih dekat ke molekul daripada makhluk hidup. Meski begitu, saat sekumpulan aturan kompleks mendekati keadaan tunak, aku memang pernah membayangkannya seperti kekaisaran antarbintang jauh dengan warna yang ditetapkan per rezim pemerintahan
      Yang menipu adalah gerakannya. Sistem ini tidak memiliki hukum kekekalan yang tertanam, jadi gerak bisa terus bertahan. Jika kamu membuat pasangan A-B di mana B tertarik ke A dan A menolak B, mereka akan langsung melesat pergi
      Jika dirancang agar aturan-aturannya memasukkan hukum kekekalan seperti kekekalan energi atau momentum, hasilnya mungkin akan jauh kurang menarik dan lebih mirip struktur pada tahap akhir ledakan pentomino di Game of Life Conway
      Kalau ada prosesor yang cukup besar, aku ingin melihat ini dalam 3D, dan mencoba opsi seperti gaya yang berkurang menurut invers dari r atau invers kubik dari r, atau r * log(r), maupun partikel yang “saling tolak dari jauh tetapi saling tarik saat sangat dekat.” Meski dioptimalkan dengan cerdas pun, rasanya sistem seperti itu akan macet
    • Meski begitu, juga tidak ada alasan untuk percaya bahwa kehidupan benar-benar langka di alam semesta
  • Kebetulan yang lucu, aku baru-baru ini membuat sesuatu yang mirip: https://webgl-particle-life.netlify.app/
    Source: https://github.com/ath92/particle-life
    Versi ini memproses semuanya di shader WebGL, dan menyimpan status simulasi dalam texture dan uniforms
    Karena itu, ia bisa mensimulasikan dan menggambar lebih banyak partikel, tetapi mungkin tidak berjalan di semua perangkat karena memakai ekstensi WebGL yang dukungannya lebih terbatas
  • Tulisan terkait:
    Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - Desember 2022, 1 komentar
    Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - November 2022, 1 komentar
    Particle Life - https://news.ycombinator.com/item?id=21875720 - Desember 2019, 7 komentar
  • Implementasi ini jauh lebih matang, tetapi dulu aku pernah membuatnya sekali dengan compute shader di Godot 4
    Kalau tertarik, ada di sini: https://github.com/jasonjmcghee/compute-shaders
  • Sebelumnya aku tidak pernah memikirkannya, tetapi setelah membandingkan, aku sadar bahwa Game of Life Conway lebih berbasis gelombang daripada berbasis partikel
    Maksudnya, dalam CGoL aturan diterapkan pada posisi di grid, bukan pada objek yang bergerak melintasi grid. Aku penasaran apakah sistem ini juga bisa disusun dengan pendekatan berbasis gelombang
    Selain itu, dalam sistem ini setiap partikel saling memengaruhi pada setiap frame tanpa memandang jarak, jadi kecepatan cahaya terlihat seolah tak terbatas. Sebaliknya, dalam CGoL setiap sel hanya bisa memengaruhi tetangga langsungnya pada setiap frame, jadi ada semacam kecepatan cahaya
  • Saat ini aku sedang melihat versi JS 3D-nya, dan mungkin ini yang paling kusukai sejak Game of Life Conway asli atau screen saver Primordial Life dari tahun 90-an
    Aku penasaran apakah pernah terpikir untuk menambahkan dukungan shader. Aku ingin melihat versi yang lebih lambat dan terasa lebih “bergumpal” dalam layar penuh
    Mungkin itu akan mengubah Mac-ku menjadi pemanas ruangan, tetapi sekarang justru itu nilai plus ;)
  • Ini mengingatkanku pada Swarm Chemistry karya Hiroki Sayama
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • Jika tertarik lebih jauh pada jenis seperti ini, aku merekomendasikan Smooth-life dan Lenia
    Khususnya Lenia punya beberapa varian yang lebih kompleks, dan yang terlintas terkait topik ini adalah “Flow Lenia” atau “Particle Lenia”