实现Boids模型的Python代码
时间: 2024-03-07 15:49:56 浏览: 42
好的,下面是一个基本的Boids模型的Python代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 设置模拟参数
num_boids = 50 # 粒子数
max_speed = 0.03 # 最大速度
max_force = 0.05 # 最大受力
neighborhood_radius = 0.2 # 邻域半径
separation_distance = 0.05 # 分离距离
alignment_distance = 0.1 # 对齐距离
cohesion_distance = 0.2 # 凝聚距离
# 初始化粒子位置和速度
positions = np.random.rand(num_boids, 2)
velocities = np.random.rand(num_boids, 2) * max_speed
# 模拟循环
for i in range(1000):
# 计算邻域距离
distances = np.sqrt(np.sum(np.square(positions[:, np.newaxis, :] - positions), axis=-1))
neighbors = np.logical_and(distances > 0, distances < neighborhood_radius)
# 计算三个力
separation = np.zeros_like(positions)
alignment = np.zeros_like(positions)
cohesion = np.zeros_like(positions)
for j in range(num_boids):
# 计算分离力
separation_vector = positions[j] - positions[neighbors[j]]
separation_distance_mask = np.linalg.norm(separation_vector, axis=-1) < separation_distance
separation_vector = separation_vector[separation_distance_mask]
separation[j] = np.sum(separation_vector, axis=0)
# 计算对齐力
alignment_vectors = velocities[neighbors[j]]
alignment_distance_mask = np.linalg.norm(separation_vector, axis=-1) < alignment_distance
alignment_vectors = alignment_vectors[alignment_distance_mask]
alignment[j] = np.sum(alignment_vectors, axis=0)
# 计算凝聚力
cohesion_vectors = positions[neighbors[j]]
cohesion_distance_mask = np.linalg.norm(separation_vector, axis=-1) < cohesion_distance
cohesion_vectors = cohesion_vectors[cohesion_distance_mask]
cohesion[j] = np.sum(cohesion_vectors, axis=0)
# 计算总受力
total_force = separation + alignment + cohesion
total_force = np.clip(total_force, -max_force, max_force)
# 更新速度和位置
velocities += total_force
velocities = np.clip(velocities, -max_speed, max_speed)
positions += velocities
# 绘制粒子
plt.clf()
plt.scatter(positions[:, 0], positions[:, 1], s=5)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.pause(0.01)
```
这段代码使用numpy和matplotlib库实现了一个简单的Boids模型,包括分离力、对齐力和凝聚力。在模拟循环中,首先计算每个粒子的邻域距离,然后根据邻域距离计算三个力,并计算总受力。最后,更新速度和位置,并绘制粒子的位置。