Java 羊群行为问题

Java 羊群行为问题,java,simulation,artificial-life,boids,Java,Simulation,Artificial Life,Boids,昨天我遇到了Craig Reynolds’,随后我想我会尝试用Java实现一个简单的2D版本。 我已经建立了一个非常基本的设置,它是基于 然而,在我看来,我有一些相当奇怪的行为。目前,我的boids相当快地移动到一个粗糙的网格或格子中,并开始当场抽搐。我的意思是,它们会移动一点,并且旋转得非常频繁 目前,我已实施: 对齐 凝聚力 分离 限速 最初,我的BOID随机分布在整个屏幕区域(与Parker的方法略有不同),它们的速度都指向屏幕区域的中心(请注意,随机初始化的速度给出相同的结果)。更改“速

昨天我遇到了Craig Reynolds’,随后我想我会尝试用Java实现一个简单的2D版本。 我已经建立了一个非常基本的设置,它是基于

然而,在我看来,我有一些相当奇怪的行为。目前,我的boids相当快地移动到一个粗糙的网格或格子中,并开始当场抽搐。我的意思是,它们会移动一点,并且旋转得非常频繁

目前,我已实施:

  • 对齐
  • 凝聚力
  • 分离
  • 限速
  • 最初,我的BOID随机分布在整个屏幕区域(与Parker的方法略有不同),它们的速度都指向屏幕区域的中心(请注意,随机初始化的速度给出相同的结果)。更改“速度限制”值只会更改Boid进入此图案的速度,而不会更改图案的形成

    在我看来,这可能是:

  • 我使用的参数的结果(目前我的代码如Parker的伪代码所述;我还没有尝试过由Reynolds所述的角度和半径定义的影响区域。)
  • 我需要实施但不知道的事情
  • 我做错了什么
  • 预期的行为将更像雷诺兹boids页面上小程序中发生的二维版本,尽管目前我还没有实现任何让boids保持在屏幕上的方法


    以前有人遇到过这种情况吗?有关于原因和/或如何解决的想法吗?如果有帮助的话,我可以发布一个有问题的行为的.gif。

    如果他们看到每个人,他们都会尝试以平均速度移动。如果他们只看到一些,可能会有一些分离的群体

    如果它们是随机分布的,它将接近于零

    如果你用矩形限制它们,或者将它们从墙壁上推开,或者当它们靠近时将它们传送到另一边,并且它们的间隔太高,它们将被从墙壁上推出来(从墙壁本身或者从刚刚被传送的其他人那里推出来,然后这些人将被推到另一边(然后再推下去)


    因此,尝试更紧密的内聚、有限的视野、更大的空间,并将它们聚集在一起(选择随机点并将多个随机点放置在离它们很小的随机距离处),而不是均匀或正常分布。

    我也遇到了这个问题。我通过确保更新每个boid速度的方法将新速度添加到旧速度上,而不是重置它来解决这个问题。本质上,发生的事情是这样的:boids试图彼此远离,但无法加速(因为它们的速度被重置,而不是增加,因为它们应该增加),因此“抽搐”。更新速度的方法应该如下所示

    def set_velocity(self, dxdy):
        self.velocity = (self.velocity[0] + dxdy[0], self.velocity[1] + dxdy[1])
    

    其中velocity和dxdy是2元组

    也许您对分离规则的权重太大,导致所有BOID尽可能远离所有相邻BOID。在我的伪代码中有各种各样的常量,它们充当权重:规则1中的/100和规则3中的/8(以及规则2中的隐式*1);这些参数可以调整,这对于模拟不同的行为(如密集成群的昆虫或滑翔的鸟类)非常有用

    此外,还应修改分离规则中的任意|距离|<100,以匹配模拟的单位;这条规则应该只适用于距离很近的BOID,基本上是为了避免碰撞


    玩得开心

    我想知道您是否对碰撞矩形有问题。如果你实现了基于重叠矩形的东西(比如说),当两个矩形足够近以至于任何移动都会导致它们相交时,你就可以得到你描述的行为。(如果一个矩形最终完全位于另一个矩形内,则情况更糟。)

    解决这个问题的一个方法是确保每个boid只朝着一个向前的方向看。然后你可以避免这样的情况:A不能移动,因为B在前面靠得太近,而B不能移动,因为A在后面靠得太近


    快速检查是实际绘制所有碰撞矩形,并将任何相交矩形涂成不同颜色。它通常能提供关于停止和抽搐原因的线索。

    据我所知,我不需要将它们集中分布。然而,我已经实现了限制对齐和内聚的范围(Parker的伪代码中已经完成了分离)。对于一个相当小的内聚极限半径,我发现同样的问题以不同的方式表现出来——Boid现在形成集群,然后像以前一样振荡。这至少是一个改进,因为我们有集群(这是有意义的,因为内聚不再是全局的)。如果有帮助的话,我的boid是高度和宽度为30x20的三角形,分离半径现在为50,内聚半径为75,对齐半径为80。这是一个值得检查的好建议,但我向你保证,这不是我问题的原因。我正在正确地更新速度,将它设置为当前速度和计算出的boid加速度之和。哇!他自己!非常感谢-当您了解如何实现群集行为时,您的伪代码页是一个巨大的帮助。今天晚些时候,我会玩各种重量的游戏——希望能有帮助。我的规则二也会导致抽搐,但疖子还是会动。还有其他建议吗?我试着做了规则2的平方反比版本,但是没有用,只是增加了抽搐的频率,减少了抽搐的幅度。这是个好主意,但我没有使用矩形。我没有做任何碰撞检测,只是将boid建模为点,并依靠应用的分离力来防止碰撞的发生。据我所知,这是植绒的标准。