Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
think-comp-2e-zh
提交
a3678bd2
T
think-comp-2e-zh
项目概览
OpenDocCN
/
think-comp-2e-zh
9 个月 前同步成功
通知
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 搜索 >>
提交
a3678bd2
编写于
4月 13, 2018
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
11.
上级
9349493c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
89 addition
and
0 deletion
+89
-0
11.md
11.md
+89
-0
img/11-1.png
img/11-1.png
+0
-0
未找到文件。
11.md
浏览文件 @
a3678bd2
...
...
@@ -146,3 +146,92 @@ class Simulation:
+
`choose_replacements`
决定哪些智能体在此时间步中繁殖,在每个智能体上调用
`copy`
,并返回一个新的
`Agent`
对象的数组。
在这个版本的模拟中,每个时间步中新智能体的数量等于死亡智能体的数量,所以活动智能体的数量是恒定的。
## 11.5 没有差异
在我们运行模拟之前,我们必须指定
`choose_dead`
和
`choose_replacements`
的行为。 我们将从这些函数的简单版本开始,它们不依赖于适应性:
```
py
# class Simulation
def
choose_dead
(
self
,
fits
):
n
=
len
(
self
.
agents
)
is_dead
=
np
.
random
.
random
(
n
)
<
0.1
index_dead
=
np
.
nonzero
(
is_dead
)[
0
]
return
index_dead
def
choose_replacements
(
self
,
n
,
fits
):
agents
=
np
.
random
.
choice
(
self
.
agents
,
size
=
n
,
replace
=
True
)
replacements
=
[
agent
.
copy
()
for
agent
in
agents
]
return
replacements
```
在
`choose_dead`
中,
`n`
是智能体的数量,
`is_dead`
是一个布尔数组,对于此时间步骤内死亡的智能体为
`True`
。 在这个版本中,每个智能体都有相同的死亡概率:0.1。
`choose_dead`
使用
`np.nonzero`
来查找
`is_dead`
的非零元素的索引(
`True`
被视为非零)。
在
`choose_replacements`
中,
`n`
是在此时间步骤中复制的智能体数量。 它使用
`np.random.choice`
带替换地选择
`n`
个智能体。 然后它在每个上调用
`copy`
,并返回一个新的
`Agent`
对象列表。
这些方法不依赖于适应性,所以这种模拟没有生存或繁殖差异。 因此,我们不应期待看到进化。 但是,我们怎么辨别呢?
## 11.6 进化的证据
进化的最具包容性的定义是,种群中基因型分布的变化。 进化是一种聚合效应:换句话说,个体不会进化;但种群会。
在这个模拟中,基因型是高维空间中的位置,因此很难将其分布中的变化可视化。 但是,如果基因型改变,我们预计它们的适应性也会改变。 所以我们将将适应性分布的变化用作进化的证据。 具体来说,我们将看看种群中适应性的均值和标准差。
在我们运行模拟之前,我们必须添加一个
`Instrument`
,它是在每个时间步骤后更新的对象,计算一个感兴趣的统计量,并将结果存储在一个序列中,我们稍后可以绘制它。
这是所有仪器的父类:
```
py
class
Instrument
:
def
__init__
(
self
):
self
.
metrics
=
[]
```
下面是
`MeanFitness`
的定义,
`MeanFitness`
是一个仪器,计算每个时间步的种群平均适应性:
```
py
class
MeanFitness
(
Instrument
):
def
update
(
self
,
sim
):
mean
=
np
.
nanmean
(
sim
.
get_fitnesses
())
self
.
metrics
.
append
(
mean
)
```
现在我们准备好运行模拟了。 为了最小化起始种群中随机变化的影响,我们使用同一组智能体启动每个模拟。 为了确保我们探索整个适应性景观,我们由每个位置的一个智能体开始。 以下是创建模拟的代码:
```
py
N
=
8
fit_land
=
FitnessLandscape
(
N
)
agents
=
make_all_agents
(
fit_land
,
Agent
)
sim
=
Simulation
(
fit_land
,
agents
)
```
`make_all_agents`
为每个位置创建一个智能体; 本章的实现在笔记本中。
现在我们可以创建并添加
`MeanFitness`
仪器,运行模拟并绘制结果:
```
py
instrument
=
MeanFitness
()
sim
.
add_instrument
(
instrument
)
sim
.
run
()
sim
.
plot
(
0
)
```
模拟维护了
`Instrument`
对象列表。 在每个时间步之后,它在列表中的每个仪器上调用
`update`
。
模拟运行后,我们使用
`Simulation.plot`
绘制结果,它接受索引作为参数,使用索引从列表中选择一个
`Instrument`
并绘制结果。 在这个例子中,只有一个
`Instrument`
,索引为 0。
![](
img/11-1.png
)
图 11.1:随着时间的推移,10 次模拟的平均适应性,没有生存或繁殖差异
图?显示了运行这个模拟 10 次的结果。 种群的平均适应性随机移动。 由于适应性的分布随时间变化,我们推断表现型的分布也在变化。 按照最具包容性的定义,这种随机游走是一种进化。 但它不是一个特别有趣的类型。
特别是,这种进化并不能解释生物物种如何随时间变化,或者如何出现新的物种。 进化论是强大的,因为它解释了我们在自然界看到的似乎无法解释的现象:
+
适应性:物种与其环境的相互作用似乎太复杂,太巧妙,并且偶然发生。 自然系统的许多特征看起来好像是设计出来的。
+
增加的多样性:随着时间的推移,地球上的物种数量普遍增加(尽管有几个时期的大规模灭绝)。
+
增加的复杂性:地球上的生命史起始于相对简单的生命形式,后来在地质记录中出现了更复杂的生物体。
这些是我们想要解释的现象。 到目前为止,我们的模型并没有完成这个任务。
img/11-1.png
0 → 100644
浏览文件 @
a3678bd2
22.7 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录