Công nghệ "Particle Life"
(github.com/hunar4321)- 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.exetrong 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++, JavaScript và Python
- 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
projectGeneratorcủ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
canvas500x500 atomđược tạo như một object cóx,y,vx,vy,color- Hàm
createtạ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ảngatoms 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
dgiữ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ị
gquyết định quy tắc hút hoặc đẩy giữa các nhóm màu
- Chỉ áp dụng lực khi khoảng cách
- 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
Các ý kiến trên Hacker News
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
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
Cái này thật sự vui. Có nhiều chuyển động và hình dạng cũng đẹp
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
Đ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
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ị
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
Nếu quan tâm thì ở đây: https://github.com/jasonjmcghee/compute-shaders
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
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 ;)
https://www.youtube.com/watch?v=BpN-DE3o6u8
https://bingdev.binghamton.edu/sayama/SwarmChemistry/
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”