提交 a3678bd2 编写于 作者: W wizardforcel

11.

上级 9349493c
......@@ -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 次的结果。 种群的平均适应性随机移动。 由于适应性的分布随时间变化,我们推断表现型的分布也在变化。 按照最具包容性的定义,这种随机游走是一种进化。 但它不是一个特别有趣的类型。
特别是,这种进化并不能解释生物物种如何随时间变化,或者如何出现新的物种。 进化论是强大的,因为它解释了我们在自然界看到的似乎无法解释的现象:
+ 适应性:物种与其环境的相互作用似乎太复杂,太巧妙,并且偶然发生。 自然系统的许多特征看起来好像是设计出来的。
+ 增加的多样性:随着时间的推移,地球上的物种数量普遍增加(尽管有几个时期的大规模灭绝)。
+ 增加的复杂性:地球上的生命史起始于相对简单的生命形式,后来在地质记录中出现了更复杂的生物体。
这些是我们想要解释的现象。 到目前为止,我们的模型并没有完成这个任务。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册