版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动物群体运动行为模型概括自然界中多种生物都存在复杂的蜂群行为。生物学家对此进行了大量研究,也取得了许多重要的研究成果。在一定程度上,群体行为是由群体智能主导的。所谓群体智能,是指许多简单的个体组成一个群体,通过相互合作表现出智能行为的特征。在自然界中,动物和昆虫经常使用集体力量来躲避捕食者和觅食。本文的主要工作是通过建立适当的数学模型并使用计算语言进行模拟来研究群体的群体运动。对于第一个问题,我们首先寻找它的理论基础。国外专家主要使用欧拉法和拉格朗日法来研究聚类行为。通过相关理论的比较,发现本题研究的问题最好采用拉格朗日方法解决。为便于研究,本文选择天然鱼群为对象,建立自由游动模型,引入环境R
2、a模型,并在此基础上建立静态障碍物避让模型。数值的调整改变了搜索参数,达到控制状态的行为选择的目的,最终通过计算机模拟演示动物的群体运动。对于第二个问题,在前面模型的基础上,我们进一步引入了智能体遇到捕食者时的群体运动模拟算法。基于人工鱼群自组织模型,建立相关天敌因素,然后根据约束因素分配权重,进行迭代计算,实现鱼群逃逸模拟。对于第三个问题,分析信息丰富的人群对群体运动的影响,利用群体中的信息传递原理对群体运动的决策进行参考,简化群体的沟通机制,给出鱼是一种可以相互传递信息的通讯方式。它融合摘 要信息交互方法,建立动物群体觅食模型的信息交互模型,实现信息对群体决策运动方向的影响。关键词:群体行
3、为 群体智能 多智能体差分迭代 信息交互 群体觅食问题的背景和重述问题的背景在生态系统中,动物的个体行为相对简单,但在成群之后表现出极其复杂的群体行为。机会。这种生物的群体运动导致了对群体智能的探索。群体智能理论研究自1980年代出现以来,作为一个新兴领域,受到越来越多科学家的关注,现已成为经济学、社会学、生物学等交叉学科的研究热点。群体智能主要针对蚂蚁、鸟群和其他群居生物的行为进行观察和研究。1.2 问题的重述通过观看视频并在网上搜索相关信息,这些动物群体在运动过程中具有明显的特征:群体中个体高度聚集,运动方向和速度一致。重点思考动物群运动的机理,建立描述动物群运动的数学模型;建立数学模型来
4、描述鱼类避开黑鳍礁鲨的运动行为;假设有信息丰富的动物知道食物来源的位置和迁徙路线。进一步分析该动物群如何实现群体运动方向决策。2. 模型假设2.1 假设本文所提及的生物种群是一个独立的生态部落;2.2假定天然鱼的一般游动是随机的;2.3 论文中提到的鱼群数量短期内没有变化,即不考虑鱼的出生率和死亡率;2.4 假设同种鱼类的个体是同质的,只考虑平均水平,不考虑个体差异;2.5 鱼类种群不受环境变化(地震、海啸等自然灾害)的影响;2.6 假设环境中的食物和障碍物是随机分布的。3.符号说明设单位时间单位面积上的粒子迁移量粒子浓度扩散性粒子数小组班次群体对其环境反应的正常漂移量距离为 1 的群体中个体
5、之间的吸引力距离为 1 的群体中个体之间的排斥力个人素质个人 i 的位置作用于个人的合力个人总数包括聚合或分散的力量下一个循环agent的游泳方向个体智能体接近鱼群的游动方向(向心因子)对齐时鱼游动的方向(对齐因子)避免碰撞的游泳方向(回避因子)agent 在当前 t 中的游泳方向(惯性因子)第一个因素的权重( =1 , 2, 3, 4, 5, 7 )个体位置向量每一步的时间间隔Agent和 Agent之间的距离为向心对代理引起的期望运动趋势由对齐代理对引起的期望运动趋势避免碰撞引起的代理的期望运动趋势,静态障碍物边界的切线方向向量逃逸因子, ,和夹角Agent移动的最大速度Agent移动的最
6、小速度捕食者的最大速度最大偏转角时间消耗的食物量消化率自上次用餐以来的时间表示鱼的食欲大小的常数外部刺激的影响自上次交配以来的时间计算对潜在交配的感知影响害怕发现捕食者与发现的捕食者的距离两条鱼之间的距离遇到掠食者所需的旋转角度四、问题分析在自然界中,有大量的动物成群结队地移动或觅食。这些动物群体在运动过程中具有明显的特征:群体内个体聚集性强,运动方向和速度一致。往往靠集体力量觅食求生,单个个体的行为缺乏智能,但由个体组成的群体却表现出有效而复杂的智能行为,是群体智能的体现。本文研究的主要问题是建立一个模型来模拟动物的成群行为。首先,找到一些动物群的理论基础,如欧拉法和拉格朗日法,深入分析影响
7、群的原因,包括游泳和觅食的原理。 ,避障原则,然后建立RA模型,并用计算机演示集群行为。第二个问题,考虑鱼群躲避黑鳍礁鲨的运动行为,当鱼群遇到天敌时,通过个体逃逸与过程的相互作用来表达群体逃逸行为。当代理发现捕食者时,它将向其他代理致消息。假设智能体接收到危险信号,它会分析捕食者的位置、方向以及自身的心理和生理,做出相应的逃跑选择。在第一个问题模型的基础上,引入了智能体遇到捕食者时的群体运动模拟算法。基于人工鱼群自组织模型,建立相关天敌因素,然后根据约束因素分配权重,进行迭代计算,实现鱼群逃生模拟。对于问题3,对于所有的生物来说,无论是群居还是散居,总是因为生存的需要而相互联系。为了研究信息丰
8、富的人的运动方向,分析动物的信息交互,相互交流。对机理进行了简化分析。对于鱼类的觅食行为,在上一题建立的模型的基础上,重新分析了信息的丰富性如何影响种群的决策路径。五、模型建立与解决5.1 建立数学模型,模拟动物的群体运动。5.1.1理论基础通过收集相关书籍资料可以知道,聚类问题的建模和研究方法主要分为以下两类:(1) 欧拉法在欧拉的方法中,集群模型的每个个体成员都不是作为一个单独的实体来研究的,而是通过密度的概念将整个种群描述为一个连续体。 Euler方法的理论基础是Fick提出的经典扩散理论,其模型方程表示为:式中,单位时间、单位面积上沿该方向的粒子迁移量分别表示为粒子浓度和扩散率。以及人
9、口通过垂直于 x 轴的平面的通量,表示人口的平移。同时,对流项不仅包括群中心漂移的速度项,还增加了群成员之间的相互作用,如:在这个公式中, ,描述了该组响应环境的常规漂移; ,描述距离为 的群体中个体之间的吸引力和排斥力。其他一些基于欧拉方法的研究工作是在上述聚类模型的基础上做一些扩展的讨论。可以添加到等式中的其他项是来自同质或环境资源的吸引力或排斥力。(2) 拉格朗日法拉格朗日方法的基本描述是每个个体的运动方程,也是一种比较自然的建模和分析方法。例如,在拉格朗日方法中,牛顿运动方程是一个典型的个体运动方程:其中是个体的质量,是个体 i 的位置,是作用在个体上的合力, 是个体的总数。它由聚集或
10、分散的力(即描述个体之间的吸引力或排斥相互作用)、与相邻个体的速度和方向相匹配的力以及确定的环境影响(例如与环境相关的重力或行为施加的随机干扰)组成的其他个人。是这些力量的总和。目前,大量的蜂群行为研究工作也是围绕这些力的形式展开的。(3) 理论模型的比较与结论由于偏微分方程的理论比较发达,欧拉法很容易对偏微分方程构造的聚类模型进行理论分析。聚类行为非常有效,密集且没有明显的不连续分布。但是,欧拉方法也有一个明显的缺点,那就是它忽略了个体的特征。因此,当许多群体由数量有限的大体积或个体成员组成时,不适合使用基于欧拉方法的连续统模型,这些群体强调个体智力的特征,例如鱼群、鸟群的成群行为等。欧拉模
11、型对群体所在物理空间连续性的假设,大多适用于较小的生物群体。在分析鱼群、鸟群、野兽群等较大生物的群体时,由于个体的大小,群体所占据的物理空间也会比较大,这也使得欧拉方法假设群体所在的物理空间是现实中的一个连续统一体。因此,本题采用基于拉格朗日方法的Agent模型来模拟动物群体的运动。5.1.2模型构建原则为了建立数学模型更准确地模拟动物的群体运动,我们以天然鱼为原型,建立了人工鱼群。通过观看视频和咨询学习相关书籍资料,我们对人工智能鱼群的运动提出以下原则:一般游泳原理一个。就近原则,即尽可能靠近相邻鱼的中心;湾。对齐原则,尽量与相邻鱼的运动方向一致;C。避免碰撞原则,尽量避免与相邻的鱼发生碰撞
12、。并且由于每条鱼的运动方向是随机的,这三个规则只对下一瞬间改变鱼的游动方向起到一定的作用,不能立即改变鱼的游动方向,而原来的速度鱼仍然被表达。惯性效应。因此,在自由游泳的情况下,agent下一时刻的运动速度方向主要由惯性速度、对齐速度、向心速度、回避速度四个因素的综合作用决定,如下图所示:(2) 鱼类觅食规则鱼成群结队比独处时更快地找到食物。如果浅滩的一个成员找到食物,其他成员也可以捕食它。当鱼群成员之间的距离勉强保持在视线范围内时,搜索范围最大,自然鱼群觅食时遵循以下两条规则:一个。离心式:代理个体到鱼的外围近距离寻找食物;湾。追尾:当其他鱼群聚集在食物的位置时,代理会追尾并捕捉食物。(3)
13、Agent避开静态障碍物的原理当 Agent 感知到静态障碍物时,静态障碍物只有位置信息,没有运动信息。代理计算它需要以当前速度转动多少角度才能避开距离障碍物最近的点。经过多次测试和验证,这个转弯角度通常在agent单步运动能力的范围内,即能耗最小、避障距离最近的路线。5.1.3建筑模型(1) 自由游泳模型的建立根据以上原理,考虑到各个规则对鱼的影响不同,我们还需要对各个方向向量进行加权,采用层次分析法,以游泳原理中涉及的速度向量作为四个指标来计算影响的代理。某一时刻运动方向的各个方向指标的权重因子。自由行走模型算法:公式成立如下:在其中是agent在下一个周期的游泳方向,agent在当前t的
14、游泳方向(惯性因子),接近鱼群的个体agent的游泳方向(向心因子),游泳方向对齐鱼群时(对齐因子),游泳方向以避免碰撞(回避因子)。表示相应的权重。采用层次法分析,得到判断矩阵:指数惯性系数向心因子对齐因子避碰系数惯性系数1424/3向心因子1/411/21/3对齐因子1/2212/3避碰系数3/433/21可以通过层次分析法求解:主观因素 W1客观因素 W2重量0.33330.66671惯性系数2-0.50.3333向心因子-0.16670.33330.1667对齐因子0.33330.50.2222避碰系数0.50.66670.2778因此, , , , 。 ,惯性因素对下一刻鱼的速度影响
15、最大。(2) Ra环境模型的建立由于 Agent 在鱼群中,附近的鱼对它的影响更加复杂。为了进一步量化指标,便于模拟群体运动的实现,将Agent的环境因子模型Ra模型简化如下:Ra 模型将个人与个人的交互描述为 3 个角色。设Agent和 Agent之间的距离为:在当时是一种排斥作用,即回避的体现,防止它们发生碰撞和冲突;那时,有一种吸引力,一种向心的表现,保证了鱼群成为一个整体;当时处于相对平衡稳定的状态,进行速度匹配,避免打破平衡距离或潜在冲突,即对齐的体现,保证鱼的运动方向一致。使用Ra模型,我们可以定义三个游泳规则的方向向量如下:每个原则属性引起的预期运动趋势作为相应的影响因素。假设组
16、中有 N 个代理 (1, 2,.N, ),代理的位置向量为,运动向量为 ,每一步的时间间隔为 。1. 向心对Agent造成的预期运动趋势为:2. 对齐引起的agent的预期运动趋势为:3. 避碰引起的Agent的预期运动趋势为:将上述影响因素代入式(1),计算出下一时刻Agent的运动方向。在:,相关算法用计算机语言编写,时间微量化可模拟一般自由游鱼群的运动。上面两张2D图:左图是红蓝鱼随机分布,右图是动物群体行为后的图像,左图是蓝鱼,右图是蓝鱼。鱼群是红鱼群,包括10条红鱼和10条蓝鱼。 (程序见附件)(3) 鱼类绕过静态障碍物模型的建立感知定义:基于感知问题的复杂性,在虚拟环境中进行了简化
17、,设置如下:一个。 Agent感知食物,对掠食者和障碍物的感知是Agent运动的方向,半径为或半球,Agent直接从数据库中读取位置和运动数据;湾。代理在鱼群中相互感知,感知一个有半径的球体,通过代理之间的通信传递位置和运动信息。基于二维平面的迂回算法:Step1当Agent感知到此时速度方向有障碍物时,会以当前位置为原点P形成一簇光线。Step2记录射线集中与障碍物边界只有一个交点的射线的方向矢量为, ,与射线集的夹角分别为。Step3当时,将其作为障碍绕行因子,反之亦然。Step4将绕行因子添加到约束中,并根据约束因子重新分配权重。根据经验算法,迂回因子的权重与鱼与障碍物的距离成反比。引入
18、函数的量化如下:Step 5 计算下一时刻的速度,按照时间步法不断迭代执行,直到运动方向没有障碍物,返回自由泳。算法流程图如下:.基于三维空间的绕道算法:将空间障碍物垂直于面向Agent的水平方向进行投影,然后代入二维平面程序进行计算迭代。上图是一群鸟避开静态障碍物的截图。5.2.建立数学模型来描述鱼类避开黑鳍礁鲨的运动行为5.2.1相关因素的介绍定义 1. 最大速度:设智能体移动的最大速度为,最小速度为,捕食者的最大速度为 ,两者之比为: 。定义 2. 最大偏转角为, , K 为常数,v 为线速度。定义3. 人工鱼的行为函数是用来衡量每一个行为的参数度量描述。比如疲劳、饥饿、恐惧,就属于鱼的
19、心理状态,用下面的公式来量化:在其中,下划线部分代表人工鱼的部分冲动部分,代表时间,是消耗的食物量,以物理颗粒的数量或捕食性鱼类的数量来衡量,是消化率,是一个常数;吃饭后的时间;是一个常数,表示鱼的食欲大小(较大的鱼有较大的值);反映外部刺激的影响,例如对附近食物的感知;包含一个常数作为性欲的函数;是自上次交配以来的时间;计算对潜在交配的感知影响;是一个常数;并分别代表发现的掠食者的恐惧和距离; ,是标称值。5.2.2人工鱼群自组织模型的建立在前人模型的基础上,进一步介绍了智能体遇到捕食者时的群体运动模拟算法。基于人工鱼群自组织模型,建立相关天敌因素,然后根据约束因素赋予权重,代入迭代计算,实
20、现鱼群逃生模拟。当鱼群遇到天敌逃逸时,群体逃逸行为是通过个体逃逸与过程的相互作用来表现的。当某个代理发现捕食者时,它会向其他代理致消息。假设Agent收到危险信号,它会分析捕食者的位置、方向、心理和生理,并做出相应的逃跑选择。下面将这种转义行为模拟为:设代理的质量为;遇到危险的时刻是;速度是逃跑时的预期速度;遇到捕食者时需要旋转的角度为;在agent逃跑过程中防止碰撞的斥力为 则agent的移动速度和位置在时间上的变化可以用下式表示:同时,人工鱼在逃逸过程中避免碰撞的斥力定义为,其中,为常数;是两条鱼之间的距离。是一个指向的法向量。遇到捕食者时需要旋转的角度为(数值由Agent的移动速度和捕食
21、者的移动速度决定),如图,其中虚线为调整后的速度。如果那么_否则,如果那时否则_公式中的“-”表示偏离了捕食者的运动方向,即如果捕食者在智能体的左侧,则智能体向右转,反之亦然。Step 1. 当Agent感知到周围有捕食者,或收到其他鱼类的危险信息时,迅速确定捕食者的位置及其移动速度和方向步骤2. 计算集体逃生的疲劳、饥饿、恐惧和排斥步骤 3 。确定规避偏转角和逃逸速度,并将它们作为逃逸因子代入约束第四步:结合疲劳、饥饿、恐惧和排斥,确定约束因素的权重步骤 5 。计算下一时刻的速度,按照时间步法迭代执行,直到鱼整体检测到没有捕食者,返回自由游动。如上图:绿色代表天敌,其他四种颜色代表小鱼。当小
22、鱼感觉到捕食者的存在,或者从其他鱼类那里收到危险信息时,它们会迅速确定捕食者的位置及其移动速度和方向,然后蜂拥而至逃离捕食者。5.3.群体信息丰富的人群对群体运动方向的影响探索5.3.1觅食环境中的信息交互动物不像人那样会说话,因为生存和繁衍的需要,它们也能够交流。动物通过某些信号唤起或影响其他个体行为的方式是动物之间的交流。它们有多种沟通方式,包括视觉沟通、听觉沟通、接触沟通、电沟通和化学沟通等。本题综合了上述沟通方式的抽象信息交互方式。当一个智能体在觅食环境中发现食物时,它会发出寻找食物等消息,其他没有找到食物的智能体如果感知到这样的消息,就会聚集到消息发出的地方。在这个问题中,我们以鱼类
23、觅食为研究对象。5.3.2鱼类觅食中的信息传递机制为了便于模型建立,将交互过程定义为代理之间的消息传递,我们将通信机制简化如下:1、代理通信圈:一个以自身质心为中心,以最大吸引距离为半径的球体;2、通讯对象:位于通讯区域内的所有Agent;3、沟通过程:a) 当每一步结束位置的坐标发生变化时,更新成员库;b) 将位置和运动信息传递给所有通信对象;c) 所有通信对象都向其传输其位置、传输信息。4、通过与通讯对象的通讯,实现群内Agent的本地交互。5.3.3群体信息交互模型的建立为了了解信息丰富的人对鱼群运动的影响,在前面的模型的基础上,我们主要研究鱼群的觅食行为:动物通过与同伴互动来寻找食物的
24、过程Step1建立鱼类中富含鱼类的比例;Step2计算鱼的饥饿度和疲劳度;Step 3 将信息因子引入到信息丰富的人群中,将离心因子和追尾因子结合天然鱼类的觅食特性,即离心因子和追尾因子,扩展各自的约束条件,重新定义分配相应的权重,并迭代计算;Step 4 调整信息丰富的人的比例,重复上述过程;Step5研究结果,得出结论。6. 模型评估由于偏微分方程的理论比较发达,欧拉法很容易对偏微分方程构造的聚类模型进行理论分析。聚类行为非常有效,密集且没有明显的不连续分布。但是,欧拉方法也有一个明显的缺点,那就是它忽略了个体的特征。因此,当许多群体由数量有限的大体积或个体成员组成时,不适合使用基于欧拉方
25、法的连续统模型,这些群体强调个体智力的特征,例如鱼群、鸟群的成群行为等。 .在解决问题1时,遵循以上两个理论,首先考虑动物群和运动的原理:一般游泳原理、鱼类觅食原理和代理避障原理。在此原理的基础上,建立了自由游泳模型。 ,RA模型,避障模型。在模型的建立中,考虑了各种因素对鱼类下一时刻游动的影响,采用层次法分析了权重比。第二个问题,在前一个模型的基础上,引入了智能体遇到捕食者时的群体运动模拟算法。基于人工鱼群自组织模型,建立相关天敌因素,然后根据约束因素分配权重,进行迭代计算,实现鱼群逃逸模拟。这在很大程度上取决于人们的经验,主观因素的影响非常大。它最多只能排除思维过程中的严重不一致,但不能排
26、除可能的片面性。比较判断过程比较粗糙,不能用于精度要求较高的决策问题。第三个问题也是先分析动物信息传递的方式,建立与信息传递机制的群体信息交互模型,展开各自的约束并重新分配相应的权重,迭代计算,得出结论。7. 参考文献1胡晓东,董晨辉,MATLAB从入门到精通,人民邮电,2010.6;2 马丽,MATLAB数学实验与建模,清华大学,2010.1;3 姜道平,一欣,班晓娟,孟祥松,“基于群体状态的Agent行为选择”,科技大学信息工程学院;4 石明,群体行为建模与控制方法综述,华东交通大学电气与电子工程学院;5 于建平,周新民,明,“群体智能典型算法研究综述”,师范大学数学与计算机学院;6 简,
27、曾建超, 鱼群行为建模与仿真,科技大学系统仿真与计算机应用研究所;7 简,“鱼群行为建模与仿真硕士论文”,科技大学。8. 附录8.1 层次分析法程序a= 1 1/22 1 ;x,y=eig(a);特征值=诊断(y);lamda=特征值(1);cil=(lamda- 2 )/1;crl=cil/ 0 ;w1=x(:,1)/sum(x(:,1); b 1 =1,4,2,4/3;1/4,1,1/2,1/3;1/2,2,1,2/3;3/4,3,3/ 2,1; x , y = eig ( b1 ) ;特征值 = diag ( y ) ;lamda = 特征值 (1) ;ci21=(query-4)/3;
28、cr21=ci21/0.9;w21=x(:,1)/sum(x(:,1); b 2 =1,1/2,1/3,1/4;2,1,2/3,1/2;3,3/2,1,3/4;4,2,4/ 3,1; x , y = eig ( b2 ) ;eigenvalue = diag ( y ) ;lamda = eigenvalue ( 1 ) ;ci22=(query-4)/3;cr22=ci21/0.9; w22=x(:,1)/sum(x(:,1); w_sum=w21,w22*w1; ci=ci21,ci22; cr=ci*w1/sum(0.9*w1);8.2用MATLAB编写的二维鱼群聚模型8.2.1主函数c
29、lcclear allclose allboids_params.pop_size = 10;Boids_params.num_rounds = 500;Boids_params.dist_param = 100;Boids_params.velocity_limit = 200;Boids_params.rand_speed_param = 50;Boids_params.bound_square_size = 700;boids_params.bound_speed_param =40;boids_params.bang_params.cycle = 80;boids_params.ban
30、g_params.duration = 0;boids_params.bang_params.power = 20;Boids_pop_blue = Boids_init(Boids_params.pop_size);Boids_pop_red = Boids_init(Boids_params.pop_size);mov = avifile( Boids_3.2_Hunter_Hunted.avi )抽动对于iRound=1:Boids_params.num_roundsBoids_params.current_round = iRound;Boids_pop = Boids_pop_blu
31、e; boids_pop_red;F = Boids_draw(Boids_pop, Boids_params);mov = addframe(mov,F);blue_center = Boids_get_center(Boids_pop_blue);red_center = Boids_get_center(Boids_pop_red);new_Boids_pop_blue = Boids_move_all_to_new_pos(Boids_pop_blue, red_center, 1, Boids_params);new_Boids_pop_red = Boids_move_all_to
32、_new_pos(Boids_pop_red, blue_center, 2, Boids_params);Boids_pop_blue = new_Boids_pop_blue;Boids_pop_red = new_Boids_pop_red;iRound结尾目录移动 = 关闭(移动);8.2避避函数v4 = Boids_avoid_shark(Boid,shark_pos,Boids_params)%简单的鲨鱼逃生%if (norm(Boid.pos - Shark_pos) 0.5*Boids_params.bound_square_size)v4 = 0 0;别的v4 = (Boid
33、.pos - Shark_pos)*(1*0.5*Boids_params.bound_square_size)/ .(5*Boids_params.bound_square_size - norm(Boid.pos - Shark_pos);结尾%高级鲨鱼逃生%Boid_shark_vec = Shark_pos - Boid.pos;scalar_prod = Boid_shark_vec(1)*Boid.v(1) + Boid_shark_vec(2)*Boid.v(2);如果(scalar_prod 0)v4 = 0 0;结尾8.2.3子函数绘图功能函数F = Boids_draw(B
34、oids_pop,Boids_params)X = ;Y = ;SQUARE_SIZE = Boids_params.bound_square_size*2;Boids_center_mass = 0 0;对于iBoid = 1:Boids_params.pop_sizeBoids_center_mass = Boids_center_mass + Boids_pop(iBoid).pos;结尾Boids_center_mass = Boids_center_mass/Boids_params.pop_size;情节(Boids_center_mass(1),Boids_center_mass
35、(2),“或”); 坚持,稍等;if (rem(Boids_params.current_round, Boids_params.bang_params.cycle) Boids_params.bang_params.duration)情节(Boids_center_mass(1),Boids_center_mass(2), “或” );坚持; _结尾% Shark_pos.x = 1.0*Boids_params.bound_square_size*cos(2*Boids_params.current_round*pi/180);% Shark_pos.y = 0.4*Boids_param
36、s.bound_square_size*sin(5*Boids_params.current_round*pi/180);情节(shark_pos.x,shark_pos.y,og); 坚持,稍等;对于iBoid = 1:size(Boids_pop,1)%X = X; boids_pop(iBoid).pos(1);%Y = Y; boids_pop(iBoid).pos(2);p0 = Boids_pop(iBoid).pos - Boids_pop(iBoid).v;p1 = Boids_pop(iBoid).pos;if (iBoid Boids_params.bound_square
37、_size*0.9 & Boid.v(1) 0Boid.v(1) = Boid.v(1) - Boids_params.bound_speed_param;结尾如果Boid.pos(1) -Boids_params.bound_square_size*0.9 & Boid.v(1) Boids_params.bound_square_size*0.9 & Boid.v(2) 0Boid.v(2) = Boid.v(2) - Boids_params.bound_speed_param;结尾如果Boid.pos(2) -Boids_params.bound_square_size*0.9 & B
38、oid.v(2) Boids_params.velocity_limitBoid.v = Boid.v*0.5*Boids_params.velocity_limit / norm(Boid.v);结尾new_Boid = Boid;位置实时更新功能function new_Boids_pop = Boids_move_all_to_new_pos(Boids_pop, Hazard, Hunter_Hunted, Boids_params);Boids_pop_size = size(Boids_pop,1);砰 = 0;if (rem(Boids_params.current_round,
39、 Boids_params.bang_params.cycle) Boids_params.bang_params.duration)砰 = 1;结尾new_Boids_pop = ;% Shark_pos(1) = 0.8*Boids_params.bound_square_size*cos(2*Boids_params.current_round*pi/180);% Shark_pos(2) = 0.8*Boids_params.bound_square_size*sin(2*Boids_params.current_round*pi/180);对于iBoid = 1:Boids_pop_
40、sizeBoid = Boids_pop(iBoid);v1 = Boids_rule1(Boids_pop, Boids_pop(iBoid),Boids_params, 砰);v2 = Boids_rule2(Boids_pop, Boids_pop(iBoid), Boids_params.dist_param);v3 = Boids_rule3(Boids_pop, Boids_pop(iBoid);v4 = Boids_avoid_shark(Boid, Hazard, Boids_params);如果(Hunter_Hunted = 2)v4 = -0.05*v4;别的v4 = 1
41、.5*v4;结尾Boid = Boids_limit_velocity(Boid, Boids_params);Boid = Boids_limit_position(Boid, Boids_params);Boid.v = Boid.v + v1 + v2 + v3 + v4;Boid.pos = Boid.pos + Boid.v ;new_Boids_pop= new_Boids_pop ;博德;结尾8.3可视化c+编写的三维聚模型#include #include #include CFlock.h#include CBoid.h#include CBox.h#include “向量.
42、h”/ 静态变量初始化/ 可见的朋友列表(每个flock boid重复使用的工作空间)CBoid * CBoid:VisibleFriendsList = NULL;/ 构造函数和析构函数/ 构造函数 #1。/ 创建一个具有随机位置和速度的个体。CBoid:CBoid(短 id_v)#ifdef BOID_DEBUGmyprintf(nCBoid 构造函数 #1 为 boid %d 调用。n,id_v);万一m_id = id_v;m_perception_range = Default_Perception_Range;/ 生成随机位置各代产生的随机位置m_pos.x = RAND() *
43、CBox:WorldPtr-GetBoxWidth()/3;m_pos.y = RAND() * CBox:WorldPtr-GetBoxHeight()/3;m_pos.z = RAND() * CBox:WorldPtr-GetBoxLength()/3;/翻转位置以获得更大的随机性产生随机速度如果 ( RAND() 0.5f) m_pos.x *= -1;如果 ( RAND() 0.5f) m_pos.y *= -1;如果 ( RAND() 0.5f) m_pos.z *= -1;/ 生成随机速度m_vel.x = RAND();m_vel.z = RAND();/ 翻转速度以获得更大的
44、随机性如果 ( RAND() 0.5f) m_vel.x *= -1;如果 ( RAND() 0.5f) m_vel.z *= -1;速度更新/ 根据速度计算速度m_speed = m_vel.length();/ 归零方向初始方向m_ang.x = m_ang.y = m_ang.z = 0;/ 其他值m_num_flockmates_seen = 0;m_nearest_flockmate = NULL;m_dist_to_nearest_flockmate = 无穷大;m_num_enemies_seen = 0;m_nearest_enemy = NULL;m_dist_to_near
45、est_enemy = 无穷大;m_next = m_prev = NULL;产生一个特殊位置和速度#ifdef BOID_DEBUG打印数据();万一/ 构造函数 #2。/ 创建一个具有特定位置和速度的个体。CBoid:CBoid (短 id_v,向量 * pos_v,向量 * vel_v,向量 * ang_v)#ifdef BOID_DEBUGmyprintf(nCBoid 构造函数 #2 调用了 boid %d.n,id_v);万一m_id = id_v;m_perception_range = Default_Perception_Range;m_pos = pos_v;m_vel =
46、 vel_v;m_ang = ang_v;m_speed = vel_v-length();m_num_flockmates_seen = 0;m_nearest_flockmate = NULL;m_dist_to_nearest_flockmate = 无穷大;m_num_enemies_seen = 0;m_nearest_enemy = NULL;m_dist_to_nearest_enemy = 无穷大;m_next = m_prev = NULL;#ifdef BOID_DEBUG打印数据();万一/ 析构函数。/ 销毁指定的 boid。CBoid:CBoid (void)#ifd
47、ef BOID_DEBUGmyprintf(nCBoid 析构函数调用了 boid %xn,this);万一/公共植绒方法/公共聚集方式/ FlockIt。/ 用于逐帧更新;头寸没有时间增量。void CBoid:FlockIt (int flock_id, CBoid *first_boid)向量acc;#ifdef BOID_DEBUG实时更新位置myprintf(n=n更新为 %dn, m_id);myprintf(前位置 = %f %f %fn,m_pos.x,m_pos.y,m_pos.z);万一/ 第 1 步:更新我们的位置。1.根据速度更新位置/ 根据速度更新我们的位置/ 我们上
48、次计算的向量。m_oldpos = m_pos; / 保存我们之前的位置m_pos += m_vel; / 应用速度。/ 第 2 步:见朋友。2.看到同类聚集/ 确定我们是否可以看到我们的任何 flockmate。见朋友(first_boid);/ 第 3 步:植绒行为。3.群体行为/ 我们看到我们的任何羊群伙伴了吗?如果是,是时候实施了/ 前三个规则(如果我们看不到任何人,它们无关紧要)如果(m_num_flockmates_seen)4.同类间保持间距/ 第 4 步:实施规则 #1(分离)。/ 尝试与我们最近的羊群保持我们想要的距离。AccumulateChanges (acc, Keep
49、Distance();/ 第 5 步:实施规则 #2(对齐)。5.保持一定队形/ 尝试像我们最近的羊群一样移动。AccumulateChanges (acc, MatchHeading();/ 第 6 步:实施规则 #3(内聚)。6向中心凝聚/ 尝试向羊群的中心移动。AccumulateChanges (acc, SteerToCenter();/ 第 6 步:第四条规则(敌人)7.遇到捕食者/ 如果我们应该对敌人的羊群做出反应,确定/ 如果有的话,尽可能避免它们。如果(反应敌人)SeeEnemies (flock_id);AccumulateChanges (acc, FleeEnemies
50、();8.保持原速巡航/ 第 7 步:巡航。/ Flockmates or not,敌人与否,弄清楚/ 如果一切由我们决定,我们会移动多快。AccumulateChanges (acc, Cruise();/ 第 8 步:约束加速度/ 如果我们的加速度变化大于我们允许的,约束它9.限制加速度if (acc.length() MaxChange) #ifdef BOID_DEBUGmyprintf(警告:约束 boid %x!n,this);万一/ 绝对太多.限制到最大变化acc.SetMagnitudeOfVector (MaxChange);10.执行新速度/ 第 9 步:实施。/ 这里是我
51、们应用我们新计算的加速度向量的地方/ 创建一个新的速度向量以使用下一个更新周期。m_oldvel = m_vel; / 保存我们之前的速度/ 现在添加加速度m_vel += acc;11.约束Y轴速度/ 第 10 步:约束 Y 速度变化。/ 尝试通过衰减 Y 轴速度来限制直线向上/向下飞行。/ 这不是绝对必要的,但确实会导致看起来更逼真的飞行。m_vel.y *= MaxUrgency;12.限制加速度/ 第 11 步:限制我们的速度。/ 如果我们的移动速度超过了我们允许的移动速度,请限制我们的速度。如果 (m_speed = m_vel.length() MaxSpeed) / 绝对太快了.
52、限制到最大速度#ifdef BOID_DEBUGmyprintf(警告: 约束 boid %x!n,this);myprintf(当前速度 = %f 新速度 = %fn,m_speed, MaxSpeed);万一m_vel.SetMagnitudeOfVector (MaxSpeed);m_speed = 最大速度;12.鱼群翻滚、倾斜等动作/ 第 12 步:计算横滚/俯仰/偏航。/ 在所有这些速度调整废话之后计算我们的方向。计算机RPY();/ 第 13 步:世界边界。13.边界限制/ 如果我们在世界范围之外徘徊,把我们放回去。你可能/ 不需要为你的世界这样做,但这取决于你的实现。世界绑定(
53、);#ifdef BOID_DEBUGmyprintf(最终位置 = %f %f %fn,m_pos.x, m_pos.y, m_pos.z);myprintf(最终速度 = %f %f %fn,m_vel.x, m_vel.y, m_vel.z);myprintf(最终加速度 = %f %f %fn,acc.x, acc.y, acc.z);万一/ 私有集群方法/个体如何反应/ 巡航。/ 生成一个向量,指示一个群体 boid 将如何/喜欢移动,如果这完全取决于他并且他在下面/ 没有其他任何类型的影响。矢量 CBoid:Cruising (void)矢量变化 = m_vel;浮动差异=(m_s
54、peed - DesiredSpeed)/ MaxSpeed;浮动紧迫性=(浮动)晶圆厂(差异);#ifdef BOID_DEBUGmyprintf(n内部巡航n);myprintf( diff = %f 紧急度 = %fn,diff, 紧急度);myprintf( m_speed = %f 所需速度 = %fn,m_speed, DesiredSpeed);myprintf( 巡航初始变化向量 = %f %f %fn,change.x, change.y, change.z);如果(差异 0)myprintf(减速以满足巡航速度.n); 别的 myprintf(加速满足巡航速度.n);万一/
55、 限制紧急程度if (urgency MaxUrgency)紧急= MaxUrgency;/ 现在添加一些“抖动”,以便每个 boid 都有一个/ 一点随机性只是为了让事情变得有趣。/ 如果我们碰巧开始,这也会让我们动起来/ 事情完全静止(这有点无聊)。浮动抖动 = RAND();如果(抖动0.45f)change.x += MinUrgency * SIGN(diff); else if (jitter 0 ? -1 : 1) );更新速度达到期望值#ifdef BOID_DEBUGmyprintf( 巡航的最终变化向量 = %f %f %fn,change.x, change.y, cha
56、nge.z);万一返回(更改);遇到天敌逃脱/ 逃离敌人。/ 为一群群生成一个向量以避免/ 它看到的最近的敌人(不同羊群的群体)。矢量 CBoid:FleeEnemies (void)向量变化;#ifdef BOID_DEBUGmyprintf(nInside FleeEnemiesn);万一/ 测试:我们离最近的敌人太近了吗?如果(m_dist_to_nearest_enemy m_pos;/ 返回变化向量返回(更改);#ifdef BOID_DEBUGmyprintf( 巡航的最终变化向量 = %f %f %fn,change.x, change.y, change.z);万一/ 保持距离
57、。/ 为一群群生成一个向量来维持他的/ 与他看到的最近的羊群同伴的期望间隔距离。防止与看到的同类相撞向量 CBoid:KeepDistance (void)浮动比率 = m_dist_to_nearest_flockmate/SeparationDist;/ 计算朝向我们最近的伙伴的向量矢量变化 = m_nearest_flockmate-m_pos - m_pos;#ifdef BOID_DEBUGmyprintf(nInside KeepDistancen);万一/ 将计算的比率限制为我们的最小/最大紧急级别if (ratio MaxUrgency)比率= MaxUrgency;/ 测试:
58、我们离最近的羊群太近了吗?#ifdef BOID_DEBUGmyprintf(dist_to_nearest_flockmate = %f Sep = %f ratio = %fn,m_dist_to_nearest_flockmate,SeparationDist,ratio);万一如果(m_dist_to_nearest_flockmate SeparationDist) #ifdef BOID_DEBUGmyprintf(太远了!n);万一/ 太远了.向我们的邻居移动change.SetMagnitudeOfVector (ratio); 别的 #ifdef BOID_DEBUGmypr
59、intf(刚刚好!n);万一/ 在 UNLIKELY 事件中,我们距离正确,什么也不做change.SetMagnitudeOfVector (0.0);/ 返回变化向量#ifdef BOID_DEBUGmyprintf( KeepDistance 的最终变化向量 = %f %f %fn,change.x, change.y, change.z);万一返回(更改);与最近的同类保持一致/ 匹配标题。/ 为一群要尝试的群体生成一个向量/匹配最近的flockmate的标题。向量 CBoid:MatchHeading (void)/ 复制我们最近的伙伴的标题矢量变化 = m_nearest_floc
60、kmate-m_vel;#ifdef BOID_DEBUGmyprintf(nInside MatchHeadingn);万一/ 归一化然后缩放我们的向量变化一点.之后/ 我们不能立即捕捉到一个新的标题,可以吗?change.SetMagnitudeOfVector (MinUrgency);/ 返回变化向量#ifdef BOID_DEBUGmyprintf( MatchHeading 的最终变化向量 = %f %f %fn,change.x, change.y, change.z);万一返回(更改);遇到天敌/ 见敌人。/确定给定的flock boid可以看到的敌人flock boid。in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东深圳幼儿园招聘1人笔试备考题库及答案解析
- 2026安徽六安市霍邱县三流乡招考村级后备干部5人笔试备考题库及答案解析
- 2026福建厦门市集美区海凤实验幼儿园非在编人员招聘1人笔试备考题库及答案解析
- 2026黑龙江哈尔滨工业大学继续教育学院招聘16人笔试备考题库及答案解析
- 2026年洛阳嵩县第一批城镇公益性岗位招聘59人笔试备考试题及答案解析
- 2026年宁德师范学院单招职业技能考试备考试题含详细答案解析
- 2026内蒙古阿拉善盟青少年宫招聘舞蹈教师1人笔试备考试题及答案解析
- 2026江西吉安市永新县城乡投资控股集团有限公司招聘城东学府项目部分岗位核减笔试备考题库及答案解析
- 2026年上海第二工业大学单招综合素质考试模拟试题含详细答案解析
- 2026海南乐东县委社会工作部招聘社区专职人员44人(第1号)笔试备考试题及答案解析
- 湖北省圆创高中名校联盟2026届高三2月第三次联合测评生物试卷(含答案解析)
- 2026年赣州职业技术学院单招职业技能考试备考试题附答案详解
- 雇佣老人看门协议书
- 赠与财物协议书模板
- 高一年级英语上册阅读理解专项练习及答案(50篇)
- 颅内肿瘤放疗护理管理
- 低温环境透水混凝土施工工艺方案
- 2025年全国中级经济师考试真题卷含答案经济基础知识
- 锻造加热工作业指导书
- 2025年跆拳道教练职业水平测评试题及答案解析
- 头颈部肿瘤放疗者营养与支持治疗专家共识
评论
0/150
提交评论