Swarm Flocking 经典蜂拥模型大全

1. Reynold Boid 模型

  Boid 模型是 Reynold 在1986 年建立的一个用来模拟群体行为的空间模型,是首次针对蜂拥运动提出的著名模型。在该模型中定义了三个基本规则:

i)分离(Separation),即每个个体受到其邻域内的其他个体的排斥力的矢量和,以避免和附近的智能体碰撞。

ii)聚合(Cohesion),即每个个体受到其邻域内的其他个体的吸引力的矢量和,以保持整个团队的紧凑。

iii)速度匹配(Alignment),即让每个个体与其邻域内的其他个体的平均速度保持一致,最终使整个团队的速度趋于一致。

  在此三条规则的基础上,诸多学者对蜂拥运动展开了深入研究。


2. Vicsek 模型

2.1 参考文献

Vicsek, Tamás, et al. “Novel type of phase transition in a system of self-driven particles.” Physical review letters 75.6 (1995): 1226.

2.2 模型定义

  在 Vicsek 模型对中,群体中的个体可以与其周围半径为 r r r内的其他个体相互作用,在仿真开始时,个体位置和速度随机分布,并且每个个体运动速度均为 v v v且一直保持不变,每一步的仿真时间为 Δ t \Delta_{t} Δt,则个体的位置更新可以表示为:
x i ( t + 1 ) = x i ( t ) + v i ( t ) Δ t x_i(t+1)=x_i(t)+v_i(t)\Delta_{t} xi(t+1)=xi(t)+vi(t)Δt
角度的更新可以表示为:
θ i ( t + 1 ) = ⟨ θ ) ⟩ r + Δ θ \theta_i(t+1)=\left\langle {\theta)} \right\rangle_r +\Delta{\theta} θi(t+1)=θ)r+Δθ
其中 ⟨ θ ( t ) ⟩ r \left\langle {\theta(t)} \right\rangle_r θ(t)r表示在个体 i i i通信范围 r r r内群体中个体的平均速度(包含个体 i i i)。平均方向角由 a r c t a n [ ⟨ s i n ( θ ( t ) ) ⟩ r / ⟨ c o s ( θ ( t ) ) ⟩ r ] arctan[\left\langle {sin(\theta(t))} \right\rangle_r/ \left\langle {cos(\theta(t))} \right\rangle_r] arctan[sin(θ(t))r/cos(θ(t))r]。其中 Δ θ \Delta{\theta} Δθ表示噪音,是以均匀概率随机从 [ − η / 2 , η / 2 ] [-\eta/2,\eta/2] [η/2,η/2]中取得的。同时还有三个随机参数: η \eta η ρ \rho ρ v v v,其中 v v v是粒子在两次相邻步长之间个体运动的距离。

3. Cucker-Smale 模型

3.1 参考文献

Cucker, Felipe, and Steve Smale. “Emergent behavior in flocks.” IEEE Transactions on automatic control 52.5 (2007): 852-862.

3.2 模型定义

  Cucker-Smale 模型与上面的 Vicsek 模型相似,但是该模型提供了详细的收敛性证明。在该模型中位置更新函数如下:
x i ( t + 1 ) = x i ( t ) + v i ( t ) Δ t x_i(t+1)=x_i(t)+v_i(t)\Delta_{t} xi(t+1)=xi(t)+vi(t)Δt
使用速度更新函数代替 Vicsek 模型中的角度更新函数
v i ( t + 1 ) − v i ( t ) = ∑ j = 1 k a i j ( v j ( t ) − v i ( t ) ) {{v}_{i}}(t+1)-{{v}_{i}}(t)=\sum\limits_{j=1}^{k}{{{a}_{ij}}({{v}_{j}}(t)-{{v}_{i}}(t))} vi(t+1)vi(t)=j=1kaij(vj(t)vi(t))
其中 a i j a_{ij} aij是与个体 i i i和个体 i i i位置相关的函数
a i j = η ∥ x i − x j ∥ 2 {{a}_{ij}}\text{=}\eta {{\left\| {{x}_{i}}-{{x}_{j}} \right\|}^{2}} aij=ηxixj2
η ( y ) \eta(y) η(y)是递减函数
η ( y ) = K ( σ 2 + y ) β \eta (y)=\frac{K}{{{({{\sigma }^{2}}+y)}^{\beta }}} η(y)=(σ2+y)βK


3. Couzin模型

3.1 参考文献

Couzin, Iain D. , et al. “Collective Memory and Spatial Sorting in Animal Groups.” Journal of Theoretical Biology 218.1(2002):1-11.

3.2 模型定义

在这里插入图片描述
  个体在原点中心处,并将其周围空间划分为三个区域: z o r zor zor = 排斥区, z o o zoo zoo = 速度匹配区, z o a zoa zoa = 吸引区。同时改模型还考虑个体的“盲区”,其位于个体背后,即个体只能感知 α \alpha α范围内的信息。

3.3 控制规律

  该模型控制分为三个阶段分别对应于 z o r zor zor z o o zoo zoo z o a zoa zoa 三个区域。其中优先级最高的为 z o r zor zor

1)当个体 i i i视野内的 z o r zor zor区域内有个体时,(忽略背后360- α \alpha α范围内的个体),其受到 z o r zor zor区域内个体的排斥,则下一时刻的速度可以表示为:

d r ( t + τ ) = − ∑ j ≠ i n r r i j ( t ) ∣ r i j ( t ) ∣ {{d}_{r}}(t+\tau )=-\sum\limits_{j\ne i}^{{{n}_{r}}}{\frac{{{r}_{ij}}(t)}{|{{r}_{ij}}(t)|}} dr(t+τ)=j=inrrij(t)rij(t)

其中 r i j = c j − c i c j − c i ∣ r_{ij}=\frac{c_j-c_i}{c_j-c_i|} rij=cjcicjci c i c_i ci c j c_j cj分别表示个体 i i i j j j的位置矢量, n r n_r nr表示位于个体 i i i z o r zor zor区域内的其他个体的数量。

2)当个体 i i i视野内的 z o r zor zor区域内没有其他个体时,即 n r = 0 n_r=0 nr=0,这时个体对 z o o zoo zoo z o a zoa zoa 区域中的个体做出反应。

  • 对于 z o o zoo zoo区域内个体:

d o ( t + τ ) = − ∑ j ≠ i n o v j ( t ) ∣ v j ( t ) ∣ {{d}_{o}}(t+\tau )=-\sum\limits_{j\ne i}^{{{n}_{o}}}{\frac{{{v}_{j}}(t)}{|{{v}_{j}}(t)|}} do(t+τ)=j=inovj(t)vj(t)

  • 对于 z o a zoa zoa区域内个体:

d a ( t + τ ) = − ∑ j ≠ i n a r i j ( t ) ∣ r i j ( t ) ∣ {{d}_{a}}(t+\tau )=-\sum\limits_{j\ne i}^{{{n}_{a}}}{\frac{{{r}_{ij}}(t)}{|{{r}_{ij}}(t)|}} da(t+τ)=j=inarij(t)rij(t)

其中 n o n_o no n a n_a na分别为位于个体 i i i z o o zoo zoo z o a zoa zoa 区域中的个体的数量, v j v_j vj表示个体 j j j的速度矢量。

  最终下一时刻个体 i i i的期望速度 d i ( t + τ ) d_i(t+\tau) di(t+τ)定义为:
1)若 z o r zor zor区域内有其他个体,即 n r ≠ 0 n_r \ne 0 nr=0,则
d i ( t + τ ) = d r ( t + τ ) d_i(t+\tau)=d_r(t+\tau) di(t+τ)=dr(t+τ)
2)若 z o r zor zor区域内没有其他个体,即 n r = 0 n_r=0 nr=0,则:

  • z o o zoo zoo区域内有其他个体, z o a zoa zoa区域内没有,即 n o ≠ 0 n_o \ne0 no=0 n a = 0 n_a=0 na=0,则
    d i ( t + τ ) = d o ( t + τ ) d_i(t+\tau)=d_o(t+\tau) di(t+τ)=do(t+τ)
  • z o a zoa zoa区域内有其他个体, z o o zoo zoo区域内没有,即 n a ≠ 0 n_a \ne0 na=0 n o = 0 n_o=0 no=0,则
    d i ( t + τ ) = d a ( t + τ ) d_i(t+\tau)=d_a(t+\tau) di(t+τ)=da(t+τ)
  • z o o zoo zoo区域和内 z o a zoa zoa曲云均有其他个体,即 n o ≠ 0 n_o \ne0 no=0 n a ≠ 0 n_a \ne0 na=0,则
    d i ( t + τ ) = 1 2 [ d o ( t + τ ) + d a ( t + τ ) ] d_i(t+\tau)=\frac{1}{2}[d_o(t+\tau)+d_a(t+\tau)] di(t+τ)=21[do(t+τ)+da(t+τ)]

确定下一时刻的期望速度 d i ( t + τ ) d_i(t+\tau) di(t+τ)后,个体 i i i在下一时刻从当前速度 v i ( t ) v_i(t) vi(t)向速度 d i ( t + τ ) d_i(t+\tau) di(t+τ)转动角度 θ \theta θ,得到下一时刻速度 v i ( t + τ ) v_i(t+\tau) vi(t+τ),这里的 θ \theta θ应该小于最大转动角度 θ τ \theta_{\tau} θτ。至此,该模型建立完毕。


4. Gábor Vásárhelyi模型

4.1 参考文献

Vásárhelyi Gábor, et al. “Optimized flocking of autonomous drones in confined environments.” Science Robotics 3.20(2018):eaat3536-.

4.2 模型定义

一个可调的自推植绒模型

4.2.1 排斥速度 Repulsion

  当个体 i i i与其周围的个体 j j j的距离小于距离阈值 r 0 r e p r^{rep}_0 r0rep时,个体 j j j对个体 i i i产生排斥速度项。个体 i i i周围 r 0 r e p r^{rep}_0 r0rep距离内没有其他个体时,该项为0。则排斥速度项定义如下:
v i j r e p = { p r e p ⋅ ( r 0 r e p − r i j ) ⋅ r i − r j r i j i f   r i j < r 0 r e p 0 o t h e r w i s e v_{ij}^{rep}=\left\{ \begin{matrix} {{p}^{rep}}\cdot (r_{0}^{rep}-{{r}_{ij}})\cdot \frac{{{r}_{i}}-{{r}_{j}}}{{{r}_{ij}}} & if\text{ }{{r}_{ij}}<r_{0}^{rep} \\ 0 & otherwise \\ \end{matrix} \right. vijrep={prep(r0reprij)rijrirj0if rij<r0repotherwise
其中 v i j r e p v_{ij}^{rep} vijrep为个体 i i i收到个体 j j j的影响产生的速度项, p r e p p^{rep} prep为排斥速度项的增益系数(线性增益)。

  如下图所示,左边蓝色斜线为 v i j r e p v_{ij}^{rep} vijrep在参数 r = 10 r=10 r=10 p = 1 p=1 p=1 v = 10 v=10 v=10时的的排斥速度项。

在这里插入图片描述
因此,个体 i i i最终排斥速度项定义如下:
v i r e p = ∑ j ≠ i v i j r e p v_{i}^{rep}=\sum\limits_{j\ne i}{v_{ij}^{rep}} virep=j=ivijrep

4.2.2 速度对齐项 Velocity alignment term

  以往的工作通常使用幂律函数,使个体与群体内其他个体的速度差在空间中渐近衰减为零。这些模型在较低速度范围内的某些特定条件下可以正常工作。速度对齐项也必须充当阻尼介质,以减少由于对例如斥力的延迟和噪声导致的自激振荡现象。它必须是局部的,但同时还必须具有可扩展性,以适应较大的速度(因为可能存在较大的速度差异)。最后一个条件意味着如果限制了代理的加速度,则应在速度差较大时应该放宽制动距离,以避免碰撞。

  因此文中使用理想的制动曲线,即空间中平滑的速度衰减函数 D ( . ) D(.) D(.):在高速时保持恒定加速度,在低速时保持指数速度,其定义如下:
D ( r , a , p ) = { 0 i f   r ≤ 0 r p i f   0 < r p < a / p 2 a r − a 2 / p 2 o t h e r w i s e D(r,a,p)=\left\{ \begin{matrix} 0 & if\text{ }r\le 0 \\ rp & if\text{ }0<rp<a/p \\ \sqrt{2ar-{{a}^{2}}/{{p}^{2}}} & otherwise \\ \end{matrix} \right. D(r,a,p)=0rp2ara2/p2 if r0if 0<rp<a/potherwise
其中, r r r是代理与预期停止点之间的距离, a a a是首选加速度, p p p是线性增益, p p p还确定了减速的两个阶段之间的交叉点。

  速度对齐项的基本原理是禁止给定距离上的两个代理在此距离之外的速度差大于此理想制动曲线所允许的值,因此在其他基于瞬时力的方程式中用作运动规划项,该项定义如下:

v i j f r i c t max ⁡ = max ⁡ ( v f r i c t , D ( r i j − r 0 f r i c t , a f r i c t , p f r i c t ) ) v_{ij}^{frict\max }=\max ({{v}^{frict}},D({{r}_{ij}}-r_{0}^{frict},{{a}^{frict}},{{p}^{frict}})) vijfrictmax=max(vfrict,D(rijr0frict,africt,pfrict))

v i j f r i c t = { c f r i c t ( v i j − v i j f r i c t max ⁡ ) ⋅ v i − v j v i j if  v i j > v i j f r i c t max ⁡ 0 otherwise v_{ij}^{frict}=\left\{ \begin{matrix} {{c}^{frict}}({{v}_{ij}}-v_{ij}^{frict\max })\cdot \frac{{{v}_{i}}-{{v}_{j}}}{{{v}_{ij}}} & \text{if }{{v}_{ij}}>v_{ij}^{frict\max } \\ 0 & \text{otherwise} \\ \end{matrix} \right. vijfrict={cfrict(vijvijfrictmax)vijvivj0if vij>vijfrictmaxotherwise

  在上面的等式中, C f r i c t C^{frict} Cfrict是速度对准误差减小的线性系数; v f r i c t v^{frict} vfrict是速度松弛,以允许一定量的速度差,而与代理之间的距离无关, r 0 f r i c t r^{frict}_0 r0frict是代理 i i i与个体 j j j相关且还没有到达个体 j j j所在位置的停止点的距离。 p f r i c t p^{frict} pfrict a f r i c t a^{frict} africt是线性增益和对齐的加速度参数,并且 v i j = ∣ v i − v j ∣ v_{ij} = | v_i − v_j | vij=vivj是代理 i i i i i i之间的速度差值。 为代理 i i i计算的相对于其他代理的总速度对齐项(与排斥项类类似)似,其定义为:
v i f r i c t = ∑ j ≠ i v i j f r i c t v_{i}^{frict}=\sum\limits_{j\ne i}{v_{ij}^{frict}} vifrict=j=ivijfrict

4.2.3 墙壁和障碍物的作用 Interaction with walls and obstacles

  文章使用竞技台对群体进行吸引和约束,并替代了传统群体对群体的吸引力。群体中的个体朝着竞技场飞行,进入竞技场后个体受到竞技场墙壁的排斥力,以确保个体在竞技场内运动。
v i s s h i l l m a x = D ( r i s , r 0 s h i l l , a s h i l l , p s h i l l ) v^{shillmax}_{is}=D(r_{is},r^{shill}_0,a^{shill},p^{shill}) visshillmax=D(ris,r0shill,ashill,pshill)

v i j w a l l = v i j f r i c t ( C − 1 ) = { ( v i s − v i s s h i l l max ⁡ ) ⋅ v i − v s v i s if  v i s > v i s s h a l l max ⁡ 0 otherwise (9) \begin{aligned} & v_{ij}^{wall}=v_{ij}^{frict}(C-1) \\ & =\left\{ \begin{matrix} ({{v}_{is}}-v_{is}^{shill\max })\cdot \frac{{{v}_{i}}-{{v}_{s}}}{{{v}_{is}}} & \text{if }{{v}_{is}}>v_{is}^{shall\max } \\ 0 & \text{otherwise} \\ \end{matrix} \right. \end{aligned} \tag{9} vijwall=vijfrict(C1)={(visvisshillmax)visvivs0if vis>visshallmaxotherwise(9)
  其中不允许壁的速度松弛,因此将误差比例项( C s h i l l C^{shill} Cshill)保持为1,以实现最强的墙壁对齐。在上面的等式中, s s s是指分别为所有墙多边形边缘定义的代理; r i s = ∣ r i − r s ∣ r_{is} = | r_i-r_s | ris=rirs,其中 r s r_s rs是墙壁代理的位置,位于任意形状的凸壁多边形的边缘,且相对于代理 i i i的最近点; v i s = ∣ v i − v s ∣ v_{is} = | v_i − v_s | vis=vivs,其中 v s v_s vs是竞技场代理的速度,垂直于竞技场指向内部,幅度为 v s h i l l v^{shill} vshill

  可以使用相同的概念来避免在竞技场内出现凸形障碍物,但是与上文针对竞技场所描述的不同,这里代理需要远离障碍物而不是向其内移动。另一个区别是,所有竞技场的墙壁会在其内部生成一个分离的代理,但障碍物却是在障碍物靠近个体 i i i的表面生成一个代理。因此,对于每个智能体 i i i和障碍物 s s s,我们都可以定义速度分量障碍,其类似于方程式 9,使用与竞技场相同的参数。

4.2.4 自推进项 Self-propelling term

  该项保证个体 i i i可以一直保持在运动状态,与实际速度方向 v i v_i vi相同,其大小为固定值 v f l o c k v^{flock} vflock

4.2.5 最终速度

  最终个体 i i i的期望速度综合上述各项,其定义为:
v ~ i d = v i ∣ v i ∣ v f l o c k + v i r e p + v i f r i c t + ∑ s v i s w a l l + ∑ s v i s o b s t a c l e \tilde{v}_{i}^{d}=\frac{{{v}_{i}}}{\left| {{v}_{i}} \right|}{{v}^{flock}}+v_{i}^{rep}+v_{i}^{frict}+\sum\limits_{s}{v_{is}^{wall}}+\sum\limits_{s}{v_{is}^{obstacle}} v~id=vivivflock+virep+vifrict+sviswall+svisobstacle

除此之外,最终速度仍需满足约束条件,即,引入速度限制 v m a x v^{max} vmax如果超出极限,则减小其大小:
v i d = v ~ i d ∣ v ~ i d ∣ ⋅ min ⁡ { ∣ v ~ i d ∣ , v max ⁡ } v_{i}^{d}=\frac{\tilde{v}_{i}^{d}}{\left| \tilde{v}_{i}^{d} \right|}\cdot \min \{\left| \tilde{v}_{i}^{d} \right|,{{v}^{\max }}\} vid=v~idv~idmin{v~id,vmax}

<think>嗯,用户想了解蜂拥算法在Matlab中的实现。首先,我需要确认他们对蜂拥算法的基本概念是否清楚。蜂拥算法通常指的是模拟鸟群或鱼群等群体行为的算法,比如Boids模型。用户可能是学生或者研究人员,需要这方面的信息来做项目或者学习。 接下来,我得考虑蜂拥算法的核心要素,比如分离、聚合、对齐这三个规则。用户可能需要知道如何在Matlab中实现这些规则。Matlab处理矩阵运算方便,适合做这种多智能体的仿真。 然后,我应该分步骤解释实现过程。先初始化参数,比如智能体数量、速度、位置。然后,在每个时间步更新每个智能体的速度,考虑周围邻居的影响。需要计算邻居的距离,应用三个规则,调整速度,最后更新位置。 用户可能不熟悉如何具体编码,所以给出示例代码框架很重要。同时,提醒他们调整参数和规则权重,以达到不同的群体行为效果。可能还需要提到可视化部分,用plot或者动画来展示结果。 另外,用户可能遇到性能问题,比如智能体数量多时计算变慢,可以建议优化邻居检测,比如使用空间分割或者KD树。还要注意边界处理,避免智能体跑出视野范围。 最后,确保回答结构清晰,分步骤说明,代码示例正确,并给出参考资料或进一步学习的建议。这样用户能逐步理解和实现蜂拥算法,解决他们的问题。</think>蜂拥算法(Flocking Algorithm)是一种模拟群体行为(如鸟群、鱼群)的自组织算法。下面我将分步骤为您介绍其核心原理和MATLAB实现方法: 一、算法核心规则(Boids模型) 1. 分离(Separation):避免与邻近个体碰撞 2. 聚合(Cohesion):向邻近个体的平均位置移动 3. 对齐(Alignment):与邻近个体保持运动方向一致 二、MATLAB实现步骤 1. 初始化参数 ```matlab N = 50; % 个体数量 dt = 0.1; % 时间步长 max_speed = 2; % 最大速度 neighbor_radius = 3; % 邻居判定半径 % 初始化位置和速度 pos = rand(N,2)*20 - 10; % 二维位置[-10,10] vel = rand(N,2)*2 - 1; % 初始速度[-1,1] ``` 2. 主循环框架 ```matlab for t = 1:1000 new_vel = zeros(N,2); for i = 1:N % 寻找邻居 neighbors = findNeighbors(i, pos, neighbor_radius); % 计算三个规则 sep_force = separation(i, neighbors, pos); coh_force = cohesion(i, neighbors, pos); ali_force = alignment(i, neighbors, vel); % 速度合成 new_vel(i,:) = vel(i,:) + 0.5*sep_force + 0.3*coh_force + 0.2*ali_force; end % 更新状态 vel = limitSpeed(new_vel, max_speed); pos = pos + vel*dt; % 可视化 scatter(pos(:,1), pos(:,2), 'filled'); axis([-15 15 -15 15]); drawnow end ``` 3. 关键函数实现(示例) ```matlab function neighbors = findNeighbors(i, pos, radius) distances = vecnorm(pos - pos(i,:), 2, 2); neighbors = find(distances < radius & distances > 0); end function force = separation(i, neighbors, pos) if isempty(neighbors) force = [0 0]; return end diff = pos(i,:) - mean(pos(neighbors,:)); force = diff / norm(diff); end ``` 三、参数调整建议 1. 权重系数:分离(0.5) > 聚合(0.3) > 对齐(0.2) 2. 邻居半径建议为个体大小的3-5倍 3. 最大速度影响群体稳定性 四、典型应用场景 1. 无人机编队控制 2. 群体动画模拟 3. 多机器人协同 4. 交通流模拟 五、优化方向 1. 添加障碍物规避逻辑 2. 引入领导个体引导群体 3. 实现三维空间扩展 4. 优化邻居搜索算法(使用空间分割) 注意:完整实现需要补充所有规则函数和边界处理。建议从简单二维场景开始,逐步增加复杂度。MATLAB的向量化运算可显著提升大规模群体仿真的性能。 参考学习资料: 1. Craig Reynolds的原始Boids论文 2. MATLAB官方文档中的"Flocking Behavior in 2D"示例 3. 《Swarm Intelligence: From Natural to Artificial Systems》
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值