当前位置: 首页 > news >正文

Particle Life粒子生命演化的MATLAB模拟

Particle Life粒子生命演化的MATLAB模拟

  • 0 前言
  • 1 基本原理
    • 1.1 力影响-吸引排斥行为
    • 1.2 距离rmax影响
  • 2 多种粒子相互作用
    • 2.1 双种粒子作用
    • 2.1 多种粒子作用
  • 3 代码

惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此博客。所以如果有错误,欢迎在评论区指正,不胜感激。本文主要关注于算法的实现,对于实际应用等问题本人没有任何经验,所以也不再涉及。

请添加图片描述

0 前言

Particle Life粒子生命演化最早是2017年由数字艺术家Jeffery Ventrella定义的,通过非常简单方法的定义粒子间的作用力,从而产生非常复杂的变化。

最开始Jeffery Ventrella管这种生成方法叫做Clusters,其思想来源于生物学家Lynn Margulus。每个粒子具有不同的颜色,每个颜色代表一种属性。粒子不仅会受到自己颜色粒子的吸引或排斥,也会受到其它颜色粒子的吸引和排斥。

在不同的参数下,粒子间会发生复杂的相互运动,某些参数会呈现出复杂的固定斑图,某些参数会呈现出类似生物之间的集群、逃跑、捕食等各种行为。

章节安排为:第一章主要是讲解原理,第二章演示一些基本的例子,第三章给出了基于MATLAB的具体代码。

本文的参考文献如下:
[1]粒子生命演化:由数量庞大的单体粒子演化出复杂的群体行为逻辑
https://www.bilibili.com/video/BV1Dh4y1t7hn/
https://www.youtube.com/watch?v=p4YirERTVF0
[2]https://particle-life.com
[3]blender3.6模拟-粒子生命-Particle Life
https://www.bilibili.com/video/BV1Ns4y1B7Fu/

1 基本原理

首先,假设一群粒子A,它们互相会受到其它粒子的作用力。两个粒子间的力大小是粒子间距离r的函数。

请添加图片描述

当距离r较小,小于rmin时,设置了-1的排斥力,为防止粒子之间重合。当粒子距离在rmin和rmax之间,粒子最大作用力为Fi。当粒子距离超过rmax,设置作用力为0,防止计算量过大。

当然有几个细节点需要注意:

1粒子所受的作用力只遵循上面的力方程,但不一定遵循牛顿第三定理。粒子的速度和加速度通过牛二律F=ma得到。由于防止粒子运动过快,还需要在全场设置粘滞阻尼。所以其实牛顿第一定理也不满足。当然由于这并不是精准的模拟仿真,所以这些小事可以忽略。

2力Fi是可以自行设置的,当Fi<0,粒子间呈现出排斥性,当Fi>0,粒子间呈现出吸引性,一般不超过±2;

3距离rmin通常在rmax的1/4~1/5左右;rmax和画布大小有关,rmax越大,越会有全局的粒子参与,rmax越小,粒子的行为越局部。

1.1 力影响-吸引排斥行为

当F<0时,粒子间呈现出排斥的现象:
请添加图片描述
当F>0时,粒子间呈现出吸引的现象:
请添加图片描述

1.2 距离rmax影响

这里画布大小都定义为1。
当rmax=0.2时,粒子的汇集效果如下:
请添加图片描述
当rmax=0.5时,粒子的汇集效果更全局化:
请添加图片描述

2 多种粒子相互作用

2.1 双种粒子作用

对于两种粒子A和B,力Fi共有4个,分别为A对A之间的力,A对B之间的力,B对A之间的力和B对B之间的力。这4个力可以写为一个矩阵形式:

AB
AF_AAF_AB
BF_BAF_BB

当假设A对A存在吸引,且A还会吸引B。但是B没有反向作用A的力,B与B之间也不会互相作用。这里的矩阵可以写作:
[ 1 0 0.5 0 ] \begin{bmatrix} 1 &0 \\ 0.5&0 \end{bmatrix} [10.500]
此时得到的图形为细胞图案,A粒子在中间互相吸引到一团,周围吸引一圈B粒子。
请添加图片描述
再添加两个规则给粒子B,粒子B之间会弱吸引,但粒子B排斥粒子A。此时由于粒子AB间一个吸引一个排斥,构成了不断向前运动的追逐系统。
[ 1 − 1 0.5 0.5 ] \begin{bmatrix} 1 &-1 \\ 0.5&0.5 \end{bmatrix} [10.510.5]
追逐模型如下:
请添加图片描述
之后多种粒子之间的运动规律,也是由上述各个规则叠加演化而成。
但是由于规则数量等于粒子种类N的平方,比如3种粒子就有9种粒子间规则,4种粒子就有16种粒子间规则。这就导致复杂性暴增,产生了无穷多的变化。

2.1 多种粒子作用

由于规则的复杂性,每一次随机出的结果可能都是独一无二的,且是其它人都未曾见过的。这种随机性和复杂性正是Particle Life的迷人之处。

下面列举一些演示计算结果
三种粒子,细胞图案:
请添加图片描述
三种粒子,岛屿图案:
请添加图片描述

三种粒子,循环捕食图案:
请添加图片描述
5种粒子的交互作用,呈现出一定的结构:
请添加图片描述

3 代码

上面绘图代码见文末。

主要更改粒子数量N,颜色数量NColor即可。建议粒子数量N大概是500倍颜色数量。不易太多,由于MATLAB运行效率较低,所以按照实际电脑配置自行更改。

力的作用距离Rmax在最好是1/c的形式,c是一个整数。

迭代总步数StepMax越大,展示的时间越长。这个如果想长时间欣赏粒子间作用,可以选择一个比较大的数。

图像刷新频率FrameFreq是用来控制多少个时间步显示一次。一般选择2就行,太大会有卡顿的感觉。

clear
clc
close all
%Particle Life粒子生命 MATLAB代码%% 初始设定参数
%初始设定
rng('shuffle');%随机种子
N=1500;%粒子数量
NColor=3;%颜色数量
Ni=rand(NColor,1);Ni=round(Ni*N/sum(Ni));%随机分配每个颜色对应的粒子数量
N=sum(Ni);Rmax=1/5;%力作用的距离
mcp=hsv(40);colormap(mcp(1:32,:));%定义展示颜色
StepMax=1.2e3;%结束迭代时间步
FrameFreq=2;%刷新率,正整数,最小为1,越大图像刷新越慢
%% 其它默认参数
%绘图范围
Xlim=[0,1];
Ylim=[0,1];
%定义每个粒子颜色编号
ColorP=zeros(N,1);
for t=1:NColorColorP(1+sum(Ni(1:t-1)):sum(Ni(1:t)))=t;
end
%粒子的力关系矩阵
FMat=rand(NColor,NColor)*3-1.5;%所有力Fi在-1.5~1.5之间
%粒子坐标速度
XY_P=rand(N,2)*0.8+0.1;%所有粒子点坐标
VXY_P=zeros(N,2);%粒子点速度Rmin=Rmax/5;%粒子间的最小作用距离
MeshMax=1/Rmax;%网格数量
dt=5e-3;%时间精度%构建力函数
t=0;%初始时间
c=Rmax*15.0*sqrt(N);%阻尼,为了防止粒子运动速度太快%% 循环计算每一步迭代
tJ=0;%绘图计数
for kt=1:StepMax%计算点对应的网格XYindx=ceil(XY_P/Rmax);%循环计算每个点所受的力ForceP=zeros(N,2);for kp=1:N %循环每一个点%该点的颜色、坐标和网格Color_k=ColorP(kp,:);XY_k=XY_P(kp,:);XYindx_k=XYindx(kp,:);%计算周围点对该点的力F_k=FMat(Color_k,ColorP)';[Indx_t,XY_P_B,F_B]=Beside9(XYindx_k,XYindx,MeshMax,XY_P,F_k);%周边点索引ForceP_k=F_Func(XY_P_B-XY_k,F_B,Rmin,Rmax);ForceP(kp,:)=ForceP_k;end%增加阻尼项,和v相反ForceP=ForceP-c.*VXY_P;%根据F更新位移x和速度v。dv=at,dx=vt+at^2/2VXY_P_New=VXY_P+ForceP*dt;XY_P=XY_P+0.5*(VXY_P+VXY_P_New)*dt;VXY_P=VXY_P_New;%循环边界条件,如果超出边界,就移到另一端XY_P(XY_P>1)=XY_P(XY_P>1)-1;XY_P(XY_P<0)=XY_P(XY_P<0)+1;t=t+dt;%加一时间步if ~mod(kt,FrameFreq)f=figure(1);f.Color=[1,1,1];cla;scatter(XY_P(:,1),XY_P(:,2),6,ColorP,"filled");xlim([0,1]);ylim([0,1]);%set(gca,'XTick',[],'YTick',[])axis offpause(0.01)%每一帧图像停留时间tJ=tJ+1;end
end%% 后置函数
function Ft2=F_Func(xy,F,rmin,rmax)
%粒子左右函数
%xy,N行2列的向量,代表别的点距离O点的距离向量
%F,N行1列的向量,代表吸引力F大小
rmid=0.5*(rmax+rmin);
dmid=0.5*(rmax-rmin);
r=sqrt(xy(:,1).^2+xy(:,2).^2);%距离
%r(r==0)=rmax;
Ft=zeros(size(r));
%第一段
indx1=(r<rmin);
Ft(indx1)=r(indx1)/rmin-1;
%第二段
indx_last=~indx1;
indx2=indx_last&(r<rmid);
Ft(indx2)=F(indx2).*(r(indx2)-rmin)/dmid;
%第三段
indx3=(r>=rmid)&(r<rmax);
Ft(indx3)=-F(indx3).*(r(indx3)-rmax)/dmid;
%计算力向量
dir_xy=xy./r;
dir_xy(isnan(dir_xy))=0;
Ft_Vec=dir_xy.*(Ft*ones(1,2));
%计算合力
Ft2=sum(Ft_Vec,1);
endfunction [BesideIndx1,XY_P_B,F_P]=Beside9(XYindx0,XYindx1,NMesh,XY_P,F_P)
%寻找点0附近区域3×3共9格区域内
%开启循环边界条件%复制出边界点,然后再计算。因为有的点在rmax较大的循环边界条件,会同时向上和下吸引
if XYindx0(1)==1%把最后一列复制一份到前面indx_t=XYindx1(:,1)==NMesh;XYindx1_t=XYindx1(indx_t,:);XYindx1_t(:,1)=0;%赋值为0XYindx1=[XYindx1;XYindx1_t];XY_P=[XY_P;XY_P(indx_t,:)+[-1,0]];F_P=[F_P;F_P(indx_t)];
end
if XYindx0(1)==NMesh%把第一列复制一份到最后indx_t=XYindx1(:,1)==1;XYindx1_t=XYindx1(indx_t,:);XYindx1_t(:,1)=NMesh+1;%赋值为NMesh+1XYindx1=[XYindx1;XYindx1_t];XY_P=[XY_P;XY_P(indx_t,:)+[1,0]];F_P=[F_P;F_P(indx_t)];
end
if XYindx0(2)==1%把最后一行复制一份到前面indx_t=XYindx1(:,2)==NMesh;XYindx1_t=XYindx1(indx_t,:);XYindx1_t(:,2)=0;%赋值为0XYindx1=[XYindx1;XYindx1_t];XY_P=[XY_P;XY_P(indx_t,:)+[0,-1]];F_P=[F_P;F_P(indx_t)];
end
if XYindx0(2)==NMesh%把第一行复制一份到最后indx_t=XYindx1(:,2)==1;XYindx1_t=XYindx1(indx_t,:);XYindx1_t(:,2)=NMesh+1;%赋值为NMesh+1XYindx1=[XYindx1;XYindx1_t];XY_P=[XY_P;XY_P(indx_t,:)+[0,1]];F_P=[F_P;F_P(indx_t)];
end
%夹在范围之内的点有哪些
BesideIndx_X=(XYindx0(1)-1<=XYindx1(:,1))&(XYindx1(:,1)<=XYindx0(1)+1);
BesideIndx_Y=(XYindx0(2)-1<=XYindx1(:,2))&(XYindx1(:,2)<=XYindx0(2)+1);
BesideIndx1=BesideIndx_X & BesideIndx_Y;
XY_P_B=XY_P(BesideIndx1,:);
F_P=F_P(BesideIndx1);
end

相关文章:

Particle Life粒子生命演化的MATLAB模拟

Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明&#xff1a;本人没有相关的工程应用经验&#xff0c;只是纯粹对相关算法感兴趣才写此博客。所以如果有…...

golang中byte和rune的区别?

golang中byte和rune的区别&#xff1f; rune和byte在go语言中都是字符类型&#xff0c;从源码来看他们都是别名形式 // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned…...

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…...

MATLAB制图代码【第二版】

MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上&#xff0c;迭代出的第二版MATLAB制图代码&#xff0c;第二版的特点是…...

5.0: Dubbo服务导出源码解析

#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…...

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过&#xff1a;做自动化的首要本领就是要会 透过现象看本质 &#xff0c;落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情&#xff0c;必须要有扎实的计算机理论基础&#xff0c;才能看到深层次的本质东西。 …...

lodash 之 _.isEmpty

lodash.isEmpty() 是 Lodash 库中的一个函数&#xff0c;用于检查给定值是否为空。它可以用于判断对象、数组、字符串等不同类型的值是否为空。 const _ require(lodash);console.log(_.isEmpty(null)); // 输出: trueconsole.log(_.isEmpty(undefined)); // 输出: trueconso…...

layui数据表格实现表格中嵌套表格,并且可以折叠展开

效果&#xff1a; 思路&#xff1a; 1、最外层的表格先渲染&#xff0c;在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。 tr的class和table的id需要用索引 i 关联 //向每一行tr后面追加显示子table的trlet trEles $(".layui-table-view[lay-idlist] tbody tr&…...

云端笔记系统-自动化测试

文章目录 1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计【云端笔记】自动化测试用例3.1. 准备工具类3.2. 测试注册页面3.3. 测试登陆页面3.4. 测试添加博客页3.5. 测试我的博客列表页3.6. 测试修改博客页3.7. 测试博客列表页3.8. 测试博客详情页3.9. …...

将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众

将帅要避免五个方面的弱点&#xff1a;蛮干、怕死、好名、冲动、溺爱民众 【安志强趣讲《孙子兵法》第28讲】 【原文】 是故屈诸侯者以害&#xff0c;役诸侯者以业&#xff0c;趋诸侯者以利。 【注释】 趋&#xff1a;归附、依附。 【趣讲白话】 所以&#xff0c;用祸患威逼诸侯…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆...

vue的第3篇 第一个vue程序

一 vue的mvvm实践者 1.1 介绍 Model&#xff1a;模型层&#xff0c; 在这里表示JavaScript对象 View&#xff1a;视图层&#xff0c; 在这里表示DOM(HTML操作的元素) ViewModel&#xff1a;连接视图和数据的中间件&#xff0c; Vue.js就是MVVM中的View Model层的实现者 在M…...

线性求逆元

先暴力求出 1 n ! \frac 1 {n!} n!1​往回推出 1 i ! \frac 1 {i!} i!1​ 1 i ( i − 1 ) ! i ! \Large \frac 1 i\frac{(i-1)!}{i!} i1​i!(i−1)!​...

第一章 USB应用笔记之USB初步了解

USB应用笔记之USB初步了解 文章目录 USB应用笔记之USB初步了解前言USB的优点&#xff1a;USB版本发展USB速度以及电气接口USB传输过程USB开发抓包工具&#xff1a;USB传输方式1.控制传输特点:2.中断传输的特点3. 批量传输的特点4.实时传输&#xff08;同步传输&#xff09;的特…...

小白入门python

建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本&#xff0c;记得配置系统环境变量&#xff0c;python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.17集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...

Adobe Illustrator 2023 for mac安装教程,可用。

Adobe Illustrator 是行业标准的矢量图形应用程序&#xff0c;可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作&#xff0c;从网页图标和产品包装到书籍插图和广告牌。此版本是2023版本&#xff0c;适配…...

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…...

Spark-Core核心算子

文章目录 一、数据源获取1、从集合中获取2、从外部存储系统创建3、从其它RDD中创建4、分区规则—load数据时 二、转换算子(Transformation)1、Value类型1.1 map()_1.2 mapPartitions()1.3 mapPartitionsWithIndex(不常用)1.4 filterMap()_扁平化&#xff08;合并流&#xff09;…...

Linux和Windows下防火墙、端口和进程相关命令

&#x1f680;1 防火墙 1.1 firewall systemctl stop firewalld.service # 关闭防火墙 systemctl start firewalld.service # 开启防火墙 systemctl restart firewalld.service # 重启防火墙 systemctl status firewalld.service # 防火墙状态 firewall-cmd --reload # 重…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...