1 puan yazan GN⁺ 2023-12-30 | 1 yorum | WhatsApp'ta paylaş
  • Particle Life Simulation, atom benzeri parçacıklar arasındaki basit çekim-itme kurallarıyla karmaşık öz-örgütlenme desenleri oluşturan ilkel bir yapay yaşam simülasyonudur
  • GUI hariç kod bir sayfadan kısadır ve C++ uygulamasındaki çekirdek algoritma /particle_life/src/ofApp.cpp dosyasının ilk 100 satırında yer alır
  • JavaScript demosu 2D ve 3D sürümlerle sunulur; README içinde 500x500 tuvalde sarı, kırmızı ve yeşil parçacıklardan 200'er tane oluşturup renk grupları arasındaki kuvvet kurallarını uygulayan bir örnek bulunur
  • İlginç desenleri bulmak için kesin parametrelerden çok rastgele keşif ve kademeli ince ayar önerilir; ayrıca yerel maksimumlara takılmamak için ara sıra büyük parametre değişiklikleri verilebilir
  • Mevcut sınırlama, tüm parçacık çiftleri arasındaki mesafeyi hesaplayan iç içe döngüler nedeniyle hesaplama karmaşıklığının karesel zaman olmasıdır; GPU paralel hesaplama, parametre kaydetme, parçacık tipi genişletme ve daha sezgisel bir UI gibi işler hâlâ yapılmayı bekliyor

Particle Life Simulation'ın amacı

  • Particle Life Simulation, atom benzeri parçacıklar arasına basit çekim veya itme kuralları uygulayarak ilkel yapay yaşam desenlerini simüle eden bir programdır
  • Yalnızca basit kurallarla karmaşık öz-örgütlenme ve yaşam benzeri desenlerin ortaya çıkabildiğini göstermeye odaklanır
  • GUI bileşenleri hariç tutulduğunda kod bir sayfadan kısadır
  • Eğitim ve adım adım anlatım YouTube videosu olarak sunulur

Demolar ve çalıştırma yöntemi

  • JavaScript çevrimiçi demosu 2D ve 3D olarak sunulur
  • C++ sürümü, depoyu indirip arşivden çıkardıktan sonra /particle_life/bin/ klasöründeki particle_life.exe dosyasını çalıştırarak kullanılır
  • README içinde C++ sürümünün arayüz görseli ve örnek sonuç görselleri bulunur

Desen keşif yöntemi

  • İlginç desenleri yeniden üretirken parametreleri tam olarak tutturmak gerekmez
  • En iyi yöntem, önce rastgele parametre keşfi denemek, ardından ilginç bir desen bulunduğunda kademeli olarak ince ayar yapmaktır
  • Yerel maksimumlara sıkışmamak için zaman zaman büyük parametre sıçramaları yapılabilir
  • Bu yaklaşımla birbirinden farklı ve ilginç desenler sürekli ortaya çıkabilir

Kod ve uygulama yapısı

  • Kaynak kod C++, JavaScript ve Python ile sunulur
  • C++ programına katkı vermek isteyenler için çekirdek algoritma /particle_life/src/ofApp.cpp dosyasının ilk 100 satırındadır
    • Geri kalanı GUI bileşenleri ve render kontrolüdür
    • GUI ve render işlemleri openFrameworks kütüphanesi tarafından sağlanır
  • C++ derleme yöntemi
    • Depoyu indirin
    • openFrameworks indirin
    • openFrameworks'ün projectGenerator aracıyla /particle_life/ klasörünü projeye alın
    • Ya da yeni bir openFrameworks projesi oluşturup ofxGui ekleyin, ardından oluşturulan projenin /src/ klasörünü deponun /src/ klasörüyle değiştirin
    • Sonrasında C++ kodunu yerel makinenizde derleyebilirsiniz

JavaScript örneğinin çalışma şekli

  • README'deki JavaScript örneği 500x500 canvas üzerinde çalışır
  • atom, x, y, vx, vy, color özelliklerine sahip bir nesne olarak oluşturulur
  • create fonksiyonu, belirtilen sayıda aynı renkte parçacık grubu oluşturur ve bunları genel atoms dizisine de ekler
  • rule(atoms1, atoms2, g), iki parçacık grubu arasındaki kuvveti hesaplar
    • Kuvvet yalnızca iki parçacık arasındaki d mesafesi 0'dan büyük ve 80'den küçük olduğunda uygulanır
    • Kuvvet (g * 1) / d olarak hesaplanır
    • g değeri, renk grupları arasındaki çekim veya itme kuralını belirler
  • Örnek, sarı, kırmızı ve yeşil parçacıklardan ayrı ayrı 200 adet oluşturur
  • update, renk grubu kombinasyonlarına göre kuralları uyguladıktan sonra ekranı temizler ve parçacıkları siyah arka plan üzerinde yeniden çizer
  • Animasyon döngüsü requestAnimationFrame(update) ile çalıştırılır
  • Daha optimize bir sürüm particle_life.html dosyasında bulunur

Diğer portlar

İlgili konular ve ilham kaynakları

  • İlgili konular Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata ve Self organizing patterns'dır
  • Bu proje, Jeffery Ventrella'nın Clusters çalışmasından ilham almıştır
  • Ventrella'nın koduna erişilememiştir
  • Ana farkın, çarpışma algılamasının uygulanmamış olması olduğu düşünülür
    • Çarpışma algılamasını çıkararak binlerce parçacığın gerçek zamanlı simülasyonu mümkün olmuş görünmektedir
  • Parametrelerin gerçek zamanlı değiştirilebilmesi için GUI kontrolleri eklenmiştir
    • Bu sayede ince ayar ve keşif kolaylaşır
    • Çok basit bir ilişki modelinden daha önce görülmemiş desenler ortaya çıkabilmiştir
  • Kod, programcı olmayanlar ve genel kamu için eğitim materyali olarak başlamıştır
    • Amaç, karmaşıklığın basitlikten doğabileceğini göstermektir
    • Yapay yaşam kodları arasında tek haneli ölçekte daha da basit olabileceği düşünülmektedir

Kalan görevler

  • Parametreleri kaydetme ve yükleme özelliği ekleyerek kullanıcıların ilginç modelleri kolayca paylaşabilmesini sağlamak
  • Şu anda 4 ile sınırlı olan parçacık tiplerini daha da artırabilmek
  • Tüm parçacık çiftleri arasındaki mesafeyi hesaplayan iç içe döngüler en büyük darboğazdır
    • Hesaplama karmaşıklığı karesel zamandır
    • Bunu aşmanın bir yolu gereklidir
  • Parçacık çiftleri arasındaki mesafe hesabı paralelleştirmeye uygun olduğu için GPU üzerinde hesaplanabilir
  • Ekran boyutlandırma özelliği ve sınır kontrollerinin iyileştirilmesi gerekir
    • Hızlı hareket eden çok sayıdaki parçacık ekran sınırlarının dışına çıkabilir
  • Parametrelerin daha hassas kontrol edilebilmesi için daha sezgisel bir UI eklemek
  • Rastgeleleştirme düğmesi veya başlangıç kurallarını sürekli özyinelemeli biçimde değiştiren basit bir meta kural eklenebilir
    • Amaç, desenlerin yerel maksimumlara sıkışmadan sürekli değişmesini sağlamaktır
  • Parametre seçimi ve optimizasyonu için daha iyi bir yöntem olarak evrimsel algoritma kullanılabilir
    • Bunun için bir uygunluk fonksiyonu yazmak gerekir
    • Bu programın alanında uygunluk fonksiyonunun ne olması gerektiği şu anda bilinmemektedir
    • Gerçek dünyadaki uygunluk fonksiyonu rekabet ve doğal seçilimdir
    • Burada kullanıcı, ilginç desenler üreten parametreleri ince ayar yaparak seçer; ancak “ilginçlik” kavramını tanımlamak zordur

1 yorum

 
GN⁺ 2023-12-30
Hacker News yorumları
  • Okulda yaptığım ilk kodlama projelerinden biri Conway'in Yaşam Oyunu idi; yalnızca siyah-beyaz biraz sıkıcı geldiği için RGB “genler” ekledim, yeni doğan hücrelerin ebeveyn renklerinin karışımını almasını sağladım ve rastgele mutasyonlar da ekledim.
    Hangi “tarafın” tahtaya hâkim olduğunu izlemek oldukça eğlenceli.
    Demo: https://genetic-life.surge.sh/
    Kaynak: Başta C++ olan şeyi Rust/WASM'e port ettim https://github.com/franky47/genetic-life
  • Ürettiklerim arasında en ilginç olanı buydu: https://hunar4321.github.io/particle-life/particle_life.html...
    Sonunda büyük ve kararsız bir yığın ile kararlı bir yığına oturuyor; ikisi de hareket etmediği için orada bitiyor.
    Ama ondan önce nesnelerin karşılaşıp birleştiği, beklediğim sahneleri gösterdi.
  • Gerçekten ilginç. John Conway'in Yaşam Oyunu'nun daha karmaşık bir sürümü gibi görünüyor.
    Bu tür parametrelerde, çok küçük ölçekte bile küçük canlı benzeri şeylerin kolayca oluşması şaşırtıcı.
    Bazı insanlar gerçek evrenin parametrelerinin yaşamın ortaya çıkmasını kolaylaştıracak şekilde ayarlandığını düşünüyor; ama bana daha çok yaşam oluşumunu zorlaştıracak şekilde ayarlanmış gibi geliyor.
    • O şeyler canlıdan çok moleküle yakın. Elbette karmaşık bir kural kümesi kararlı duruma yaklaşırken, renkleri yönetim biçimlerine göre atanmış uzak yıldız imparatorlukları gibi hayal ettiğim oldu.
      Yanılsamayı yaratan şey hareket. Bu sistemde yerleşik korunum yasaları olmadığı için hareket sürüyor. B'nin A'ya çekildiği, A'nın da B'yi ittiği bir A-B çifti oluşturursanız öylece vın diye uçar.
      Kurallara enerji ya da momentum korunumu gibi korunum yasaları dahil edilecek şekilde tasarlansaydı, çok daha az ilginç ve Conway'in Yaşam Oyunu'nda pentomino patlamasının geç evresindeki hâline daha yakın yapılar ortaya çıkardı.
      Yeterince büyük bir işlemci olsaydı bunu 3 boyutlu görmek isterdim; ayrıca kuvvetin r'nin tersi, r'nin küpünün tersi ya da r * log(r) ile azaldığı durumları veya “uzaktan iten, çok yakından çeken” parçacıklar gibi seçenekleri de eklemek isterdim. Akıllıca optimize edilse bile böyle bir sistemin kilitlenip kalacağı hissine kapılıyorum.
    • Yine de evrende yaşamın özellikle nadir olduğuna inanmak için bir sebep yok.
  • İlginç bir tesadüf; yakın zamanda ben de benzer bir şey yaptım: https://webgl-particle-life.netlify.app/
    Kaynak: https://github.com/ath92/particle-life
    Bu sürüm tüm işi WebGL shader'larında yapıyor ve simülasyon durumunu texture'larda ve uniforms'larda tutuyor.
    Bu sayede daha fazla parçacığı simüle edip çizebiliyor; ancak daha az desteklenen WebGL uzantıları kullandığı için her cihazda çalışmayabilir.
  • İlgili yazılar:
    Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - Aralık 2022, 1 yorum
    Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - Kasım 2022, 1 yorum
    Particle Life - https://news.ycombinator.com/item?id=21875720 - Aralık 2019, 7 yorum
  • Bu taraftaki uygulama çok daha tamamlanmış, ama ben daha önce Godot 4'te compute shader ile bir kez yapmayı denemiştim.
    İlgilenirseniz burada: https://github.com/jasonjmcghee/compute-shaders
  • Daha önce hiç düşünmemiştim ama karşılaştırınca Conway'in Yaşam Oyunu'nun parçacık tabanlı olmaktan çok dalga tabanlı olduğunu fark ettim.
    Yani CGoL'de kurallar, ızgara üzerinde hareket eden nesnelere değil ızgaradaki konumlara uygulanıyor. Bu sistemin de dalga tabanlı bir yaklaşımla kurulup kurulamayacağını merak ediyorum.
    Ayrıca bu sistemde her karede tüm parçacıklar, mesafeden bağımsız olarak birbirini etkiliyor; bu yüzden ışık hızı sonsuzmuş gibi görünüyor. Buna karşılık CGoL'de her hücre her karede yalnızca doğrudan komşularını etkileyebildiğinden bir tür ışık hızı var.
  • Şu anda 3D JS sürümüne bakıyorum; orijinal Conway'in Yaşam Oyunu'ndan ya da 90'lardaki Primordial Life ekran koruyucusundan beri en sevdiğim şey olabilir.
    Shader desteği eklemeyi düşünüp düşünmediğinizi merak ediyorum. Daha yavaş ve “yığınlı” hissi veren bir sürümü tam ekranda görmek isterim.
    Muhtemelen Mac'imi bir ısıtıcıya dönüştürür, ama şu an bu daha çok avantaj ;)
  • Hiroki Sayama'nın Swarm Chemistry'sini hatırlattı.
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • Bu tür şeylere daha fazla ilgi duyuyorsanız Smooth-life ve Lenia'yı öneririm.
    Özellikle Lenia'nın birkaç daha karmaşık varyantı var; bu konuyla ilgili olarak aklıma “Flow Lenia” veya “Particle Lenia” geliyor.