เทคโนโลยี "Particle Life"
(github.com/hunar4321)- Particle Life Simulation คือการจำลองชีวิตประดิษฐ์แบบดั้งเดิมที่สร้างแพตเทิร์นการจัดระเบียบตัวเองอันซับซ้อนจากกฎการดึงดูด·ผลักกันอย่างง่ายระหว่างอนุภาคที่คล้ายอะตอม
- หากไม่นับ GUI โค้ดมีความยาวน้อยกว่าหนึ่งหน้า และ อัลกอริทึมหลัก ของการใช้งานด้วย C++ อยู่ใน 100 บรรทัดแรกของ
/particle_life/src/ofApp.cpp - เดโม JavaScript มีให้ทั้งเวอร์ชัน 2D และ 3D และ README มีตัวอย่างที่สร้างอนุภาคสีเหลือง·สีแดง·สีเขียวอย่างละ 200 อนุภาคบนแคนวาส 500x500 แล้วใช้กฎแรงระหว่างกลุ่มสี
- แนะนำให้หาแพตเทิร์นที่น่าสนใจด้วย การสำรวจแบบสุ่ม และการปรับละเอียดทีละน้อย มากกว่าการใช้พารามิเตอร์ที่แม่นยำ และอาจเปลี่ยนพารามิเตอร์ครั้งใหญ่เป็นบางครั้งเพื่อหลีกเลี่ยงการติดอยู่ที่ค่าสูงสุดเฉพาะที่
- ข้อจำกัดปัจจุบันคือความซับซ้อนในการคำนวณเป็น เวลาแบบกำลังสอง เนื่องจากลูปซ้อนที่คำนวณระยะห่างของอนุภาคทุกคู่ และยังเหลืองานอย่างการคำนวณขนานด้วย GPU, การบันทึกพารามิเตอร์, การขยายประเภทอนุภาค และ UI ที่ใช้งานเข้าใจง่ายขึ้น
วัตถุประสงค์ของ Particle Life Simulation
- Particle Life Simulation เป็นโปรแกรมที่จำลองแพตเทิร์นชีวิตประดิษฐ์แบบดั้งเดิม โดยใช้กฎการดึงดูดหรือผลักกันอย่างง่ายระหว่างอนุภาคที่คล้ายอะตอม
- มุ่งเน้นการแสดงให้เห็นว่าเพียงกฎง่าย ๆ ก็สามารถทำให้เกิด การจัดระเบียบตัวเอง ที่ซับซ้อนและแพตเทิร์นที่คล้ายสิ่งมีชีวิตได้
- หากไม่นับองค์ประกอบ GUI โค้ดมีความยาวน้อยกว่าหนึ่งหน้า
- มีบทเรียนและ walkthrough เป็นวิดีโอ YouTube
เดโมและวิธีรัน
- มีเดโมออนไลน์ JavaScript ให้ทั้งแบบ 2D และ 3D
- เวอร์ชัน C++ ใช้วิธีดาวน์โหลดรีโพซิทอรี แตกไฟล์ แล้วรัน
particle_life.exeในโฟลเดอร์/particle_life/bin/ - README มีภาพอินเทอร์เฟซของเวอร์ชัน C++ และภาพผลลัพธ์ตัวอย่าง
วิธีสำรวจแพตเทิร์น
- เมื่อจะสร้างแพตเทิร์นที่น่าสนใจซ้ำ ไม่จำเป็นต้องตั้งพารามิเตอร์ให้ตรงเป๊ะ
- วิธีที่ดีที่สุดคือเริ่มจากการลอง สำรวจพารามิเตอร์แบบสุ่ม จากนั้นเมื่อพบแพตเทิร์นที่น่าสนใจแล้วค่อย ๆ ปรับละเอียดทีละน้อย
- เพื่อไม่ให้ติดอยู่ที่ค่าสูงสุดเฉพาะที่ อาจให้พารามิเตอร์กระโดดครั้งใหญ่เป็นบางครั้งได้
- ด้วยวิธีนี้ แพตเทิร์นที่แตกต่างและน่าสนใจสามารถเกิดขึ้นอย่างต่อเนื่องได้
โค้ดและโครงสร้างการใช้งาน
- ซอร์สโค้ดมีให้ใน C++, JavaScript และ Python
- หากต้องการมีส่วนร่วมกับโปรแกรม C++ อัลกอริทึมหลักอยู่ใน 100 บรรทัดแรกของ
/particle_life/src/ofApp.cpp- ส่วนที่เหลือคือคอมโพเนนต์ GUI และการควบคุมการเรนเดอร์
- GUI และการเรนเดอร์จัดหาโดยไลบรารี openFrameworks
- วิธีบิลด์ C++
- ดาวน์โหลดรีโพซิทอรี
- ดาวน์โหลด openFrameworks
- ใช้
projectGeneratorของ openFrameworks เพื่อนำโฟลเดอร์/particle_life/เข้าเป็นโปรเจกต์ - หรือสร้างโปรเจกต์ openFrameworks ใหม่ เพิ่ม
ofxGuiแล้วแทนที่โฟลเดอร์/src/ของโปรเจกต์ที่สร้างขึ้นด้วย/src/ของรีโพซิทอรี - จากนั้นสามารถคอมไพล์โค้ด C++ บนเครื่องโลคัลได้
วิธีทำงานของตัวอย่าง JavaScript
- ตัวอย่าง JavaScript ใน README ทำงานบน
canvasขนาด 500x500 atomถูกสร้างเป็นอ็อบเจกต์ที่มีx,y,vx,vy,color- ฟังก์ชัน
createสร้างกลุ่มอนุภาคสีเดียวกันตามจำนวนที่กำหนด และเพิ่มเข้าไปในอาร์เรย์atomsทั้งหมดด้วย rule(atoms1, atoms2, g)คำนวณแรงระหว่างกลุ่มอนุภาคสองกลุ่ม- ใช้แรงเฉพาะเมื่อระยะ
dระหว่างอนุภาคสองตัวมากกว่า 0 และน้อยกว่า 80 - แรงคำนวณเป็น
(g * 1) / d - ค่า
gเป็นตัวกำหนดกฎการดึงดูดหรือผลักกันระหว่างกลุ่มสี
- ใช้แรงเฉพาะเมื่อระยะ
- ตัวอย่างสร้างอนุภาคสีเหลือง สีแดง และสีเขียว อย่างละ 200 ตัว
updateใช้กฎตามชุดผสมของกลุ่มสี จากนั้นล้างหน้าจอและวาดอนุภาคใหม่บนพื้นหลังสีดำ- รันลูปแอนิเมชันด้วย
requestAnimationFrame(update) - เวอร์ชันที่ปรับแต่งประสิทธิภาพมากกว่าอยู่ในไฟล์
particle_life.html
พอร์ตอื่น ๆ
หัวข้อที่เกี่ยวข้องและแรงบันดาลใจ
- หัวข้อที่เกี่ยวข้องคือ Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata, Self organizing patterns
- โปรเจกต์นี้ได้รับแรงบันดาลใจจาก Clusters ของ Jeffery Ventrella
- ไม่สามารถเข้าถึงโค้ดของ Ventrella ได้
- คาดว่าความแตกต่างหลักคือไม่ได้ใช้งานการตรวจจับการชน
- เห็นว่าการตัดการตรวจจับการชนออกทำให้สามารถจำลองอนุภาคหลายพันตัวแบบเรียลไทม์ได้
- เพิ่มการควบคุมผ่าน GUI เพื่อเปลี่ยนพารามิเตอร์แบบเรียลไทม์ได้
- วิธีนี้ทำให้การปรับละเอียดและการสำรวจง่ายขึ้น
- จากโมเดลความสัมพันธ์ที่เรียบง่ายมาก สามารถเกิดแพตเทิร์นที่ไม่เคยเห็นมาก่อนได้
- โค้ดเริ่มต้นเป็นสื่อการเรียนรู้สำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์และสาธารณชนทั่วไป
- มีวัตถุประสงค์เพื่อแสดงให้เห็นว่าความซับซ้อนสามารถเกิดจากความเรียบง่ายได้
- เห็นว่าในบรรดาโค้ดชีวิตประดิษฐ์ โค้ดนี้อาจเรียบง่ายกว่าในระดับเลขหลักเดียวด้วย
งานที่เหลือ
- เพิ่มฟังก์ชันบันทึกและโหลดพารามิเตอร์ เพื่อให้ผู้ใช้แชร์โมเดลที่น่าสนใจได้ง่าย
- ทำให้สามารถเพิ่ม ประเภทอนุภาค ได้มากกว่าที่ปัจจุบันกำหนดตายตัวไว้ 4 ประเภท
- ลูปซ้อนที่คำนวณระยะห่างของอนุภาคทุกคู่เป็นคอขวดที่ใหญ่ที่สุด
- ความซับซ้อนในการคำนวณกลายเป็นเวลาแบบกำลังสอง
- จำเป็นต้องมีวิธีเลี่ยงปัญหานี้
- การคำนวณระยะของคู่อนุภาคทำให้ขนานได้ง่าย จึงสามารถคำนวณบน GPU ได้
- ต้องมีฟังก์ชันปรับขนาดหน้าจอและปรับปรุงการตรวจสอบขอบเขต
- อนุภาคจำนวนมากที่เคลื่อนที่เร็วอาจหลุดออกนอกขอบจอได้
- เพิ่ม UI ที่ใช้งานเข้าใจง่ายขึ้น เพื่อควบคุมพารามิเตอร์ได้ละเอียดกว่าเดิม
- อาจเพิ่มปุ่มสุ่มหรือเมตารูลอย่างง่ายที่แปลงกฎเริ่มต้นซ้ำ ๆ แบบ recursive ได้
- มีเป้าหมายเพื่อให้แพตเทิร์นเปลี่ยนไปเรื่อย ๆ โดยไม่ติดอยู่ที่ค่าสูงสุดเฉพาะที่
- สามารถใช้อัลกอริทึมเชิงวิวัฒนาการเป็นวิธีที่ดีกว่าในการเลือกและปรับแต่งพารามิเตอร์
- สำหรับสิ่งนี้ต้องเขียนฟังก์ชันความเหมาะสม
- ในขอบเขตของโปรแกรมนี้ ยังไม่ทราบว่าฟังก์ชันความเหมาะสมคืออะไร
- ฟังก์ชันความเหมาะสมในโลกจริงคือการแข่งขันและการอยู่รอดของผู้ที่เหมาะสมที่สุด
- ในที่นี้ผู้ใช้จะปรับละเอียดและเลือกพารามิเตอร์ที่สร้างแพตเทิร์นที่น่าสนใจ แต่ “ความน่าสนใจ” นิยามได้ยาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
การได้ดูว่า “ฝ่าย” ไหนจะครองกระดานก็ค่อนข้างสนุกดี
เดโม: https://genetic-life.surge.sh/
ซอร์ส: เดิมเขียนด้วย C++ แล้วพอร์ตไปเป็น Rust/WASM https://github.com/franky47/genetic-life
สุดท้ายมันจะยุบลงเหลือก้อนใหญ่ที่ไม่เสถียรหนึ่งก้อนกับก้อนที่เสถียรอีกหนึ่งก้อน แล้วทั้งคู่ก็หยุดนิ่ง เลยจบแค่นั้น
แต่ก่อนจะถึงจุดนั้น มันแสดงฉากที่วัตถุมาพบกันและรวมตัวกันแบบที่หวังไว้
อันนี้สนุกมาก มีการเคลื่อนไหวเยอะและ รูปทรง ก็ดูดี
น่าทึ่งที่ภายใต้พารามิเตอร์แบบนี้ สิ่งที่คล้ายสิ่งมีชีวิตขนาดเล็กก็ก่อตัวได้ง่ายแม้ในสเกลเล็กมาก
บางคนคิดว่าพารามิเตอร์ของจักรวาลจริงเอื้อต่อการเกิดชีวิต แต่กลับรู้สึกเหมือนมันถูกตั้งมาให้ การก่อกำเนิดของชีวิต เกิดได้ยากมากกว่า
สิ่งที่ทำให้ชวนเข้าใจผิดคือการเคลื่อนไหว ระบบนี้ไม่ได้ฝังกฎการอนุรักษ์ไว้ จึงทำให้การเคลื่อนไหวยังคงอยู่ได้ ถ้าสร้างคู่ A-B ที่ B ถูกดึงเข้าหา A และ A ผลัก B มันก็จะพุ่งทะยานออกไปแบบนั้นเลย
ถ้าออกแบบให้กฎรวม กฎการอนุรักษ์ อย่างการอนุรักษ์พลังงานหรือโมเมนตัมไว้ด้วย โครงสร้างที่ได้คงน่าสนใจน้อยลงมาก และจะใกล้กับภาพช่วงท้ายของการระเบิด pentomino ใน Game of Life ของ Conway มากกว่า
ถ้ามีโปรเซสเซอร์ที่ใหญ่พอ ผมอยากเห็นมันในแบบสามมิติ และอยากลองตัวเลือกอย่างแรงที่ลดลงตามผกผันของ r หรือผกผันของกำลังสามของ r หรือ
r * log(r)หรืออนุภาคแบบ “ผลักกันเมื่ออยู่ไกล แต่ดึงดูดกันเมื่ออยู่ใกล้มาก” ถึงจะปรับแต่งอย่างฉลาดแค่ไหนก็ยังรู้สึกว่าระบบแบบนั้นน่าจะหยุดนิ่งไปในที่สุดซอร์ส: https://github.com/ath92/particle-life
เวอร์ชันนี้ประมวลผลทุกอย่างใน WebGL shader และเก็บสถานะการจำลองไว้ใน texture กับ uniforms
ทำให้จำลองและวาดอนุภาคได้มากขึ้น แต่เพราะใช้ WebGL extension ที่รองรับน้อยกว่า จึงอาจรันไม่ได้บนทุกอุปกรณ์
Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - ธันวาคม 2022, ความคิดเห็น 1 รายการ
Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - พฤศจิกายน 2022, ความคิดเห็น 1 รายการ
Particle Life - https://news.ycombinator.com/item?id=21875720 - ธันวาคม 2019, ความคิดเห็น 7 รายการ
ถ้าสนใจก็ดูได้ที่นี่: https://github.com/jasonjmcghee/compute-shaders
กล่าวคือ ใน CGoL กฎถูกนำไปใช้กับตำแหน่งบนกริด ไม่ใช่วัตถุที่เคลื่อนผ่านกริด ผมเลยสงสัยว่าระบบนี้จะสร้างในแบบอิงคลื่นได้ไหม
อีกอย่าง ในระบบนี้ทุกอนุภาคมีผลต่อกันทุกเฟรมโดยไม่ขึ้นกับระยะทาง จึงดูเหมือนความเร็วแสงเป็นอนันต์ ขณะที่ CGoL แต่ละเซลล์มีผลได้แค่กับเพื่อนบ้านติดกันในแต่ละเฟรม จึงมีลักษณะคล้าย ความเร็วแสง อยู่
เลยสงสัยว่าเคยคิดจะเพิ่ม การรองรับ shader ไหม อยากเห็นเวอร์ชันที่ช้ากว่าและให้ความรู้สึกเป็น “ก้อน ๆ” แบบเต็มจอ
มันอาจทำให้ Mac ของผมกลายเป็นเครื่องทำความร้อน แต่ตอนนี้นั่นกลับเป็นข้อดี ;)
https://www.youtube.com/watch?v=BpN-DE3o6u8
https://bingdev.binghamton.edu/sayama/SwarmChemistry/
โดยเฉพาะ Lenia ที่มีสายพันธุ์ย่อยซับซ้อนอีกหลายแบบ ซึ่งสำหรับหัวข้อนี้ทำให้นึกถึง “Flow Lenia” และ “Particle Lenia”