提交 9349493c 编写于 作者: W wizardforcel

11.

上级 9f8187b5
......@@ -77,3 +77,72 @@ zero_values = [0.4, 0.7, 0.9]
这种情况下,`loc = [0, 1, 0]`的适应性是`[0.4, 0.2, 0.9]`的均值,为 0.5。
## 11.3 智能体
接下来我们需要智能体,这是类定义:
```py
class Agent:
def __init__(self, loc, fit_land):
self.loc = loc
self.fit_land = fit_land
self.fitness = fit_land.fitness(self.loc)
def copy(self):
return Agent(self.loc, self.fit_land)
```
智能体的属性是:
`loc`:智能体在适应性景观中的位置。
`fit_land``FitnessLandscape`对象的引用。
`fitness`:智能体在`FitnessLandscape`中的适应性,表示为 0 到 1 之间的数字。
`Agent`的这个定义提供了一种简单的`copy`方法,可以精确复制基因型;之后,我们将看到一个带有突变的版本,但突变对于进化来说不是必需的。
## 11.4 模拟
现在我们有了智能体和适应性景观,我将定义一个名为`Simulation`的类,用于模拟智能体的创建,繁殖和死亡。 为了避免陷入困境,我将在这里提供一个简化版本的代码;你可以在本章的笔记本上看到细节。
这是`Simulation`的定义:
```py
class Simulation:
def __init__(self, fit_land, agents):
self.fit_land = fit_land
self.agents = agents
```
`Simulation`的属性是:
+ `fit_land``FitnessLandscape`对象的引用。
+ `agents``Agent`对象的数组。
`Simulation`中最重要的函数是`step`,它模拟了单个时间步骤:
```py
# class Simulation:
def step(self):
n = len(self.agents)
fits = self.get_fitnesses()
# see who dies
index_dead = self.choose_dead(fits)
num_dead = len(index_dead)
# replace the dead with copies of the living
replacements = self.choose_replacements(num_dead, fits)
self.agents[index_dead] = replacements
```
在每个时间步骤中,一些智能体死亡,一些智能体繁殖。 `step`使用另外三个方法:
+ `get_fitnesses`返回一个数组,包含每个智能体的适应性,按照它们在智能体数组中出现的顺序。
+ `choose_dead`决定哪些智能体在此时间步中死亡,并返回一个数组,包含死亡智能体的索引。
+ `choose_replacements`决定哪些智能体在此时间步中繁殖,在每个智能体上调用`copy`,并返回一个新的`Agent`对象的数组。
在这个版本的模拟中,每个时间步中新智能体的数量等于死亡智能体的数量,所以活动智能体的数量是恒定的。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册