仿真鸟群-Python实现(Win11)

类鸟群Boids——仿真鸟群 (python实现添加个体、驱散、避障等) 工作原理 :       模拟类鸟群的三大核心规则如下:       1)分离:保持类鸟个体之间的最小距离;       2)列队:让每个类鸟个体指向其局部同伴的平均移动方向;       3)内聚:让每个类鸟个体朝其局部同伴的质量中心移动。类鸟群模拟也可以添加其他规则,如避开障碍物,或受到打扰时驱散鸟群等...分析:    对于群体中的所有类鸟个体,做以下几件事:    • 应用三大核心规则; ... 阅读详情

参考书籍《Python极客项目编程》。

运行环境

操作系统Win11。

Python 3.10.5。

电脑连接互联网。

安装相关包

在命令行窗口使用pip命令(我的电脑上,“pip.exe”文件所在目录是“D:\Programs\Python\Python310\Scripts”)安装numpy、matplotlib、scipy等相关包,命令如下:

pip install numpy

pip install matplotlib

pip install scipy

并根据提示使用如下命令升级:

D:\Programs\Python\Python310\python.exe -m pip install --upgrade pip

安装包相关信息的查看(以numpy为例)

启动python,进入python提示符,依次键入import numpy、print(numpy)、dir(numpy);或者help()、numpy,显示该模块的相关信息。(help(numpy)也可以)。

 

源代码

源代码网址: pp/boids.py at master · electronut/pp · GitHub 

源代码如下:

"""

boids.py

Implementation of Craig Reynold's BOIDs

Author: Mahesh Venkitachalam

"""



import sys, argparse

import math

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation

from scipy.spatial.distance import squareform, pdist, cdist

from numpy.linalg import norm



width, height = 640, 480



class Boids:

    """Class that represents Boids simulation"""

    def __init__(self, N):

        """ initialize the Boid simulation"""

        # init position & velocities

        self.pos = [width/2.0, height/2.0] + 10*np.random.rand(2*N).reshape(N, 2)

        # normalized random velocities

        angles = 2*math.pi*np.random.rand(N)

        self.vel = np.array(list(zip(np.sin(angles), np.cos(angles))))

        self.N = N

        # min dist of approach

        self.minDist = 25.0

        # max magnitude of velocities calculated by "rules"

        self.maxRuleVel = 0.03

        # max maginitude of final velocity

        self.maxVel = 2.0



    def tick(self, frameNum, pts, beak):

        """Update the simulation by one time step."""

        # get pairwise distances

        self.distMatrix = squareform(pdist(self.pos))

        # apply rules:

        self.vel += self.applyRules()

        self.limit(self.vel, self.maxVel)

        self.pos += self.vel

        self.applyBC()

        # update data

        pts.set_data(self.pos.reshape(2*self.N)[::2],

                     self.pos.reshape(2*self.N)[1::2])

        vec = self.pos + 10*self.vel/self.maxVel

        beak.set_data(vec.reshape(2*self.N)[::2],

                      vec.reshape(2*self.N)[1::2])



    def limitVec(self, vec, maxVal):

        """limit magnitide of 2D vector"""

        mag = norm(vec)

        if mag > maxVal:

            vec[0], vec[1] = vec[0]*maxVal/mag, vec[1]*maxVal/mag

    

    def limit(self, X, maxVal):

        """limit magnitide of 2D vectors in array X to maxValue"""

        for vec in X:

            self.limitVec(vec, maxVal)

            

    def applyBC(self):

        """apply boundary conditions"""

        deltaR = 2.0

        for coord in self.pos:

            if coord[0] > width + deltaR:

                coord[0] = - deltaR

            if coord[0] < - deltaR:

                coord[0] = width + deltaR    

            if coord[1] > height + deltaR:

                coord[1] = - deltaR

            if coord[1] < - deltaR:

                coord[1] = height + deltaR

    

    def applyRules(self):

        # apply rule #1 - Separation

        D = self.distMatrix < 25.0

        vel = self.pos*D.sum(axis=1).reshape(self.N, 1) - D.dot(self.pos)

        self.limit(vel, self.maxRuleVel)



        # different distance threshold

        D = self.distMatrix < 50.0



        # apply rule #2 - Alignment

        vel2 = D.dot(self.vel)

        self.limit(vel2, self.maxRuleVel)

        vel += vel2;



        # apply rule #1 - Cohesion

        vel3 = D.dot(self.pos) - self.pos

        self.limit(vel3, self.maxRuleVel)

        vel += vel3



        return vel



    def buttonPress(self, event):

        """event handler for matplotlib button presses"""

        # left click - add a boid

        if event.button is 1:

            self.pos = np.concatenate((self.pos,

                                       np.array([[event.xdata, event.ydata]])),

                                      axis=0)

            # random velocity

            angles = 2*math.pi*np.random.rand(1)

            v = np.array(list(zip(np.sin(angles), np.cos(angles))))

            self.vel = np.concatenate((self.vel, v), axis=0)

            self.N += 1

        # right click - scatter

        elif event.button is 3:

            # add scattering velocity

            self.vel += 0.1*(self.pos - np.array([[event.xdata, event.ydata]]))

        

def tick(frameNum, pts, beak, boids):

    #print frameNum

    """update function for animation"""

    boids.tick(frameNum, pts, beak)

    return pts, beak



# main() function

def main():

  # use sys.argv if needed

  print('starting boids...')



  parser = argparse.ArgumentParser(description="Implementing Craig Reynold's Boids...")

  # add arguments

  parser.add_argument('--num-boids', dest='N', required=False)

  args = parser.parse_args()



  # number of boids

  N = 100

  if args.N:

      N = int(args.N)



  # create boids

  boids = Boids(N)



  # setup plot

  fig = plt.figure()

  ax = plt.axes(xlim=(0, width), ylim=(0, height))



  pts, = ax.plot([], [], markersize=10,

                  c='k', marker='o', ls='None')

  beak, = ax.plot([], [], markersize=4,

                  c='r', marker='o', ls='None')

  anim = animation.FuncAnimation(fig, tick, fargs=(pts, beak, boids),

                                 interval=50)



  # add a "button press" event handler

  cid = fig.canvas.mpl_connect('button_press_event', boids.buttonPress)



  plt.show()



# call main

if __name__ == '__main__':

  main()

运行结果

将上述代码保存为文件“d:\temp\boids.py”。

在命令行窗口执行命令 “python d:\temp\boids.py”,运行结果如下:

 

 

 

智能优化算法之鸟群算法(BSA)的实现(Python附源码) 使用Python编程语言实现鸟群算法用于优化问题的求解,分别从实现思路、算法步骤以及实例这三个部分展开介绍,附源码,操作简单,适合新手学习。 阅读详情

相关推荐

win11 下载 Chromium 源码并编译

win11 下载 Chromium 源码并编译

liberty888的博客 1039

|Boids|鸟群模型|鸟群算法|学习笔记 - 论文学习

本文基于Craig Reynolds于1986年发布的《Flocks, Herds, and Schools: A Distributed Behavioral Model》进行学习和总结 通过一段原文,一段分析的方法,进行分析 概述 · · 摘要 The aggregate motion of a flock of birds, a herd of land animals, or a school of fish is a beautiful and familiar part of the nat

XiaoChe21的博客 1万+

pso算法(模拟鸟群捕食)介绍

pso算法,PSO的算法流程,PSO的参数设置,程序的伪代码!!

【Python 项目】类鸟群:仿真鸟群

仔细观察一群鸟或一群鱼,你会发现,虽然群体由个体生物组成,但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时,彼此之间相互定位。受到打扰或惊吓时会破坏编队,但随后重新集结,仿佛被某种更大的力量控制。1986年,Craig Reynolds创造鸟类群体行为的一种逼真模拟,称为“类鸟群(Boids)”模型。关于类鸟群模型,值得注意的是,只有 3 个简单的规则控制着群体中个体间的相互作用,但该模型产生的行为类似于真正的鸟群。

Ω 3611

链接: https://pan.baidu.com/s/18GYlgUtDXJN7aZ-t1P-lKQ 密码: 4og3

根据鸟群集群三大原则,结合二阶积分器模型,在matlab下进行编程仿真,最终实现500以内的个体能够受控地以一定的速度和加速度向设定的方向前进。并且可导出3维视角的视频。注释较为详细,还有不足的地方改进。

windows-11:Windows 11标准和源代码-windows source code

窗户11 字面上的未来。 Windows-11.txt-规格

boid 模型python实现模拟鸟群运动

本文使用BOIDS三层模型对鸟群运动进行了模拟,可以通过调节不同的参数获取到不同的实验现象,可以在这个基础上修改模型规则,以更好的模拟集群运动,本文提供一个模板。 # -*- coding:utf-8 -*- import argparse import math import numpy as np import matplotlib.pyplot as plt imp...

anjiao5728的博客 2175

【DSP】【工程实战】从零构建C6678多核工程:CCS环境配置与启动模式详解

本文详细介绍了在CCS开发环境中从零构建TMS320C6678多核DSP工程的完整流程。内容涵盖KeyStone架构解析、工程创建、基础代码编写、链接命令文件配置、仿真器调试,并重点深入讲解了包括I2C EEPROM在内的多种一级启动模式原理与配置方法,为开发者提供了一套清晰、可复用的实战指南。

weixin_29164185的博客 416

家庭IPTV组网实战:手把手教你用PIM-SM协议搞定运营商直播流分发

本文提供了一份详尽的家庭IPTV组网实战指南,重点讲解如何利用PIM-SM协议高效分发运营商直播流。通过部署PIM-SM和IGMP代理,将家庭路由器改造为组播路由器,解决多设备观看IPTV时的卡顿与带宽瓶颈问题,实现稳定流畅的全屋直播体验。

lll78的博客 917

CentOS 7升级GCC踩坑记:明明装了centos-release-scl,为啥找不到devtoolset-9-gcc-c++?

本文详细记录了在CentOS 7系统中升级GCC时遇到的`devtoolset-9-gcc-c++`不可用问题及其解决方案。通过分析`centos-release-scl`安装不完整的原因,提供了从清理残留、重新安装仓库配置到完整安装devtoolset-9工具链的全套操作指南,帮助开发者彻底解决类似环境配置难题。

weixin_29252171的博客 243

C#菜鸟教程学习笔记

C#菜鸟教程学习笔记 C#简介 C# 是一种编程语言,它是由微软开发的。 C# 编程是基于 C 和 C++ 编程语言的,它与 Java 也非常相似。 C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序。 .Net 框架(.Net Framework)能编写出下面类型的应用程序: ①Windows 应用程序 ②Web 应用程序 ③Web 服务 常用的C# 编程的开发工具:Visual Studio(VS:可视化工作室) C#程序结构 一个 C# 程序(C# 文件的后缀为 .cs)主要包括以下部分

mlc_WTMOTW的博客 4974

python粒子群算法工具包_python进阶教程:实现粒子群算法(PSO)详解

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府这篇文章主要介绍了Python编程实现粒子群算法(PSO)详解,涉及粒子群算法的原理,过程,以及实现代码示例,具有一定参考价值,需要的朋友可以了解下。文章目录1 .原理2.粒子群算法的过程3. 代码1 .原理粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的。假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(...

weixin_35876299的博客 1624

NTU RGB + D 120 动作识别数据集 描绘骨架(python)

“ NTU RGB + D”和“ NTU RGB + D 120”。 “ NTU RGB + D”包含60个动作类别和56,880个视频样本。 “ NTU RGB + D 120”通过添加另外60类和另外57,600个视频样本来扩展“ NTU RGB + D”,即“ NTU RGB + D 120”总共有120类和114,480个样本。 这两个数据集都包含每个样本的RGB视频,深度图序列,3D骨骼...

单线程的Daniel的博客 1万+

python实现电影院仿真(SimPy)

仿真环境:电影院仿真目标:减少顾客的平均等待时间,少于10分钟在开始仿真前,先思考这个仿真过程,顾客在坐下来看电影前需要经过哪些步骤这些步骤中又一些是可以控制的,比如有多少雇员在卖票或者卖小零食,有一些步骤需要依赖之前的数据进行预测,比如有多少顾客到达,接下来开始仿真过程,首先导入需要的库记录优化目标:找到雇员的最佳数量,使所有顾客的平均等待时间小于10分钟,使用列表存储顾客等待时间。

weixin_45526117的博客 2624

【系统架构设计师-2023年真题】综合知识-答案及详解

要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,其中()是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。()作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。(1)A. 共享内存 B. Socket C. 消息传递 D. 信号量(2)A. 共享内存 B. Socket C. 消息传递 D. 信号量【答案】A、C关于星型拓扑结构,下列说法正确的是(

数据知道的博客 1万+

RK3568 HDMI输出调试:分辨率切换与EDID解析

厂商信息(Vendor ID)显示器型号(Product ID)支持的分辨率列表色彩特性音频支持情况检查项方法HPD 信号EDID 读取当前模式TMDS 时钟PHY 状态。

小灰灰的博客 1480

博弈论Python仿真(一)

博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。表面上不同的相互作用可能表现出相似的激励结构(incentive structure),所以它们是同一个游戏的特例。其中一个有名有趣的应用例子是囚徒困境。 具有竞争或对抗性质的行为称为博弈行为。在这类行为中,参加斗争或竞争的各方各自具有不同的目标或利益。为了达到各自的目标和利益,各方必须考虑对手的各种可能的行动方案,并力图选取对自己最为有利或最为合理的方案。比如日常生活中的下棋,打牌等。博弈论就是研究博弈行为...

帅帅气气的黑猫警长 6593

点云从入门到精通技术详解100篇-基于三维点云的机器人抓取位姿检测(续)

集到的深度信息会存在噪点,因此需要将生成的场景点云进行预处理,获得平滑、降采样处理场景点云,本文设计的预处理操作更能从冗杂的场景点云中提取清晰、平滑的目标点云,便于后续的抓取位姿采样,提高后续算法的处理效率。因此需要对场景点云进行适当的分割,仅保留目标物体的点云,整个过程可以通过。场较小时,空间中的点云密度会更加提高;觉子系统的效率,再保持全局点云几何形状不改变的前提下,通过对目标点云进行。体素降采样可以快速地减少点云数据并同时保持点云的形。个点,由于我们实施抓取的目标物体只占整个场景点云图的一部分,

getusushu的博客 771

使用PYTHON进行的跨平台仿真

这种方法的逻辑扩展不仅是连接软件内部的解决方案,而且还允许跨平台模拟,以从其他程序或编程语言获益,并结合熟悉物理光学特性的VirtualLab Fusion,从而扩展模拟、优化、设计和后处理的选项。因此,我们正在深入研究如何使用编程语言Python来调用和控制VirtualLab Fusion中的模拟。请查看下面链接的文档,以找到关于如何设置和使用Python和VirtualLab Fusion之间的接口的详细指南,以及一个应用案例,其中我们在一维和二维光栅上执行参数扫描。

Bonnie1985119的博客 379

SAP UI5 主题设置全解析:从启动参数到运行时切换、跨域白名单与事件监听

SAP UI5主题体系深度解析:从配置到切换的完整指南 摘要:SAP UI5主题机制远不止CSS换肤,其工程化实践涵盖启动配置、运行时API切换、跨库路径映射及安全管控等关键环节。通过bootstrap标签或URL参数设置初始主题,运行时可用Theming.setTheme无刷新切换。自定义主题需配置theme-roots路径,跨域加载需声明sap-allowed-theme-origins白名单。主题切换完成后会触发applied事件,适合执行视觉同步操作。该体系支持多品牌适配、集中式主题管理,在Fior

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 325

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蒙特卡罗仿真(1):入门求生指南(Python实例)

结合python仿真实例介绍通往蒙特卡罗仿真世界之路

chenxy_bwave的专栏 9339

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Python微信机器人】第一篇:在windows11上编译python

我打算写一个系列,内容是将python注入到其他进程实现inline hook和主动调用。本篇文章是这个系列的第一篇,后面用到的案例是注入python到PC微信实现基本的收发消息。文章着重于python方面的内容,所以对于微信找收发消息的call不会去讲过程,有兴趣的可以直接百度搜PC微信逆向。我想要的inline hook效果是,就是只需要给定hook的内存地址address和回调函数callback就能实现hook,回调函数的参数是所有的寄存器组成的结构体。

Qwertyuiop2016的博客 1086

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WIN11代码

【代码】WIN11代码。

lijiale20150909的博客 287

Win11下基于VS2022编译SQLite3源码

本文介绍了如何基于VS2022编译SQLite3源码的使用。

子枫 4353

Java实现的一个编译器源代码(Win11)

Java实现的一个简单语言的编译器。

Alexabc3000的专栏 2558

Python+Agent入门笔记(二):列表推导式、模块和异常,这些写 Agent 前得会

接上一篇《Python+Agent入门笔记(一)》。基础语法跑通之后,这篇聊几块日常写脚本绕不开的东西。还是按 JS/Go 开发者的视角写,尽量记录我实际卡过的地方。

qq_41241612的博客 425
上一篇: Windows中使用Lex(Win flex-bison)
下一篇: Python利用OpenGL和GLFW显示纹理贴图的正方形(Win11)
Alexabc3000
博客等级 码龄20年 156粉丝 128原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alexabc3000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值