动物集群运动行为模型系列之一

申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

文档介绍

动物集群运动行为模型系列之一

动物集群运动行为模型动物集群运动行为模型摘要自然界中很多种生物中都存在着复杂的群集行为,生物学家曾对此做了大量研究,也取得了很多重要的研究成果。群集行为在一定程度上是由群集智能所支配的,所谓群集智能指的是众多简单个体组成群体,通过相互间的合作表现出智能行为的特性。自然界中动物、昆虫常以集体的力量进行躲避天敌、觅食生存,单个个体所表现的行为是缺乏智能的,但由个体组成的群体则表现出了一种有效的复杂的智能行为。本文要做的主要工作是通过建立适当的数学模型,利用计算语言进行仿真,研究群体的集群运动。针对问题一,我们首先寻找其理论基础,国内外专家研究群集行为时主要采用欧拉法和拉格朗日法。通过相关理论的比较发现,解决本题所研究的问题,采用拉格朗日法更佳。为方便研究,本文选取自然界的鱼群作为对象,建立自由游动模型、引入环境R-a模型、并在此基础上建立避开静态障碍物模型,赋予多Agent感知、交互能力,通过对Agent内部状态值的调节改变搜索参数,达到内部状态控制行为选择的目的,最后通过计算机仿真演示动物的集群运动。针对问题二,在前面模型的基础上,进一步引进当Agent遭遇捕食者时的集群运动模拟算法。基于人工鱼群的自组织模型,确立相关的天敌因子,之后根据约束因子分配权重,进行迭代计算,实现鱼群逃逸模拟。针对问题三,分析其信息丰富者对于群运动的影响,以及群运动方向的决策,借鉴种群中的信息传递原理,简化种群内通讯机制,并赋予鱼群一种彼此间可以互相传递信息的通讯方式,融合抽象的信息交互方式,建立动物的群体觅食模型信息交互模型,实现信息对种群对决策运动方向的影响。关键词:群集行为群集智能多Agent微分迭代信息交互群体觅食46\n动物集群运动行为模型一、问题的背景及重述1.1问题的背景生态系统中,动物个体行为比较简单,集群后却表现出异常复杂的群体行为,鱼群,鸟群在运动中表现出连贯一致的整体结构,使得他们能够更好地躲避危险以及提高获得食物的机会。生物的这种集群运动引发人们对群集智能方面的探索。群集智能理论的研究从二十世纪八十年代出现以来,作为一个新兴的领域,得到越来越多的科学家的关注,现在已经成为经济、社会、生物等交叉学科的研究热点。群集智能主要是针对蚂蚁、鸟群等群居生物体行为的观察和研究,是在自然界生物群体表现出来的智能现象的启发下提出的针对简单生物群体的智能涌现现象的具体模式研究。1.2问题的重述通过观看视频和在网上搜索相关资料,这些动物群在运动过程中具有很明显的特征:群中的个体聚集性很强,运动方向、速度具有一致性。着重思考动物集群运动的机理,建立数学模型刻画动物集群运动;建立数学模型刻画鱼群躲避黑鳍礁鲨鱼的运动行为;假定动物中有掌握食物源位置信息、掌握迁徙路线信息的信息丰富者,进一步分析该动物群体中是如何达成群运动方向决策。二、模型假设2.1假设本文中所提到的生物种群是一个独立的生态部落;2.2假设自然鱼的一般游动是随机性的;2.3论文中提到的鱼群数量在短期内的是不发生变化的,即也不考虑鱼的出生率、死亡率;2.4假设同种鱼群个体之间是同质的,只考虑平均水平,不考虑个体差异;2.5该鱼种群不受环境变化影响(地震、海啸等自然灾害);2.6假设环境当中出现食物和障碍物是随机分布的。三、符号说明设单位时间单位面积内在方向上粒子的迁移量粒子浓度扩散率粒子数群体的平移群体面对所处环境反应作出的常规漂移量群体中距离为的个体相互之间的吸引力群体中距离为的个体相互之间的排斥力个体的质量46\n动物集群运动行为模型个体i的位置作用在个体上的合力个体的总数目包括聚集或分散的力下个周期Agent的游动方向个体Agent靠近鱼群游动的方向(向心因子)对齐鱼群时游动的方向(对齐因子)避免碰撞时游动的方向(躲避因子)当前t中该Agent的游动方向(惯性因子)第因子的权重(=1,2,3,4,5,7)个体的位置向量τ每一步时间间隔Agent与Agent的距离为由向心性对Agent引起的期望运动趋势由对齐性对Agent引起的期望运动趋势由避免碰撞性对Agent引起的期望运动趋势、静态障碍物边界切线的方向向量逃逸因子、、与的夹角Agent运动的最大速度Agent运动的最小速度捕食者的最大速度最大偏转角时间46\n动物集群运动行为模型所消耗的食物量消化率自从上次进食以来的时间一个常数,它表明鱼的胃口大小外部刺激的影响自从上次交配以来的时间计算对潜在交配的感知影响对所发现的捕食者的恐惧感对所发现的捕食者距离两条鱼之间的距离遇到捕食者需要旋转的角度四、问题分析自然界存在着大量集结成群进行移动或者觅食的动物,这些动物群在运动过程中具有很明显的特征:群中的个体聚集性很强,运动方向、速度具有一致性。常以集体的力量进行觅食生存,单个个体所表现的行为是缺乏智能的,但由个体组成的群体则表现出了一种有效的复杂的智能行为,也就是群集智能的体现。本文中研究的主要问题是建立模型模拟动物的集群行为,首先寻找动物集群的一些理论依据,诸如欧拉法、拉格朗日法,深入分析其中影响集群的原因包括游动原则、觅食原则、躲避障碍物原则,再建立R-A模型,并利用计算机演示集群行为。在第二问中考虑其鱼群躲避黑鳍礁鲨鱼的运动行为,当鱼群遇到天敌时的逃逸,通过个体逃逸及过程中相互作用来表现群体逃逸行为。当某个Agent发现捕食者时将发送消息给其他的Agent。假设Agent接收到危险信号,将分析捕食者的位置、方向、自身的心理、生理作出相应的逃逸选择,在第一问模型的基础上,引进当Agent遭遇捕食者时的集群运动模拟算法。基于人工鱼群的自组织模型,确立出相关的天敌因子,之后根据约束因子分配权重,迭代计算,实现鱼群逃逸模拟。对于问题三当中,对于所有的生物,无论是群居的还是散居的,因为生存的需要,彼此之间总要发生联系,为了研究信息丰富者对于群集运动方向,分析动物的信息交互,将其通讯机制进行简化分析,针对鱼的觅食行为,在前一问模型建立的基础上,再分析信息丰富着是如何影响种群决策路径的。五、模型的建立与求解46\n动物集群运动行为模型5.1建立数学模型模拟动物的集群运动。5.1.1理论基础通过搜集相关书籍和资料可以知道,关于集群问题的建模和研究方法主要分为以下两类:(1)欧拉法在欧拉法中,一个群集模型中的每个个体成员不作为单个实体来研究,而是通过密度概念将整个群体作为一个连续集描述。欧拉方法的理论基础为费克提出的经典的扩散理论,其模型方程表示为:方程中设单位时间单位面积内在方向上粒子的迁移量记为,为粒子浓度,是扩散率。及为群体通过垂直于x轴的平面的通量,表示群体的平移。同时对流项不仅包含群体中心漂移的速度项,还增加了群体成员间的相互作用,如:该式中,,描述群体面对所处环境反应作出的常规漂移量;、分别描述群体中距离为的个体相互之间的吸引和排斥作用力。其它一些基于欧拉法的研究工作都是在基于上述群集模型的基础上做一些扩充性的探讨。方程中还可以添加的项有来自于同类或环境资源的吸引力或排斥力。(2)拉格朗日法拉格朗日法基本的描述就是每个个体各自的运动方程,这也是一种更加自然的建模和分析方法。举例来说,在拉格朗日法中,牛顿运动方程是一个典型的个体运动方程:其中,是个体的质量,是个体i的位置,是作用在个体上的合力,是个体的总数目。由组成,其中包括聚集或分散的力(即描述个体之间的吸引力作用或排斥力作用)、与邻近个体速度与方向相匹配的作用力、确定的环境影响力如万有引力以及由环境或其它个体行为产生的随机扰动作用力。是这些作用力的总和。当前,很多关于群集行为的研究工作也都是围绕着这些作用力的形式而展开的。(3)理论模型的比较与结论欧拉法因为偏微分方程理论发展得较为完善,因此对由偏微分方程构建的群集模型的理论分析将易于进行,另一个优点就是无需对群体所处环境作空间离散化处理,对于描述大规模密集而没有明显不连续分布的群集行为非常有效。但是,欧拉法也有一个明显的缺点,即忽略了个体的特性。因此,对于很多群体由有限数量的大体积或强调个体智能特性的个体成员组成的情况下,将不太适合使用基于欧拉法的连续集模型,如鱼群、鸟群等的群集行为。欧拉模型中对群体所处物理空间的连续性假设多适合于体型较小的生物群。46\n动物集群运动行为模型当分析由较大体型生物组成的群体如鱼群、鸟群、兽群等时,由此组成的群体所占据的物理空间也会因为每个个体体型的因素而变得相对大许多,这也使得欧拉法对于群体所处物理空间是连续集这一假设在现实中也变得难以满足。故而本题采用基于拉格朗日法的Agent模型模拟动物集群运动。5.1.2模型建立原则为了较为准确的建立数学模型模拟动物的集群运动,我们以自然鱼为原型,建立人工智能鱼群。通过视频的观看和相关书籍资料的查阅及学习,我们提出人工智能鱼群的运动原则如下:(1)一般游动原则a.靠近原则,即尽量靠近邻近鱼群的中心;b.对齐原则,尽量与邻近鱼的运动方向一致;c.避免碰撞原则,尽量避免与邻近鱼碰撞。又由于每条鱼的运动方向是随机性的,这三条规则对改变鱼下一时刻游动方向只起到一定的影响作用,而鱼的游动方向不可能立刻改变,鱼的原本速度还表现了惯性作用。故而自由游动情况下,Agent的下一时刻的运动速度方向主要由惯性速度,对齐速度,向心速度,躲避速度四个因素综合作用决定,如下图所示:(2)鱼群觅食规则鱼类在群体中比单独行动时能更多更快地找到食物。如果鱼群中的一个成员找到了食物,其他成员也可以捕食。当鱼群中各成员之间的距离勉强保持在各自视线之内,则搜索面积最大,自然鱼群集觅食时遵循以下俩点规则:a.离心性:Agent个体前往鱼群外围搜索到近距离的食物;b.追尾性:当其他鱼群聚集在食物所在地时,Agent会追尾上前捕获食物。(3)Agent躲避静态障碍物原则当Agent感知到静态障碍物时,静态障碍物只有位置信息,没有运动信息。Agent46\n动物集群运动行为模型计算出在当前速度下需要转动多大的角度可以避开距离障碍物的最近点,经多次试验验证,这个转角通常在Agent的单步运动能力范围内,即以最小耗能和最近路线避开障碍物。5.1.3模型的建立(1)自由游动模型的建立根据以上原则,考虑到各规则对鱼的影响力不同,我们还需要对各个方向矢量加权,采用层次分析法,以游动原则的所涉及到的速度向量作为四个指标,计算影响Agent下一时刻运动方向的各个方向指标的所占权重因子。自由游动模型算法:建立公式如下:其中其中为下个周期Agent的游动方向,当前t中该Agent的游动方向(惯性因子),为个体Agent靠近鱼群游动的方向(向心因子),为对齐鱼群时游动的方向(对齐因子),为避免碰撞时游动的方向(躲避因子)。分别表示46\n动物集群运动行为模型的权重大小。采用层次法分析,得出判断矩阵:指标惯性因子向心性因子对齐性因子避免碰撞性因子惯性因子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因此,,,,。,惯性因子对下一时刻鱼的速度影响最大。(2)R-a环境模型的建立由于Agent处于鱼群之中,临近鱼对其影响比较复杂,为了进一步量化指标,方便模拟集群运动的实现,现简化Agent的环境因素模型——R-a模型如下所示:46\n动物集群运动行为模型R-a模型将个体与个体之间的相互作用描述为3种作用。设Agent与Agent的距离为:1.当时,表现为一种排斥作用,即躲避性的体现,防止它们出现碰撞冲突;2.当时,表现出一种吸引作用,即向心性的体现,确保鱼群成为一个整体;3.当时,处于一个相对平衡和稳定的状态,与进行速度匹配,避免打破这种平衡距离或出现潜在冲突,即对齐性的体现,保证鱼群朝着相同的方向前进。有了R-a模型,我们即可对三条游动规则的方向矢量作出如下定义:以各原则属性所引起的期望运动趋势作为相应的影响因子。设群体中有N个Agent(1、2、...N,),Agent的位置向量为,运动向量为,每一步时间间隔为τ。1.由向心性对Agent引起的期望运动趋势为:2.由对齐性对Agent引起的期望运动趋势为:3.又避免碰撞性对Agent引起的期望运动趋势为:46\n动物集群运动行为模型将以上影响因子代入(1)式中计算即可的Agent下一时刻的运动方向。其中:,将相关算法利用计算机语言编程,时间微量化逐次迭代就可以得到一般自由运动的鱼群集群运动的模拟。上边两幅二维图中:左图为红色和蓝色鱼群的随机分布图,右图为动物在集群行为后的图像,右图中左侧的鱼群为蓝色鱼群,右侧的鱼群为红色鱼群,其中红色种群和蓝色种群各10个。(程序见附录)(3)鱼群绕开静态障碍物的模型建立感知定义:基于感知问题的复杂性,在虚拟环境里作了简化,设定如下:a.Agent感知食物,捕食者及障碍物的感知范围为Agent运动方向,半径为或的半球,Agent直接从数据库读取位置和运动数据;b.Agent在鱼群中的相互感知,感知范围为半径的球体,通过Agent之间的通信,传递位置和运动信息。基于二维平面的绕行算法:Step1当Agent感知到此刻速度方向上有障碍物,则以此刻位置为原点P作一簇射线。Step2记录射线集合中与障碍物边界有且只有一个交点的射线的方向向量为、,记、与的夹角分别为、。Step3当>,则以作为障碍物绕行因子,反则反之。Step4将绕行因子添加至约束条件中,再次根据约束因子分配权重。46\n动物集群运动行为模型根据经验算法得绕行因子权重与鱼距离障碍物的距离反相关,引入函数量化如下:Step5计算下一刻速度速度,按时间步长法不断迭代并执行,直至运动方向上无障碍物则回归自由游动。算法流程图如下:。基于三维空间的绕行算法:面向Agent作出垂直于水平方向的空间障碍物投影,之后代入二维平面程序中进行计算迭代即可。46\n动物集群运动行为模型上图为鸟群躲避静态障碍物的截图。5.2.建立数学模型刻画鱼群躲避黑鳍礁鲨鱼的运动行为5.2.1相关因素的引入定义1.最大速度:设Agent运动的最大速度为,最小速度为,设捕食者的最大速度,二者比值设为:。定义2.最大偏转角为,,K为常量,v为直线速度。定义3.人工鱼的行为函数是用来度量各行为的参数度量描述。比如:疲劳感、饥饿感、恐惧感属于鱼的内部心理状态,用以下几个公式进行量化:其中其中,带上划线的部分表示人工鱼的内部冲动部分,表示时间,是所消耗的食物量,按实物颗粒数或捕食鱼的数目来衡量,是消化率,其中为常数;46\n动物集群运动行为模型是自从上次进食以来的时间;是一个常数,它表明鱼的胃口大小(大鱼具有较大的值);体现外部刺激的影响,如对邻近食物的感知;包含常数的呈性欲函数;是自从上次交配以来的时间;计算对潜在交配的感知影响;是一常数;和分别表示对所发现的捕食者的恐惧感和距离;,是标称值。5.2.2人工鱼群自组织模型的建立在前面模型的基础上,进一步引进当Agent遭遇捕食者时的集群运动模拟算法。基于人工鱼群的自组织模型,确立相关的天敌因子,之后根据约束因子分配权重,代入迭代计算,实现鱼群逃逸模拟。当鱼群遇到天敌时的逃逸,通过个体逃逸及过程中相互作用来表现群体逃逸行为。当某各Agent发现捕食者时将发送消息给其他的Agent。假设Agent接收到危险信号,将分析捕食者的位置、方向、自身的心理、生理作出相应的逃逸选择。下面将这个逃逸行为模拟为:设Agent的质量为;某遇危险时刻为;速度为46\n动物集群运动行为模型逃逸时期望达到的速度为;其遇到捕食者需要旋转的角度为;Agent逃逸期间防止碰撞的排斥力为。则时间内Agent运动速度、位置的变化可用下式表示:同时定义人工鱼逃逸期间避免碰撞的斥力为,其中、为常量;为两条鱼之间的距离。为有指向的法向量。其中遇到捕食者需要旋转的角度为(的取值由Agent的运动速度与捕食者的运动速度共同决定),如图所示,其中虚线为调整后的速度。IfthenElseifthenElse式中的“-”表示背离捕食者的运动方向,即捕食者在Agent左侧,则Agent向右转,反之亦然。Step1.当Agent感知到探知范围内有捕食者,或收到其他鱼传的的危险信息,迅速确定捕食者位置及其运动速度和方向Step2.计算疲劳度,饥饿感,恐惧感和群体逃逸的排斥力Step3.确定规避的偏转角及逃逸速度,并作为逃逸因子代入约束条件Step4.结合疲劳度,饥饿感,恐惧感和排斥力等确定约束因子的权重Step5.计算下一刻速度速度,按时间步长法不断迭代并执行,直至鱼群整体探知内无捕食者则回归自由游动。46\n动物集群运动行为模型如上图所示:绿色代表天敌,其他四种颜色代表小鱼。在小鱼感知到探知范围内有捕食者,或收到其他鱼传的的危险信息,迅速确定捕食者位置及其运动速度和方向,然后聚群逃离,免受天敌捕食。5.3.群中信息丰富者对群体运动方向的影响的探究5.3.1觅食环境下的信息交互动物不像人们那样说话,因为生存和繁衍的需要,他们同样能够交流,动物是通过某种信号来唤起或影响其他个体行为的方式就是动物间的通讯。他们的通讯方式很多,其中有视觉通讯、听觉通讯、接触通讯、电通讯和化学通讯等,在本题当中融合了上述通讯方式的抽象的信息交互方式。当一个Agent在觅食环境中找到食物时则发出找到食物这样的讯息,而其他未找到食物的Agent如果感知到了这样的讯息就会向发出讯息处聚集。此题中我们以鱼群觅食为研究对象。5.3.2鱼群觅食的中的信息传递机理为方便模型建立,将交互过程定义为Agent之间的消息传递,我们把通信机制简化如下:1.Agent通信范围:以自身质心为中心的,半径为最大吸引距离的球体;2.通信对象:位于的通信范围内的所有Agent;3.通信过程:a)当每一步运动结束位置坐标发生变化后,更新成员库;b)传递位置、运动信息给所有通信对象;c)所有通信对象将它们的位置、运输信息传递给。4.通过与通信对象之间的通信,实现Agent在群体中的局部交互。5.3.3群体信息交互模型的建立为了解信息丰富者在鱼群集群运动中的影响,在前面一些模型建立的基础上,我们主要从鱼群的觅食行为模拟方面进行研究:动物通过与周围同伴交互信息寻找食物的过程46\n动物集群运动行为模型Step1确立鱼群中信息丰富者所占比例;Step2计算鱼群的饥饿度,疲劳度;Step3对信息丰富者引入信息因子,对饥饿者结合自然鱼的觅食特性,即离心性和追尾性,引入离心因子和追尾因子,扩充各自的约束条件并从新赋予相应权重,迭代计算;Step4调整信息丰富者比例,重复上述过程;Step5研究结果,得出结论。六、模型评价欧拉法因为偏微分方程理论发展得较为完善,因此对由偏微分方程构建的群集模型的理论分析将易于进行,另一个优点就是无需对群体所处环境作空间离散化处理,对于描述大规模密集而没有明显不连续分布的群集行为非常有效。但是,欧拉法也有一个明显的缺点,即忽略了个体的特性。因此,对于很多群体由有限数量的大体积或强调个体智能特性的个体成员组成的情况下,将不太适合使用基于欧拉法的连续集模型,如鱼群、鸟群等的群集行为。在解问题一时,继上面所述的两种理论之后先考虑动物群及运动的原则:一般游动原则、鱼群觅食原则、Agent躲避障碍物原则,在此原则基础上建立自由游动模型、R-A模型、躲避障碍物模型。建立模型中有考虑各个因子的对鱼的下一刻游动的影响,采用层次法分析其权重比值,总体思路比较清晰,模型上下的衔接比较好,模型建立比较成功。问题二中在前面模型的基础上,引进当Agent遭遇捕食者时的集群运动模拟算法。基于人工鱼群的自组织模型,确立相关的天敌因子,之后根据约束因子分配权重,进行迭代计算,实现鱼群逃逸模拟,而采用根据约束因子分配权重也有其局限性:1.它在很大程度上都依赖于人们的经验,主观因素的影响很大。它至多只能排除思维过程中的严重非一致性,却无法排除可能存在的片面性。2.比较判断过程较为粗糙,不能用于精度要求较高的决策问题。问题三同样是先分析动物信息传递方式以及信息传递机制建立群体信息交互模型,扩充各自的约束条件并从新赋予相应权重,迭代计算,得出结论。七、参考文献[1]胡晓东,董辰辉,《MATLAB》从入门到精通,北京,人民邮电出版社,2010.6;[2]马莉,《MATLAB数学实验与建模》,北京,清华大学出版社,2010.1;[3]江道平,尹怡欣,班晓娟,孟祥嵩,《群体中Agent基于内部状态的行为选择》,北京,北京科技大学信息工程学院;[4]陈世明,《群集行为的建模与控制方法综述》,江西南昌,华东交通大学电气与电子工程学院;[5]余建平,周新民,陈明,《群体智能典型算法研究综述》,长沙湖南师范大学,数学与计算机科学学院;[6]赵建,曾建潮,《鱼群集群行为的建模与仿真》,太原,太原科技大学系统仿真与计算机应用研究所;[7]赵建,《鱼群群集行为的建模与仿真硕士学位论文》,太原,太原科技大学。46\n动物集群运动行为模型八、附录8.1层次分析法程序a=[11/221];[x,y]=eig(a);eigenvalue=diag(y);lamda=eigenvalue(1);cil=(lamda-2)/1;crl=cil/0;w1=x(:,1)/sum(x(:,1));>>b1=[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);eigenvalue=diag(y);lamda=eigenvalue(1);ci21=(lamda-4)/3;cr21=ci21/0.9;w21=x(:,1)/sum(x(:,1));>>b2=[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=(lamda-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主函数clcclearallcloseallBoids_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.bang_params.duration=0;46\n动物集群运动行为模型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')ticforiRound=1:Boids_params.num_roundsBoids_params.current_round=iRound;Boids_pop=[Boids_pop_blue;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_new_pos(Boids_pop_red,blue_center,2,Boids_params);Boids_pop_blue=new_Boids_pop_blue;Boids_pop_red=new_Boids_pop_red;iRoundendtocmov=close(mov);8.2避开天敌functionv4=Boids_avoid_shark(Boid,shark_pos,Boids_params)%%%%Simplesharkescape%%%%%%if(norm(Boid.pos-shark_pos)>0.5*Boids_params.bound_square_size)v4=[00];elsev4=(Boid.pos-shark_pos)*(1*0.5*Boids_params.bound_square_size)/...(5*Boids_params.bound_square_size-norm(Boid.pos-shark_pos));end46\n动物集群运动行为模型%%%%Advancedsharkescape%%%%%%Boid_shark_vec=shark_pos-Boid.pos;scalar_prod=Boid_shark_vec(1)*Boid.v(1)+Boid_shark_vec(2)*Boid.v(2);if(scalar_prod<0)v4=[00];end8.2.3子函数1.画图函数functionF=Boids_draw(Boids_pop,Boids_params)X=[];Y=[];SQUARE_SIZE=Boids_params.bound_square_size*2;Boids_center_mass=[00];foriBoid=1:Boids_params.pop_sizeBoids_center_mass=Boids_center_mass+Boids_pop(iBoid).pos;endBoids_center_mass=Boids_center_mass/Boids_params.pop_size;%plot(Boids_center_mass(1),Boids_center_mass(2),'or');%holdon;if(rem(Boids_params.current_round,Boids_params.bang_params.cycle)Boids_params.bang_params.duration)plot(Boids_center_mass(1),Boids_center_mass(2),'or');holdon;end%shark_pos.x=1.0*Boids_params.bound_square_size*cos(2*Boids_params.current_round*pi/180);%shark_pos.y=0.4*Boids_params.bound_square_size*sin(5*Boids_params.current_round*pi/180);%plot(shark_pos.x,shark_pos.y,'og');%holdon;46\n动物集群运动行为模型foriBoid=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.pop_size)vectarrow(p0,p1,'b');elsevectarrow(p0,p1,'r');endholdon;endholdoff;%plot(X,Y,'.b');%holdoff;AXIS([-SQUARE_SIZESQUARE_SIZE-SQUARE_SIZESQUARE_SIZE])F=getframe;1.群聚中心函数functioncenter=Boids_get_center(Boids_pop)center=[00];foriBoid=1:size(Boids_pop,1)center=center+Boids_pop(iBoid).pos;endcenter=center/size(Boids_pop,1);2.位置初始化functionBoids_pop=Boids_init(Boids_pop_size);Boids_pop=[];Boids_init_velocity=100*[(rand-0.5)(rand-0.5)];foriBoid=1:Boids_pop_size46\n动物集群运动行为模型xPos=rand*3000-1500;yPos=rand*3000-1500;new_Boid.pos=[xPosyPos];new_Boid.v=Boids_init_velocity;Boids_pop=[Boids_pop;new_Boid];end1.位置限制函数functionnew_Boid=Boids_limit_position(Boid,Boids_params);ifBoid.pos(1)>Boids_params.bound_square_size*0.9&&Boid.v(1)>0Boid.v(1)=Boid.v(1)-Boids_params.bound_speed_param;endifBoid.pos(1)<-Boids_params.bound_square_size*0.9&&Boid.v(1)<0Boid.v(1)=Boid.v(1)+Boids_params.bound_speed_param;endifBoid.pos(2)>Boids_params.bound_square_size*0.9&&Boid.v(2)>0Boid.v(2)=Boid.v(2)-Boids_params.bound_speed_param;endifBoid.pos(2)<-Boids_params.bound_square_size*0.9&&Boid.v(2)<0Boid.v(2)=Boid.v(2)+Boids_params.bound_speed_param;endnew_Boid=Boid;2.速度限制函数functionnew_Boid=Boids_limit_velocity(Boid,Boids_params)ifnorm(Boid.v)>Boids_params.velocity_limitBoid.v=Boid.v*0.5*Boids_params.velocity_limit/norm(Boid.v);endnew_Boid=Boid;3.位置实时更新函数functionnew_Boids_pop=Boids_move_all_to_new_pos(Boids_pop,Hazard,Hunter_Hunted,Boids_params);Boids_pop_size=size(Boids_pop,1);46\n动物集群运动行为模型bang=0;if(rem(Boids_params.current_round,Boids_params.bang_params.cycle)Boids_params.bang_params.duration)bang=1;endnew_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);foriBoid=1:Boids_pop_sizeBoid=Boids_pop(iBoid);v1=Boids_rule1(Boids_pop,Boids_pop(iBoid),Boids_params,bang);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);if(Hunter_Hunted==2)v4=-0.05*v4;elsev4=1.5*v4;endBoid=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;Boid];end8.3Visualc++编写的三维群聚模型#include#include46\n动物集群运动行为模型#include"CFlock.h"#include"CBoid.h"#include"CBox.h"#include"vector.h"////staticvariableinitialization////visiblefriendslist(workspacereusedbyeachflockboid)CBoid*CBoid::VisibleFriendsList[]={NULL};////constructoranddestructormethods////Constructor#1.//Createsanindividualboidwithrandomizedpositionandvelocity.CBoid::CBoid(shortid_v){#ifdefBOID_DEBUGmyprintf("\nCBoidconstructor#1calledforboid%d.\n",id_v);#endifm_id=id_v;m_perception_range=Default_Perception_Range;//generaterandomposition各代产生的随机位置m_pos.x=RAND()*CBox::WorldPtr->GetBoxWidth()/3;m_pos.y=RAND()*CBox::WorldPtr->GetBoxHeight()/3;m_pos.z=RAND()*CBox::WorldPtr->GetBoxLength()/3;//flippositionsforgreaterrandomness产生随机速度if(RAND()>0.5f)m_pos.x*=-1;if(RAND()>0.5f)m_pos.y*=-1;if(RAND()>0.5f)m_pos.z*=-1;//generaterandomvelocity46\n动物集群运动行为模型m_vel.x=RAND();m_vel.z=RAND();//flipvelocitiesforgreaterrandomnessif(RAND()>0.5f)m_vel.x*=-1;if(RAND()>0.5f)m_vel.z*=-1;速度更新//computespeedbasedonvelocitym_speed=m_vel.length();//zerooutorientation初始方向m_ang.x=m_ang.y=m_ang.z=0;//othervaluesm_num_flockmates_seen=0;m_nearest_flockmate=NULL;m_dist_to_nearest_flockmate=INFINITY;m_num_enemies_seen=0;m_nearest_enemy=NULL;m_dist_to_nearest_enemy=INFINITY;m_next=m_prev=NULL;产生一个特殊位置和速度#ifdefBOID_DEBUGPrintData();#endif}//Constructor#2.//Createsanindividualboidwithspecificpositionandvelocity.CBoid::CBoid(shortid_v,vector*pos_v,vector*vel_v,vector*ang_v){#ifdefBOID_DEBUGmyprintf("\nCBoidconstructor#2calledforboid%d.\n",id_v);#endif46\n动物集群运动行为模型m_id=id_v;m_perception_range=Default_Perception_Range;m_pos=pos_v;m_vel=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=INFINITY;m_num_enemies_seen=0;m_nearest_enemy=NULL;m_dist_to_nearest_enemy=INFINITY;m_next=m_prev=NULL;#ifdefBOID_DEBUGPrintData();#endif}//Destructor.//Destroysindicatedboid.CBoid::~CBoid(void){#ifdefBOID_DEBUGmyprintf("\nCBoiddestructorcalledforboid%x\n",this);#endif}////////////////////////////publicflockingmethods//////////////////////////公共聚集方式//FlockIt.//Usedforframe-by-frameupdates;notimedeltasonpositions.46\n动物集群运动行为模型voidCBoid::FlockIt(intflock_id,CBoid*first_boid){vectoracc;#ifdefBOID_DEBUG实时更新位置myprintf("\n=====\nUpdatefor%d\n",m_id);myprintf("posbefore=%f%f%f\n",m_pos.x,m_pos.y,m_pos.z);#endif//Step1:Updateourposition.1.根据速度更新位置//Updateourpositionbasedonthevelocity//vectorwecomputedlasttimearound.m_oldpos=m_pos;//saveoffourpreviouspositionm_pos+=m_vel;//applyvelocities.//Step2:SeeFriends.2.看到同类聚集//Determineifwecanseeanyofourflockmates.SeeFriends(first_boid);//Step3:Flockingbehavior.3.群体行为//Doweseeanyofourflockmates?Ifyes,it'stimetoimplement//thefirstThreeRules(theydon'tmatterifwecan'tseeanybody)if(m_num_flockmates_seen){4.同类间保持间距//Step4:ImplementRule#1(Separation).//Trytomaintainourdesiredseparationdistancefromournearestflockmate.AccumulateChanges(acc,KeepDistance());//Step5:ImplementRule#2(Alignment).5.保持一定队形//Trytomovethesamewayournearestflockmatedoes.AccumulateChanges(acc,MatchHeading());//Step6:ImplementRule#3(Cohesion).6.向中心凝聚//Trytomovetowardsthecenteroftheflock.AccumulateChanges(acc,SteerToCenter());46\n动物集群运动行为模型}//Step6:TheFourthRule(enemies)7.遇到捕食者//Ifwe'resupposedtoreacttoenemyflocks,determine//ifthereareanythenavoidthemifwecan.if(ReactToEnemies){SeeEnemies(flock_id);AccumulateChanges(acc,FleeEnemies());}8.保持原速巡航//Step7:Cruising.//Flockmatesornot,enemiesornot,figureout//howfastwe'dmoveifitwerealluptous.AccumulateChanges(acc,Cruising());//Step8:Constrainacceleration//Ifouraccelerationchangeismorethanweallow,constrainit9.限制加速度if(acc.length()>MaxChange){#ifdefBOID_DEBUGmyprintf("WARNING:constrainingaccelerationforboid%x!\n",this);#endif//definitelytoomuch...constraintomaximumchangeacc.SetMagnitudeOfVector(MaxChange);}10.执行新速度//Step9:Implementation.//Here'swhereweapplyournewlycomputedaccelerationvector//tocreateanewvelocityvectortousenextupdatecycle.m_oldvel=m_vel;//saveoffourpreviousvelocity//nowaddintheaccelerationm_vel+=acc;11.约束Y轴速度//Step10:constraintYvelocitychanges.46\n动物集群运动行为模型//Attempttorestrictflightstraightup/downbydampingoutYaxisvelocity.//Thisisn'tstrictlynecessary,butdoesleadtomorerealisticlookingflight.m_vel.y*=MaxUrgency;12.限制加速度//Step11:Constrainourspeed.//Ifwe'removingfasterthanwe'reallowedtomove,constrainourvelocity.if((m_speed=m_vel.length())>MaxSpeed){//definitelytoofast...constraintomaximumspeed#ifdefBOID_DEBUGmyprintf("WARNING:constrainingspeedforboid%x!\n",this);myprintf("currentspeed=%fnewspeed=%f\n",m_speed,MaxSpeed);#endifm_vel.SetMagnitudeOfVector(MaxSpeed);m_speed=MaxSpeed;}12.鱼群翻滚、倾斜等动作//Step12:Computeroll/pitch/yaw.//Computeourorientationafterallthisspeedadjustmentnonsense.ComputeRPY();//Step13:Worldboundaries.13.边界限制//Ifwe'vewanderedoutsidetheworldboundsputusbackin.Youmight//notneedtodothisforyourworld,butthatdependsonyourimplementation.WorldBound();#ifdefBOID_DEBUGmyprintf("finalposition=%f%f%f\n",m_pos.x,m_pos.y,m_pos.z);myprintf("finalvelocity=%f%f%f\n",m_vel.x,m_vel.y,m_vel.z);myprintf("finalacceleration=%f%f%f\n",acc.x,acc.y,acc.z);#endif}/////////////////////////////privateflockingmethods46\n动物集群运动行为模型///////////////////////////个体如何反应//Cruising.//Generatesavectorindicatinghowaflockboidwould//liketomove,ifitwerealluptohimandhewasunder//nootherinfluencesofanykind.vectorCBoid::Cruising(void){vectorchange=m_vel;floatdiff=(m_speed-DesiredSpeed)/MaxSpeed;floaturgency=(float)fabs(diff);#ifdefBOID_DEBUGmyprintf("\nInsideCruising\n");myprintf("diff=%furgency=%f\n",diff,urgency);myprintf("m_speed=%fdesiredspeed=%f\n",m_speed,DesiredSpeed);myprintf("initialchangevectorfromCruising=%f%f%f\n",change.x,change.y,change.z);if(diff>0){myprintf("slowingdowntomeetcruisingspeed...\n");}else{myprintf("speedinguptomeetcruisingspeed...\n");}#endif//constraintheurgencylevelif(urgencyMaxUrgency)urgency=MaxUrgency;//Nowaddsome"jitter"sothateachboidhasa//bitofrandomnessjusttokeepthingsinteresting.//Thiswillalsogetusmovingifwehappentostart//thingsstandingperfectlystill(whichissortaboring).floatjitter=RAND();if(jitter<0.45f){change.x+=MinUrgency*SIGN(diff);}elseif(jitter<0.90f){change.z+=MinUrgency*SIGN(diff);}else{change.y+=MinUrgency*SIGN(diff);//wedon'tlikeverticalmotionallthatmuch46\n动物集群运动行为模型}#ifdefBOID_DEBUGmyprintf("intermediatechangevectorfromCruising=%f%f%f\n",change.x,change.y,change.z);#endif//computevelocitychangenecessarytogettoourdesiredcruisingspeedchange.SetMagnitudeOfVector((urgency*(diff>0?-1:1)));更新速度达到期望值#ifdefBOID_DEBUGmyprintf("finalchangevectorfromCruising=%f%f%f\n",change.x,change.y,change.z);#endifreturn(change);}遇到天敌逃脱//FleeEnemies.//Generatesavectorforaflockboidtoavoidthe//nearestenemy(boidofadifferentflock)itsees.vectorCBoid::FleeEnemies(void){vectorchange;#ifdefBOID_DEBUGmyprintf("\nInsideFleeEnemies\n");#endif//test:Arewetooclosetoournearestenemy?if(m_dist_to_nearest_enemym_pos;}//returnchangevector46\n动物集群运动行为模型return(change);#ifdefBOID_DEBUGmyprintf("finalchangevectorfromCruising=%f%f%f\n",change.x,change.y,change.z);#endif}//KeepDistance.//Generatesavectorforaflockboidtomaintainhis//desiredseparationdistancefromthenearestflockmatehesees.防止与看到的同类相撞vectorCBoid::KeepDistance(void){floatratio=m_dist_to_nearest_flockmate/SeparationDist;//computevectortowardsournearestbuddyvectorchange=m_nearest_flockmate->m_pos-m_pos;#ifdefBOID_DEBUGmyprintf("\nInsideKeepDistance\n");#endif//constraincomputedratiotoourmin/maxUrgencylevelsif(ratioMaxUrgency)ratio=MaxUrgency;//test:arewetooclosetoournearestflockmate?#ifdefBOID_DEBUGmyprintf("dist_to_nearest_flockmate=%fSep=%fratio=%f\n",m_dist_to_nearest_flockmate,SeparationDist,ratio);#endifif(m_dist_to_nearest_flockmateSeparationDist){#ifdefBOID_DEBUGmyprintf("toofaraway!\n");#endif//toofaraway...movetowardsourneighborchange.SetMagnitudeOfVector(ratio);}else{#ifdefBOID_DEBUGmyprintf("justright!\n");#endif//intheUNLIKELYeventwe'reexactlytherightdistanceaway,donothingchange.SetMagnitudeOfVector(0.0);}//returnchangevector#ifdefBOID_DEBUGmyprintf("finalchangevectorfromKeepDistance=%f%f%f\n",change.x,change.y,change.z);#endifreturn(change);}与最近的同类保持一致//MatchHeading.//Generatesavectorforaflockboidtotry//tomatchtheheadingofitsnearestflockmate.vectorCBoid::MatchHeading(void){//copytheheadingofournearestbuddyvectorchange=m_nearest_flockmate->m_vel;46\n动物集群运动行为模型#ifdefBOID_DEBUGmyprintf("\nInsideMatchHeading\n");#endif//normalizeandthenscaleourvectorchangeabit...after//allwecan'tinstantlysnaptoanewheading,canwe?change.SetMagnitudeOfVector(MinUrgency);//returnchangevector#ifdefBOID_DEBUGmyprintf("finalchangevectorfromMatchHeading=%f%f%f\n",change.x,change.y,change.z);#endifreturn(change);}遇到天敌//SeeEnemies.//Determineswhichenemyflockboidsagivenflockboidcansee.intCBoid::SeeEnemies(intflock_id){floatdist;CBoid*enemy;#ifdefBOID_DEBUGmyprintf("\nInsideSeeEnemies\n");#endif//initializeenemydatam_num_enemies_seen=0;m_nearest_enemy=NULL;m_dist_to_nearest_enemy=INFINITY;遇到天敌翻滚//loopovereachflockanddeterminetheclosestonewecanseefor(inti=0;iGetFirstMember();while(enemy!=NULL){#ifdefVISIBILITY_DEBUGmyprintf("lookingat%x\n",enemy);#endif//ifthisenemyisvisible...if((dist=CanISee(enemy))!=INFINITY){//Icanseeit..incrementcounterm_num_enemies_seen++;//Test:Closestenemy?if(distGetNext();}}46\n动物集群运动行为模型#ifdefVISIBILITY_DEBUGmyprintf("\n");myprintf("totalenemiesseen=%d\n",m_num_enemies_seen);myprintf("nearestenemyis%xat%f\n",m_nearest_enemy,m_dist_to_nearest_enemy);#endifreturn(m_num_enemies_seen);}//SeeFriends.看到同类如何反应//Determineswhichflockmatesagivenflockboidcansee.intCBoid::SeeFriends(CBoid*first_boid){floatdist;CBoid*flockmate=first_boid;#ifdefBOID_DEBUGmyprintf("\nInsideSeeFriends\n");#endif#ifdefVISIBILITY_DEBUGmyprintf("Buildingvisibiltylistfor%x...\n",this);#endif//cleartheexistingvisibilitylistofanyholdoverfromlastroundClearVisibleList();//nowfigureoutwhowecanseewhile(flockmate!=NULL){//Test:Withinsightofthisboid?#ifdefVISIBILITY_DEBUGmyprintf("lookingat%x\n",flockmate);#endifif((dist=CanISee(flockmate))!=INFINITY){46\n动物集群运动行为模型//addittothelistAddToVisibleList(flockmate);//Test:Ifthisguyiscloserthanthecurrent//closest,makehimthecurrentclosestif(distGetNext();}#ifdefVISIBILITY_DEBUGmyprintf("\n");myprintf("totalflockmatesseen=%d\n",m_num_flockmates_seen);myprintf("nearestflockmateis%xat%f\n",m_nearest_flockmate,m_dist_to_nearest_flockmate);#endifreturn(m_num_flockmates_seen);}//SteerToCenter.//Generatesavectortoguideaflockboidtowards//the"centerofmass"oftheflockmateshecansee.vectorCBoid::SteerToCenter(void){vectorcenter,change;#ifdefBOID_DEBUGmyprintf("\nInsideSteerToCenter\n");#endif//walkdownthevisibilitylistandsumuptheirpositionvectorsfor(inti=0;im_pos;}#ifdefBOID_DEBUGmyprintf("perceivedcenterbeforeaveraging=%f%f%f\n",center.x,center.y,center.z);myprintf("num_flockmates_seen=%d\n",m_num_flockmates_seen);#endif//averagethepositionstogettheperceivedcenteroftheflockcenter/=m_num_flockmates_seen;#ifdefBOID_DEBUGmyprintf("perceivedcenterafteraveraging=%f%f%f\n",center.x,center.y,center.z);#endif//nowthatwehavetheperceivedcenter,computeravectortowardsitchange=center-m_pos;//Scalethechangevectorsowedon'tturnonadime..change.SetMagnitudeOfVector(MinUrgency);#ifdefBOID_DEBUGmyprintf("finalchangevectorfromSteerToCenter=%f%f%f\n",change.x,change.y,change.z);#endif//returnchangevectorreturn(change);}遇到边界鱼停止运动//WorldBound.//Implementsaworldboundarysothatflocksdon'tfly//infinitelyfarawayfromthecamera,insteadremaining//inaniceviewablearea.Itdoesthisbywrappingflock//boidsaroundtotheothersideoftheworld,so(forexample)//theymoveouttherightandreturnontheleft.//Returns:nothing.voidCBoid::WorldBound(void){46\n动物集群运动行为模型floatmaxX=CBox::WorldPtr->GetBoxWidth()/2;floatmaxY=CBox::WorldPtr->GetBoxHeight()/2;floatmaxZ=CBox::WorldPtr->GetBoxLength()/2;floatminX=-maxX;floatminY=-maxY;floatminZ=-maxZ;#ifdefBOID_DEBUGmyprintf("\nInsideWorldbound\n");#endif//testpositionofflockboidand//'warp'ifthey'vestrayedoutofboundsif(m_pos.x>maxX){m_pos.x=minX;}elseif(m_pos.xmaxY){m_pos.y=minY;}elseif(m_pos.ymaxZ){m_pos.z=minZ;}elseif(m_pos.zm_pos));#ifdefVISIBILITY_DEBUGmyprintf("distbetween%xand%x=%f\n",this,ptr,dist);#endif//ifwe'reusingtruthdata,don'tbothertochecksightingif(UseTruth)return(dist);//notusingtruth,sochecksightingif(m_perception_range>dist)return(dist);//fellthrough;can'tseeitreturn(INFINITY);}//ComputeRPY.//Computestheroll/pitch/yawoftheflockboidbasedonits//latestvelocityvectorchanges.Roll/pitch/yawarestoredin//the"ang"databoidasfollows://pitchisaboutthexaxis//yawisabouttheyaxis//rollisaboutthezaxis////Allcalculationsassumearight-handedcoordinatesystem://+x=throughtheleftsideoftheobject//+y=up//+z=throughthenoseofthemodel////Allanglesarecomputedinradians.////NOTE:ThisalgorithmwasgenerouslyprovidedbyChristopherKline,whooriginally//developeditfor*his*flockingapplications.ThanksChristopher!46\n动物集群运动行为模型voidCBoid::ComputeRPY(void){floatroll,pitch,yaw;//Determinethedirectionofthelateralacceleration.vectorlateralDir=(m_vel%(m_vel-m_oldvel))%m_vel;lateralDir.GetDirection();//Setthelateralacceleration'smagnitude.Themagnitudeisthevector//projectionoftheappliedAccelerationvectorontothedirectionofthe//lateralacceleration).floatlateralMag=(m_vel-m_oldvel)*lateralDir;//computerollif(lateralMag==0){roll=0.0f;}else{roll=(float)-atan2(GRAVITY,lateralMag)+HALF_PI;}//computepitchpitch=(float)-atan(m_vel.y/sqrt((m_vel.z*m_vel.z)+(m_vel.x*m_vel.x)));//computeyawyaw=(float)atan2(m_vel.x,m_vel.z);//storethemm_ang.x=pitch;m_ang.y=yaw;m_ang.z=roll;#ifdefBOID_DEBUGmyprintf("roll=%fpitch=%fyaw=%f\n",roll,pitch,yaw);#endif46\n动物集群运动行为模型}//SetNext.//Setthe"next"pointerofanindividualboid.voidCBoid::SetNext(CBoid*ptr){m_next=ptr;}//GetNext.//Returnsthe"next"pointeroftheinvokingboid.CBoid*CBoid::GetNext(){return(m_next);}//SetPrev.//Setthe"prev"pointerofanindividualboid.voidCBoid::SetPrev(CBoid*ptr){m_prev=ptr;}//GetOrient.//Returnstheorientationoftheboidinquestion.vector*CBoid::GetOrient(void){return(&m_ang);}//GetPos.46\n动物集群运动行为模型//Returnsthepositionoftheboidinquestion.vector*CBoid::GetPos(void){return(&m_pos);}//LinkOut.//Removesaboidfromalist.voidCBoid::LinkOut(){//testlocationofboidif((m_next==NULL)&&(m_prev==NULL)){SetNext(NULL);SetPrev(NULL);}elseif(m_next==NULL){m_prev->SetNext(NULL);}elseif(m_prev==NULL){m_next->SetPrev(NULL);}else{m_prev->SetNext(m_next);m_next->SetPrev(m_prev);}输出一个鱼的各个属性}//PrintData//Dumpsalldatadescribingagivenboid.voidCBoid::PrintData(void){myprintf("===================\n");46\n动物集群运动行为模型myprintf("Dataforboid=%d@%x\n",m_id,this);myprintf("perception_range=%f\n",m_perception_range);myprintf("posx,y,z=%f%f%f\n",m_pos.x,m_pos.y,m_pos.z);myprintf("velx,y,z=%f%f%f\n",m_vel.x,m_vel.y,m_vel.z);myprintf("roll,pitch,yaw=%f%f%f\n",m_ang.z,m_ang.x,m_ang.y);myprintf("speed=%f\n",m_speed);myprintf("num_flockmates_seen=%d\n",m_num_flockmates_seen);myprintf("nearest_flockmate=%x\n",m_nearest_flockmate);myprintf("dist_to_nearest_flockmate=%f\n",m_dist_to_nearest_flockmate);myprintf("num_enemies_seen=%d\n",m_num_enemies_seen);myprintf("nearest_enemy=%x\n",m_nearest_enemy);myprintf("dist_to_nearest_enemy=%f\n",m_dist_to_nearest_enemy);}内部资料仅供参考9JWKffwvG#tYM*Jg&6a*CZ7H$dq8KqqfHVZFedswSyXTy#&QA9wkxFyeQ^!djs#XuyUP2kNXpRWXmA&UE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmUE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z8vG#tYM*Jg&6a*CZ7H$dq8KqqfHVZFedswSyXTy#&QA9wkxFyeQ^!djs#XuyUP2kNXpRWXmA&UE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^G89AmUE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z8vG#tYM*Jg&6a*CZ7H$dq8KqqfHVZFedswSyXTy#&QA9wkxFyeQ^!djs#XuyUP2kNXpRWXmA&UE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmUE9aQ@Gn8xp$R#͑Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^GjqvadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%MadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*adNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%MzadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@adNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^GjqvUE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3adNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz84!z89Amv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^GjqvtnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqvz849Gx^Gjqv^$U*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNuGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5ux^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7Jv#nD6YWRrWwc^vR9CpbK!zn%MzFA5uxY7JnD6YWRrWwc^vR9CpbK!zn%Mz849Gx^Gjqv^$UE9wEwZ#Qc@UE%&qYp@Eh5pDx2zVkum&gTXRm6X4NGpP$vSTT#&ksv*3tnGK8!z89AmYWpazadNu##KN&MuWFA5uxY7Jv#nD6YWRrWwc^vR9CpbK!zn%MzXNQExJB8VK#%W7m$ZA5JdkVWce9APz^FvJzwYWCcyAh*bnxBvaFQH8YHV$#&3Q3vdWe3YXvbJr内部资料仅供参考图2-3:地块位置图46\n动物集群运动行为模型46
查看更多

相关文章

您可能关注的文档