大雁飞行模拟 - 基于Agent的建模

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import random

class Goose:
    def __init__(self, x, y, vx, vy, perception_radius=2):
        self.position = np.array([x, y], dtype=float)
        self.velocity = np.array([vx, vy], dtype=float)
        self.perception_radius = perception_radius
        self.max_speed = 0.5
        self.alignment_factor = 0.05
        self.cohesion_factor = 0.005
        self.separation_factor = 0.05
        
    def update(self, flock):
        # 获取邻近的大雁
        neighbors = self.get_neighbors(flock)
        
        if len(neighbors) > 0:
            # 对齐行为:与邻近大雁的平均方向保持一致
            alignment = self.align(neighbors)
            # 凝聚行为:向邻近大雁的中心移动
            cohesion = self.cohere(neighbors)
            # 分离行为:避免与邻近大雁太近
            separation = self.separate(neighbors)
            
            # 更新速度
            self.velocity += alignment + cohesion + separation
            
            # 限制速度
            speed = np.linalg.norm(self.velocity)
            if speed > self.max_speed:
                self.velocity = self.velocity / speed * self.max_speed
        
        # 更新位置
        self.position += self.velocity
        
        # 边界处理 - 如果飞出边界则从另一侧进入
        if self.position[0] > 20:
            self.position[0] = -20
        elif self.position[0] < -20:
            self.position[0] = 20
            
        if self.position[1] > 20:
            self.position[1] = -20
        elif self.position[1] < -20:
            self.position[1] = 20
    
    def get_neighbors(self, flock):
        neighbors = []
        for goose in flock:
            if goose != self:
                distance = np.linalg.norm(goose.position - self.position)
                if distance < self.perception_radius:
                    neighbors.append(goose)
        return neighbors
    
    def align(self, neighbors):
        # 计算邻近大雁的平均速度方向
        avg_velocity = np.zeros(2)
        for goose in neighbors:
            avg_velocity += goose.velocity
        avg_velocity /= len(neighbors)
        
        # 返回对齐力
        return (avg_velocity - self.velocity) * self.alignment_factor
    
    def cohere(self, neighbors):
        # 计算邻近大雁的中心位置
        center = np.zeros(2)
        for goose in neighbors:
            center += goose.position
        center /= len(neighbors)
        
        # 返回向中心移动的力
        return (center - self.position) * self.cohesion_factor
    
    def separate(self, neighbors):
        # 计算避免碰撞的力
        move_away = np.zeros(2)
        for goose in neighbors:
            diff = self.position - goose.position
            distance = np.linalg.norm(diff)
            if distance > 0:
                move_away += diff / (distance ** 2)  # 距离越近,分离力越大
        
        return move_away * self.separation_factor

class Flock:
    def __init__(self, num_geese=20):
        self.geese = []
        for _ in range(num_geese):
            x = random.uniform(-10, 10)
            y = random.uniform(-10, 10)
            vx = random.uniform(-0.1, 0.1)
            vy = random.uniform(-0.1, 0.1)
            self.geese.append(Goose(x, y, vx, vy))
    
    def update(self):
        for goose in self.geese:
            goose.update(self.geese)

# 创建大雁群
flock = Flock(30)

# 设置动画
fig, ax = plt.subplots(figsize=(10, 8))
ax.set_xlim(-20, 20)
ax.set_ylim(-20, 20)
ax.set_title('大雁飞行模拟 - 基于Agent的建模')
ax.set_xlabel('X坐标')
ax.set_ylabel('Y坐标')

# 绘制大雁的箭头
quiver = ax.quiver([], [], [], [], color='blue', scale=10)

def update(frame):
    flock.update()
    
    # 更新箭头数据
    positions = np.array([goose.position for goose in flock.geese])
    velocities = np.array([goose.velocity for goose in flock.geese])
    
    quiver.set_offsets(positions)
    quiver.set_UVC(velocities[:, 0], velocities[:, 1])
    
    return quiver,

# 创建动画
ani = FuncAnimation(fig, update, frames=200, interval=50, blit=True)

plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 如果需要保存动画,取消下面的注释
# ani.save('goose_flock_simulation.gif', writer='pillow', fps=20)

先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值