提交 8866b2f1 编写于 作者: W wizardforcel

10.

上级 2f331e1e
......@@ -112,3 +112,121 @@ class Driver:
在某些情况下,堵塞本身会向后传播,如果你观看本章的笔记本中的动画,您可以看到它。
## 10.2 随机噪声
![](img/10-2.png)
图 10.2:平均速度和汽车数量的函数,带有三个大小的附加随机噪声
随着汽车数量的增加,交通堵塞变得更加严重。 图?显示了汽车能够达到的平均速度,相对于汽车数量的函数。
最上面那行显示`eps = 0`的结果;也就是说,速度没有随机变化。 如果汽车数量少于 25 辆,则汽车之间的间隔大于 40,这样汽车可以达到并保持 40 的最大速度。超过 25 辆汽车形成交通堵塞,平均速度迅速下降。
这种效果是仿真物理学的直接结果,所以它不应该令人惊讶。 如果道路的长度为 1000,则`n`个车辆之间的间距为`1000 / n`。 而且由于汽车的行驶速度不超过前面的空间,所以我们预计,最高平均车速为`1000 / n`或 40,取最小者。
但这是最好的情况。只有少量的随机性,情况会变得更糟。
图?也显示了`eps = 0.001``eps = 0.01`的结果,其对应于 0.1% 和 1% 的速度误差。
即使有少量噪音,高速路的容量也会从 25 降至 20(“容量”是指可以达到并保持速度限制的最大车辆数量。 如果有 1% 的误差,容量会下降到 10。
作为本章结尾的练习之一,您将有机会设计出更好的驾驶员; 也就是说,您将在`choose_acceleration`中尝试不同的策略,并查看您是否可以找到可提高平均速度的驾驶行为。
## 10.3 Boids
1987 年,Craig Reynolds 发表了《兽群,鸟群和鱼群:分布式行为模型》(Flocks, herds and schools: A distributed behavioral model),描述了一个基于智能体的兽群行为模型。 您可以从 <http://www.red3d.com/cwr/papers/1987/boids.html> 下载他的论文。
这种模型中的智能体被称为“boids”,既是“bird-oid”的缩写,又是“bird”的口音发音(虽然 boids 也用于模拟鱼类和集中的陆生动物)。
每个智能体模拟了三种行为:
避免碰撞:
避开障碍物,包括其他鸟类。
鸟群集中:
移向鸟群的中心。
速度匹配:
将速度(速率和方向)与邻近的鸟类对齐。
Boid 只根据局部信息做出决定;每个 boid 只能看到(或注意)其视野范围内的其他 boid。
在本书的仓库中,您会发现`Boids7.py`,它包含我的 boids 实现,部分基于《Flake, The Computational Beauty of Nature》(雪花:自然的计算之美)中的描述。
该程序定义了两个类:`Boid`,实现了 boid 算法,和`World`,包含`Boid`列表和吸引`Boid`的“胡萝卜”列表。
boid 算法使用`get_neighbors`在视野中查找其他 boid:
```py
def get_neighbors(self, others, radius, angle):
boids = []
for other in others:
if other is self:
continue
offset = other.pos - self.pos
# if not in range, skip it
if offset.mag > radius:
continue
# if not within viewing angle, skip it
if self.vel.diff_angle(offset) > angle:
continue
# otherwise add it to the list
boids.append(other)
return boids
```
`get_neighbors`使用向量减法来计算从`self``other`的向量。 这个向量的们是到另一个 boid 的距离。 `diff_angle`计算`self`的速度(也是视线)与另一个 boid 之间的角度。
`center`寻找视野中 boid 的质心,并返回一个指向它的向量:
```py
def center(self, others):
close = self.get_neighbors(others, r_center, a_center)
t = [other.pos for other in close]
if t:
center = sum(t)/len(t)
toward = vector(center - self.pos)
return limit_vector(toward)
else:
return null_vector
```
同样,`avoid`寻找范围内任何障碍物的质心,并返回一个指向它的向量,`copy`将返回当前朝向和邻居的平均朝向之间的差,`love `计算出胡萝卜的朝向。
`set_goal`计算这些目标的加权总和并设定总体目标:
```py
def set_goal(self, boids, carrot):
self.goal = (w_avoid * self.avoid(boids, carrot) +
w_center * self.center(boids) +
w_copy * self.copy(boids) +
w_love * self.love(carrot))
```
最后`move`更新 boid 的速度,位置和姿势。
```py
def move(self, mu=0.1):
self.vel = (1-mu) * self.vel + mu * self.goal
self.vel.mag = 1
self.pos += dt * self.vel
self.axis = b_length * self.vel.norm()
```
新速度是旧速度和目标的加权和。 参数`mu`决定鸟类能够多快地改变速度和方向。 时间步长`dt`决定了 boids 移动的距离。
许多参数影响鸟群行为,包括每个行为的范围,角度和权重以及可操作性`mu`
这些参数决定了 boids 形成和维持鸟群的能力,以及鸟群中运动和组织的模式。 对于某些设置,boids 类似于一群鸟;其他设置类似于鱼群或一片飞虫。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册