1 คะแนน โดย GN⁺ 2023-12-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2023-12-30
ความคิดเห็นจาก Hacker News
  • หนึ่งในโปรเจ็กต์เขียนโค้ดแรก ๆ ที่ทำตอนเรียนคือ Game of Life ของ Conway แต่ขาวดำอย่างเดียวมันน่าเบื่อไปหน่อย เลยใส่ “ยีน” แบบ RGB ลงไป ให้เซลล์ที่เกิดใหม่รับสีแบบผสมจากพ่อแม่ และเพิ่มการกลายพันธุ์แบบสุ่มเข้าไปด้วย
    การได้ดูว่า “ฝ่าย” ไหนจะครองกระดานก็ค่อนข้างสนุกดี
    เดโม: https://genetic-life.surge.sh/
    ซอร์ส: เดิมเขียนด้วย C++ แล้วพอร์ตไปเป็น Rust/WASM https://github.com/franky47/genetic-life
  • สิ่งที่ผมสร้างได้แล้วน่าสนใจที่สุดคืออันนี้: https://hunar4321.github.io/particle-life/particle_life.html...
    สุดท้ายมันจะยุบลงเหลือก้อนใหญ่ที่ไม่เสถียรหนึ่งก้อนกับก้อนที่เสถียรอีกหนึ่งก้อน แล้วทั้งคู่ก็หยุดนิ่ง เลยจบแค่นั้น
    แต่ก่อนจะถึงจุดนั้น มันแสดงฉากที่วัตถุมาพบกันและรวมตัวกันแบบที่หวังไว้
  • น่าสนใจมาก ดูเหมือนเป็นเวอร์ชันที่ซับซ้อนกว่า Game of Life ของ John Conway
    น่าทึ่งที่ภายใต้พารามิเตอร์แบบนี้ สิ่งที่คล้ายสิ่งมีชีวิตขนาดเล็กก็ก่อตัวได้ง่ายแม้ในสเกลเล็กมาก
    บางคนคิดว่าพารามิเตอร์ของจักรวาลจริงเอื้อต่อการเกิดชีวิต แต่กลับรู้สึกเหมือนมันถูกตั้งมาให้ การก่อกำเนิดของชีวิต เกิดได้ยากมากกว่า
    • นั่นใกล้เคียงกับ โมเลกุล มากกว่าสิ่งมีชีวิต ถึงอย่างนั้น เวลาชุดกฎที่ซับซ้อนเข้าใกล้สภาวะคงตัว ผมก็เคยจินตนาการถึงมันเหมือนจักรวรรดิแห่งดวงดาวอันห่างไกลที่กำหนดสีตามระบอบการปกครอง
      สิ่งที่ทำให้ชวนเข้าใจผิดคือการเคลื่อนไหว ระบบนี้ไม่ได้ฝังกฎการอนุรักษ์ไว้ จึงทำให้การเคลื่อนไหวยังคงอยู่ได้ ถ้าสร้างคู่ A-B ที่ B ถูกดึงเข้าหา A และ A ผลัก B มันก็จะพุ่งทะยานออกไปแบบนั้นเลย
      ถ้าออกแบบให้กฎรวม กฎการอนุรักษ์ อย่างการอนุรักษ์พลังงานหรือโมเมนตัมไว้ด้วย โครงสร้างที่ได้คงน่าสนใจน้อยลงมาก และจะใกล้กับภาพช่วงท้ายของการระเบิด pentomino ใน Game of Life ของ Conway มากกว่า
      ถ้ามีโปรเซสเซอร์ที่ใหญ่พอ ผมอยากเห็นมันในแบบสามมิติ และอยากลองตัวเลือกอย่างแรงที่ลดลงตามผกผันของ r หรือผกผันของกำลังสามของ r หรือ r * log(r) หรืออนุภาคแบบ “ผลักกันเมื่ออยู่ไกล แต่ดึงดูดกันเมื่ออยู่ใกล้มาก” ถึงจะปรับแต่งอย่างฉลาดแค่ไหนก็ยังรู้สึกว่าระบบแบบนั้นน่าจะหยุดนิ่งไปในที่สุด
    • แต่ก็ไม่มีเหตุผลอะไรให้เชื่อว่าชีวิตในจักรวาลนั้นหายากเป็นพิเศษ
  • เป็นเรื่องบังเอิญที่น่าสนุก เพราะช่วงนี้ผมก็เพิ่งทำอะไรคล้าย ๆ กัน: https://webgl-particle-life.netlify.app/
    ซอร์ส: 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 รายการ
  • งานพัฒนาฝั่งนี้สมบูรณ์กว่ามาก แต่ก่อนหน้านี้ผมเคยลองทำด้วย compute shader ใน Godot 4 เหมือนกัน
    ถ้าสนใจก็ดูได้ที่นี่: https://github.com/jasonjmcghee/compute-shaders
  • ไม่เคยคิดแบบนี้มาก่อน แต่พอเอามาเทียบกันแล้วก็ทำให้รู้ว่า Game of Life ของ Conway นั้นอิงคลื่นมากกว่าอิงอนุภาค
    กล่าวคือ ใน CGoL กฎถูกนำไปใช้กับตำแหน่งบนกริด ไม่ใช่วัตถุที่เคลื่อนผ่านกริด ผมเลยสงสัยว่าระบบนี้จะสร้างในแบบอิงคลื่นได้ไหม
    อีกอย่าง ในระบบนี้ทุกอนุภาคมีผลต่อกันทุกเฟรมโดยไม่ขึ้นกับระยะทาง จึงดูเหมือนความเร็วแสงเป็นอนันต์ ขณะที่ CGoL แต่ละเซลล์มีผลได้แค่กับเพื่อนบ้านติดกันในแต่ละเฟรม จึงมีลักษณะคล้าย ความเร็วแสง อยู่
  • ตอนนี้กำลังดูเวอร์ชัน 3D JS อยู่ และอาจเป็นสิ่งที่ผมชอบที่สุดนับตั้งแต่ Game of Life ของ Conway ดั้งเดิมหรือสกรีนเซฟเวอร์ Primordial Life ในยุค 90
    เลยสงสัยว่าเคยคิดจะเพิ่ม การรองรับ shader ไหม อยากเห็นเวอร์ชันที่ช้ากว่าและให้ความรู้สึกเป็น “ก้อน ๆ” แบบเต็มจอ
    มันอาจทำให้ Mac ของผมกลายเป็นเครื่องทำความร้อน แต่ตอนนี้นั่นกลับเป็นข้อดี ;)
  • ทำให้นึกถึง Swarm Chemistry ของ Hiroki Sayama
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • ถ้าสนใจแนวนี้มากขึ้น ขอแนะนำ Smooth-life และ Lenia
    โดยเฉพาะ Lenia ที่มีสายพันธุ์ย่อยซับซ้อนอีกหลายแบบ ซึ่งสำหรับหัวข้อนี้ทำให้นึกถึง “Flow Lenia” และ “Particle Lenia”