boids 的平方反比排斥 boids 不均匀

Inverse square separation of boids repels boids unevenly

我是编程新手,我正在尝试在 python 中制作一个小鸟群算法,到目前为止,我已经编写了一种使用平方反函数使鸟群彼此分开的方法,它看起来像这样:

def separation(self, boids):
    repulsion = Vector(0, 0)
    magnitude = 0
    for Boid in boids:
        if Boid != self:
            distance = Boid.position - self.position
            if np.linalg.norm(distance) < 100:
                magnitude = 100/(np.linalg.norm(distance) ** 2)
                direction = math.atan2(distance.y, distance.x)
                repulsion = repulsion - Vector(magnitude * cos(direction), magnitude * sin(direction))

    return repulsion

由于一个 boid 没有特权或任何东西,任何两个 boid 应该以相同的力量相互排斥。然而,当我 运行 对 2 个 boid 相隔 10 个单位且没有初始速度的测试时,一个 boid 的加速明显快于另一个。我追踪错误到 boids 用来计算排斥强度的距离变量,我让两个 boids 打印这个变量。在第一个时间帧中,一个 boid 将另一个视为 10 个单位,而另一个将其视为 11 个单位(实际上,它是 -11,但由于它是平方的,所以符号并不重要)。然后我打印出它们的位置并减去它们以在第一帧时间手动计算它们的距离值,看看它是否与距离方程有关,并且它产生了 10 和 -10,正确的值。我试过将距离变量重写为 self.distance 然后写 self.distance = Boid.distance 让两个 boids 看到彼此相同的距离,但它没有区别。

您正在一次更新每个 boid。一些 boids 在他们有机会之前看到其他人移动。这意味着他们从来没有像另一个人看到他们那样近距离地看到另一个人。这就是不对称的根源。

问题在于何时将分离调用的结果应用于 boid 的位置。

您需要同时更新所有位置。也就是说,在更新位置以响应排斥力之前,您需要完成所有分离调用。


这样想我有两个变量

a = 1
b = 1

我想将它们中的每一个添加到另一个。如果我这样做:

a += b
b += a

我得到:

a == 2
b == 3

这不是我想要的。

我希望它们都是 2

如果我这样做而不是像这样:

(a, b) = (a + b, b + a)

我得到了我想要的。

现在这个花哨的表达隐藏了一个真相。可以不写,以示这一点。

a_ = a + b
b_ = b + a

a = a_
b = b_