1 điểm bởi GN⁺ 2023-12-30 | 1 bình luận | Chia sẻ qua WhatsApp
  • Particle Life Simulation là một mô phỏng sự sống nhân tạo nguyên thủy, tạo ra các mẫu tự tổ chức phức tạp từ những quy tắc hút/đẩy đơn giản giữa các hạt giống như nguyên tử
  • Trừ phần GUI, mã nguồn chưa đến một trang; thuật toán cốt lõi của bản triển khai C++ nằm trong 100 dòng đầu của /particle_life/src/ofApp.cpp
  • Demo JavaScript có cả phiên bản 2D và 3D; README có ví dụ tạo mỗi loại 200 hạt màu vàng, đỏ, xanh lá trên canvas 500x500 và áp dụng các quy tắc lực giữa các nhóm màu
  • Nên tìm các mẫu thú vị bằng khám phá ngẫu nhiên rồi tinh chỉnh dần dần hơn là phụ thuộc vào tham số chính xác; thỉnh thoảng có thể thay đổi tham số thật lớn để tránh mắc kẹt ở cực đại cục bộ
  • Hạn chế hiện tại là độ phức tạp tính toán ở mức thời gian bình phương do vòng lặp lồng nhau tính khoảng cách của mọi cặp hạt; các việc còn lại gồm tính toán song song bằng GPU, lưu tham số, mở rộng kiểu hạt và UI trực quan hơn

Mục đích của Particle Life Simulation

  • Particle Life Simulation là chương trình mô phỏng các mẫu sự sống nhân tạo nguyên thủy bằng cách áp dụng những quy tắc hút hoặc đẩy đơn giản giữa các hạt giống như nguyên tử
  • Trọng tâm là cho thấy chỉ với những quy tắc đơn giản cũng có thể xuất hiện tự tổ chức phức tạp và các mẫu giống sự sống
  • Nếu bỏ qua các thành phần GUI, mã nguồn chưa đến một trang
  • Tutorial và hướng dẫn từng bước được cung cấp dưới dạng video YouTube

Demo và cách chạy

  • Demo trực tuyến bằng JavaScript được cung cấp ở dạng 2D và 3D
  • Với phiên bản C++, tải repository về, giải nén rồi chạy particle_life.exe trong thư mục /particle_life/bin/
  • README có ảnh giao diện phiên bản C++ và ảnh kết quả ví dụ

Cách khám phá mẫu

  • Khi tái tạo các mẫu thú vị, không cần khớp tham số một cách chính xác
  • Cách tốt nhất là trước tiên thử khám phá tham số ngẫu nhiên, rồi khi tìm thấy mẫu thú vị thì tinh chỉnh dần
  • Để không mắc kẹt ở cực đại cục bộ, thỉnh thoảng có thể cho tham số nhảy một bước lớn
  • Với cách này, các mẫu khác nhau và thú vị có thể tiếp tục xuất hiện

Mã nguồn và cấu trúc triển khai

  • Mã nguồn được cung cấp bằng C++, JavaScriptPython
  • Nếu muốn đóng góp cho chương trình C++, thuật toán cốt lõi nằm trong 100 dòng đầu của /particle_life/src/ofApp.cpp
    • Phần còn lại là các thành phần GUI và điều khiển render
    • GUI và render do thư viện openFrameworks cung cấp
  • Cách build C++
    • Tải repository về
    • Tải openFrameworks
    • Dùng projectGenerator của openFrameworks để đưa thư mục /particle_life/ vào project
    • Hoặc tạo project openFrameworks mới, thêm ofxGui, rồi thay thư mục /src/ của project được tạo bằng /src/ trong repository
    • Sau đó có thể biên dịch mã C++ trên máy cục bộ

Cách hoạt động của ví dụ JavaScript

  • Ví dụ JavaScript trong README chạy trên canvas 500x500
  • atom được tạo như một object có x, y, vx, vy, color
  • Hàm create tạo một nhóm hạt cùng màu với số lượng chỉ định và cũng thêm chúng vào toàn bộ mảng atoms
  • rule(atoms1, atoms2, g) tính lực giữa hai nhóm hạt
    • Chỉ áp dụng lực khi khoảng cách d giữa hai hạt lớn hơn 0 và nhỏ hơn 80
    • Lực được tính bằng (g * 1) / d
    • Giá trị g quyết định quy tắc hút hoặc đẩy giữa các nhóm màu
  • Ví dụ tạo lần lượt 200 hạt màu vàng, đỏ và xanh lá
  • update áp dụng các quy tắc theo từng tổ hợp nhóm màu, sau đó xóa màn hình và vẽ lại các hạt trên nền đen
  • Vòng lặp animation được chạy bằng requestAnimationFrame(update)
  • Phiên bản tối ưu hơn nằm trong file particle_life.html

Các bản port khác

Chủ đề liên quan và cảm hứng

  • Các chủ đề liên quan là Particle Life Simulation, Primordial Soup - Evolution, Conway's game of life, Cellular automata, Self organizing patterns
  • Dự án này lấy cảm hứng từ Clusters của Jeffery Ventrella
  • Không thể truy cập mã nguồn của Ventrella
  • Khác biệt chính được cho là việc không triển khai phát hiện va chạm
    • Có vẻ nhờ bỏ phát hiện va chạm mà có thể mô phỏng hàng nghìn hạt theo thời gian thực
  • Có thể thêm điều khiển GUI để thay đổi tham số theo thời gian thực
    • Cách này giúp tinh chỉnh và khám phá dễ hơn
    • Từ một mô hình quan hệ rất đơn giản, các mẫu chưa từng thấy trước đây có thể xuất hiện
  • Mã nguồn ban đầu được viết như tài liệu giáo dục dành cho người không lập trình và công chúng nói chung
    • Mục đích là cho thấy sự phức tạp có thể sinh ra từ sự đơn giản
    • Có thể đây là một trong những mã sự sống nhân tạo đơn giản hơn, ở quy mô chỉ vài dòng một chữ số

Việc còn lại

  • Thêm chức năng lưu và tải tham số để người dùng có thể dễ dàng chia sẻ các mô hình thú vị
  • Cho phép thêm nhiều kiểu hạt hơn, hiện đang cố định ở 4 kiểu
  • Vòng lặp lồng nhau tính khoảng cách của mọi cặp hạt là nút thắt lớn nhất
    • Độ phức tạp tính toán trở thành thời gian bình phương
    • Cần có cách để vượt qua điều này
  • Việc tính khoảng cách giữa các cặp hạt dễ song song hóa, nên có thể tính trên GPU
  • Cần có chức năng thay đổi kích thước màn hình và cải thiện kiểm tra biên
    • Nhiều hạt di chuyển nhanh có thể vượt ra ngoài biên màn hình
  • Thêm UI trực quan hơn để có thể kiểm soát tham số chi tiết hơn
  • Có thể thêm nút ngẫu nhiên hóa hoặc một meta-rule đơn giản liên tục biến đổi đệ quy các quy tắc ban đầu
    • Mục đích là để mẫu tiếp tục thay đổi mà không mắc kẹt ở cực đại cục bộ
  • Có thể dùng thuật toán tiến hóa như một cách tốt hơn để chọn và tối ưu tham số
    • Để làm vậy cần viết hàm fitness
    • Hiện chưa rõ hàm fitness trong miền của chương trình này là gì
    • Hàm fitness trong thế giới thực là cạnh tranh và chọn lọc tự nhiên
    • Ở đây, người dùng tinh chỉnh và chọn các tham số tạo ra mẫu thú vị, nhưng “sự thú vị” là điều khó định nghĩa

1 bình luận

 
GN⁺ 2023-12-30
Các ý kiến trên Hacker News
  • Một trong những dự án lập trình đầu tiên tôi làm ở trường là Game of Life của Conway, nhưng chỉ đen trắng thì hơi chán nên tôi thêm “gene” RGB, để ô mới sinh nhận màu pha trộn từ màu của cha mẹ, và thêm cả đột biến ngẫu nhiên
    Xem “phe” nào chiếm lĩnh bàn cờ khá thú vị
    Demo: https://genetic-life.surge.sh/
    Mã nguồn: ban đầu là C++, sau được port sang Rust/WASM https://github.com/franky47/genetic-life
  • Thứ thú vị nhất trong số những gì tôi tạo ra là cái này: https://hunar4321.github.io/particle-life/particle_life.html...
    Cuối cùng nó lắng xuống thành một khối lớn không ổn định và một khối ổn định, cả hai đều không di chuyển nên kết thúc ở đó
    Nhưng trước đó nó đã cho thấy cảnh tôi mong đợi: các vật thể gặp nhau rồi hợp nhất
  • Thật sự thú vị. Trông như một phiên bản phức tạp hơn của Game of Life của John Conway
    Với các tham số như thế này, thật đáng ngạc nhiên là ngay cả ở quy mô rất nhỏ cũng dễ hình thành những thứ giống sinh vật nhỏ
    Một số người nghĩ rằng các tham số của vũ trụ thực được tinh chỉnh để sự sống dễ xuất hiện, nhưng tôi lại có cảm giác chúng được chỉnh để sự hình thành sự sống trở nên khó khăn
    • Cái đó giống phân tử hơn là sinh vật. Tất nhiên, khi một tập luật phức tạp tiến gần tới trạng thái ổn định, tôi từng tưởng tượng nó như các đế chế sao xa xôi, với màu sắc được gán theo từng thể chế chính quyền
      Điều khiến ta dễ nhầm là chuyển động. Vì hệ thống này không có định luật bảo toàn tích hợp sẵn nên chuyển động được duy trì. Nếu tạo một cặp A-B trong đó B bị A hút còn A đẩy B, nó sẽ bay vèo đi như vậy
      Nếu thiết kế sao cho các định luật bảo toàn như bảo toàn năng lượng hay động lượng được đưa vào quy tắc, cấu trúc thu được hẳn sẽ kém thú vị hơn nhiều và giống giai đoạn muộn của vụ bùng nổ pentomino trong Game of Life của Conway hơn
      Nếu có bộ xử lý đủ lớn, tôi muốn xem thứ này trong 3D, và cũng muốn thử các lựa chọn như lực suy giảm theo nghịch đảo của r, nghịch đảo lập phương của r, hoặc r * log(r), hay các hạt “đẩy nhau ở xa nhưng hút nhau khi rất gần”. Dù tối ưu khéo đến đâu, tôi có cảm giác hệ kiểu đó sẽ bị khựng lại
    • Nhưng cũng không có lý do gì để tin rằng sự sống trong vũ trụ là đặc biệt hiếm
  • Trùng hợp thú vị là gần đây tôi cũng làm một thứ tương tự: https://webgl-particle-life.netlify.app/
    Mã nguồn: https://github.com/ath92/particle-life
    Phiên bản này xử lý mọi thứ trong shader WebGL, và lưu trạng thái mô phỏng trong texture cùng uniforms
    Nhờ vậy có thể mô phỏng và vẽ nhiều hạt hơn, nhưng nó dùng các phần mở rộng WebGL ít được hỗ trợ hơn nên có thể không chạy trên mọi thiết bị
  • Các bài liên quan:
    Particle Life Emerges from Simplicity - https://news.ycombinator.com/item?id=34156592 - tháng 12/2022, 1 bình luận
    Particle Life Simulation - https://news.ycombinator.com/item?id=33680845 - tháng 11/2022, 1 bình luận
    Particle Life - https://news.ycombinator.com/item?id=21875720 - tháng 12/2019, 7 bình luận
  • Bản triển khai bên này hoàn thiện hơn nhiều, nhưng trước đây tôi từng thử làm một lần bằng compute shader trong Godot 4
    Nếu quan tâm thì ở đây: https://github.com/jasonjmcghee/compute-shaders
  • Trước đây tôi chưa từng nghĩ tới, nhưng khi so sánh thì tôi nhận ra Game of Life của Conway thiên về sóng hơn là dựa trên hạt
    Tức là trong CGoL, các quy tắc được áp dụng cho các vị trí trên lưới, chứ không phải cho các vật thể di chuyển ngang qua lưới. Tôi tự hỏi liệu hệ thống này có thể được xây dựng theo cách dựa trên sóng không
    Ngoài ra, trong hệ thống này, ở mỗi frame mọi hạt đều tác động lên nhau bất kể khoảng cách, nên có vẻ như tốc độ ánh sáng là vô hạn. Trong khi đó CGoL có một dạng tốc độ ánh sáng, vì mỗi ô ở mỗi frame chỉ có thể ảnh hưởng tới các ô lân cận trực tiếp
  • Tôi đang xem phiên bản JS 3D, và có lẽ đây là thứ tôi thích nhất kể từ Game of Life của Conway nguyên bản hoặc screensaver Primordial Life của thập niên 90
    Không biết bạn có từng nghĩ đến việc thêm hỗ trợ shader không. Tôi muốn xem một phiên bản chậm hơn và có cảm giác “vón cục” hơn ở chế độ toàn màn hình
    Có lẽ nó sẽ biến chiếc Mac của tôi thành máy sưởi, nhưng lúc này đó lại là ưu điểm ;)
  • Gợi tôi nhớ đến Swarm Chemistry của Hiroki Sayama
    https://www.youtube.com/watch?v=BpN-DE3o6u8
    https://bingdev.binghamton.edu/sayama/SwarmChemistry/
  • Nếu bạn quan tâm hơn đến những thứ kiểu này, tôi khuyên xem Smooth-lifeLenia
    Riêng Lenia có vài biến thể phức tạp hơn; liên quan đến chủ đề này thì tôi nghĩ đến “Flow Lenia” hoặc “Particle Lenia”