Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
think-comp-2e-zh
提交
8866b2f1
T
think-comp-2e-zh
项目概览
OpenDocCN
/
think-comp-2e-zh
8 个月 前同步成功
通知
0
Star
16
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
think-comp-2e-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
8866b2f1
编写于
4月 12, 2018
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
10.
上级
2f331e1e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
118 addition
and
0 deletion
+118
-0
10.md
10.md
+118
-0
img/10-2.png
img/10-2.png
+0
-0
未找到文件。
10.md
浏览文件 @
8866b2f1
...
...
@@ -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 类似于一群鸟;其他设置类似于鱼群或一片飞虫。
img/10-2.png
0 → 100644
浏览文件 @
8866b2f1
8.9 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录