"Particle Life" teknolojisi
(github.com/hunar4321)- 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.cppdosyası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ündekiparticle_life.exedosyası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.cppdosyası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
projectGeneratoraracıyla/particle_life/klasörünü projeye alın - Ya da yeni bir openFrameworks projesi oluşturup
ofxGuiekleyin, 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şturulurcreatefonksiyonu, belirtilen sayıda aynı renkte parçacık grubu oluşturur ve bunları genelatomsdizisine de eklerrule(atoms1, atoms2, g), iki parçacık grubu arasındaki kuvveti hesaplar- Kuvvet yalnızca iki parçacık arasındaki
dmesafesi 0'dan büyük ve 80'den küçük olduğunda uygulanır - Kuvvet
(g * 1) / dolarak hesaplanır gdeğeri, renk grupları arasındaki çekim veya itme kuralını belirler
- Kuvvet yalnızca iki parçacık arasındaki
- Ö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.htmldosyası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
Hacker News yorumları
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
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.
Bu gerçekten eğlenceli. Çok hareket var ve formu da güzel.
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.
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.
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.
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
İlgilenirseniz burada: https://github.com/jasonjmcghee/compute-shaders
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.
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 ;)
https://www.youtube.com/watch?v=BpN-DE3o6u8
https://bingdev.binghamton.edu/sayama/SwarmChemistry/
Özellikle Lenia'nın birkaç daha karmaşık varyantı var; bu konuyla ilgili olarak aklıma “Flow Lenia” veya “Particle Lenia” geliyor.