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

这篇具有很好参考价值的文章主要介绍了Particle Life粒子生命演化的MATLAB模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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的函数。

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

当距离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时,粒子间呈现出排斥的现象:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
当F>0时,粒子间呈现出吸引的现象:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命

1.2 距离rmax影响

这里画布大小都定义为1。
当rmax=0.2时,粒子的汇集效果如下:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
当rmax=0.5时,粒子的汇集效果更全局化:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命

2 多种粒子相互作用

2.1 双种粒子作用

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

A B
A F_AA F_AB
B F_BA F_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粒子。
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
再添加两个规则给粒子B,粒子B之间会弱吸引,但粒子B排斥粒子A。此时由于粒子AB间一个吸引一个排斥,构成了不断向前运动的追逐系统。
[ 1 − 1 0.5 0.5 ] \begin{bmatrix} 1 &-1 \\ 0.5&0.5 \end{bmatrix} [10.510.5]
追逐模型如下:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
之后多种粒子之间的运动规律,也是由上述各个规则叠加演化而成。
但是由于规则数量等于粒子种类N的平方,比如3种粒子就有9种粒子间规则,4种粒子就有16种粒子间规则。这就导致复杂性暴增,产生了无穷多的变化。

2.1 多种粒子作用

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

下面列举一些演示计算结果
三种粒子,细胞图案:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
三种粒子,岛屿图案:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命

三种粒子,循环捕食图案:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命
5种粒子的交互作用,呈现出一定的结构:
Particle Life粒子生命演化的MATLAB模拟,matlab,Particle Life,粒子人生,粒子生命

3 代码

上面绘图代码见文末。

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

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

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

图像刷新频率FrameFreq是用来控制多少个时间步显示一次。一般选择2就行,太大会有卡顿的感觉。文章来源地址https://www.toymoban.com/news/detail-682823.html

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:NColor
    ColorP(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/2
    VXY_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 off
        pause(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);
end

function [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;%赋值为0
    XYindx1=[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+1
    XYindx1=[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;%赋值为0
    XYindx1=[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+1
    XYindx1=[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模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详解Unity中的粒子系统Particle System (二)

    上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指

    2024年01月17日
    浏览(48)
  • 详解Unity中的粒子系统Particle System (十一)

    今天讲最后一个模块——External Forces,该模块需要和Force Field组件配合使用,作用是模拟物理的力对粒子的影响。至此,Unity内置粒子系统的最后一块物理砖补齐,理论上来讲我们已经可以通过粒子系统来模拟世间万物了。废话不多说,进入正题。 本系列提要 Unity粒子系统专

    2024年02月13日
    浏览(36)
  • 详解Unity中的粒子系统Particle System (三)

    上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission、Shape、Renderer模块又在粒子系统中扮演着怎么样的作用吧。 本系列提要 Unity粒子系统专题博客共分成十二篇来讲解: 【本篇为第三篇】

    2024年02月02日
    浏览(42)
  • MATLAB智能优化算法 - 粒子群算法及MATLAB实例仿真

    粒子群算法来源于鸟类集体活动的规律性,进而利用群体智能建立简化模型。它模拟的是鸟类的觅食行为,将求解问题的空间比作鸟类飞行的时间,每只鸟抽象成没有体积和质量的粒子,来表征一个问题的可行解。 粒子群算法首先在给定的解空间中随机初始化粒子群,待优化

    2023年04月17日
    浏览(288)
  • Matlab中实现粒子群算法

    目录 1.粒子群的自己写的代码 c1:个体学习因子,也称为个体加速因子。         惯性权重w一般取0.9-1.2较为合适,一般取0.9。       2014b之后才推出     代码实现 求解函数y = x1^2+x2^2-x1*x2-10*x1-4*x2+60在[-15,15]内的最小值(最小值为8) 结果为 x =     8.0000    6.0000 fval =    

    2024年02月10日
    浏览(48)
  • 粒子群算法 PSO(Particle Swarm Optimization)——原理及实现

    粒子群优化算法(PSO:Particle swarm optimization)是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广

    2024年02月05日
    浏览(36)
  • 自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 下面是一个关于自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO)的博客,希望可以帮助您。 提示:以下是本篇文章正文内容,下面案例可供参考 自

    2024年02月03日
    浏览(39)
  • 用Unity来下一场雪吧——Particle System 下雪粒子特效

    一 制作下雪粒子特效 1 添加Particle System (1)Hierarchy窗口右键 Effects Particle System  (2)新建一块Plane作为地面,并且把Particle Syetem位置移到Plane上方。 (3)旋转Directional Light,使背景变暗(随意即可),便于观察。 2 设置Shape模块 Shape模块定义粒子发射器的形状,可提供沿着该形状表面法

    2023年04月16日
    浏览(33)
  • Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战

    粒子群算法(PSO算法) 粒子群算法,又称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(Evolutionary Algorithm - EA),由Eberhart 博士和Kennedy 博士于1995年提出,其源于对鸟群捕食的行为研究。 PSO模拟鸟群的捕食行为。 设想这样一

    2024年02月16日
    浏览(35)
  • Flutter Widget Life Cycle 组件生命周期

    了解 widget 生命周期,对我们开发组件还是很重要的。 今天会把无状态、有状态组件的几个生命周期函数一起过下。 原文 https://ducafecat.com/blog/flutter-widget-life-cycle https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html 无状态组件

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包