提交 d1855b61 编写于 作者: W wizardforcel

9.

上级 d28d0e30
......@@ -18,7 +18,7 @@
1971 年,托马斯谢(Thomas Schelling)发表了《隔离的动态模型》(Dynamic Models of Segregation),该模型提出了种族隔离的简单模型。 谢林模型的世界是一个网格;每个细胞代表一栋房子。 房屋被两种智能体占用,标记为红色和蓝色,数量大致相同。 大约 10% 的房屋是空的。
在任何时候,智能体可能会高兴或不高兴,这取决于领域中的其他智能体,每个房屋的“邻居”是八个相邻细胞的集合。在一个版本的模型中,如果智能体至少有两个像他们一样的邻居,代理人会高兴,但如果是一个或零,他们就会不高兴。
在任何时候,智能体可能会高兴或不高兴,这取决于领域中的其他智能体,每个房屋的“邻居”是八个相邻细胞的集合。在一个版本的模型中,如果智能体至少有两个像他们一样的邻居,智能体会高兴,但如果是一个或零,他们就会不高兴。
模拟的过程是,随机选择一个智能体并检查他们是否高兴。 如果是这样,没有任何事情发生。如果不是,智能体随机选择其中一个未占用的细胞并移动。
......@@ -46,7 +46,7 @@ class Schelling(Cell2D):
self.array = np.random.choice(choices, (n, m), p=probs)
```
参数`n``m`是网格的维度,`p`是相似邻居比例的阈值。 例如,如果`p = 0.5`,也就是其邻居中少于 50% 为相同颜色,则代理将不高兴。
参数`n``m`是网格的维度,`p`是相似邻居比例的阈值。 例如,如果`p = 0.5`,也就是其邻居中少于 50% 为相同颜色,则智能体将不高兴。
`array`是 NumPy 数组,其中每个细胞如果为空,则为 0;如果由红色智能体占用,则为1;如果由蓝色智能体占用,则为 2。 最初,10% 的细胞是空的,45% 为红色和 45% 为蓝色。
......@@ -206,11 +206,11 @@ np.sum(frac_same) / np.sum(occupied)
+ 智能体在 4 个罗盘方向的每一个方向上调查`k`个细胞,其中`k`是智能体的视野范围。
+ 它选择糖分最多的未占用的细胞。 在相等的情况下,选择较近的细胞;在距离相同的细胞中,它随机选择。
+ 智能体移动到选定的细胞并收获糖分,将收获增加到其积累的财富并将细胞清空。
+ 智能体根据代谢消耗其财富的一部分。 如果结果总量为负数,代理人“饿死”并被删除。
+ 智能体根据代谢消耗其财富的一部分。 如果结果总量为负数,智能体“饿死”并被删除。
在所有智能体完成这些步骤之后,细胞变回一些糖,通常为 1 单位,但每个细胞中的总糖分受其容量限制。
在所有智能体完成这些步骤之后,细胞恢复一些糖,通常为 1 单位,但每个细胞中的总糖分受其容量限制。
图?(中)显示两步后模型的状态。 大多数智能体正在移到糖最多的地区。 视力高的代理移动速度最快;视力低的智能体往往会卡在高原上,随机游走,直到它们足够接近来看到下一个水平。
图?(中)显示两步后模型的状态。 大多数智能体正在移到糖最多的地区。 视力高的智能体移动速度最快;视力低的智能体往往会卡在高原上,随机游走,直到它们足够接近来看到下一个水平。
出生在糖分最少的地区的智能体可能会饿死,除非他们的视力很好,先天条件也很高。
......@@ -245,3 +245,86 @@ np.sum(frac_same) / np.sum(occupied)
在对数刻度上,分布的形状类似于高斯或正态分布,但右尾被截断。 如果它在对数刻度上实际上是正态的,则分布是对数正态分布,这是一种重尾分布。 实际上,几乎每个国家和全世界的财富分布都是重尾分布。
如果说糖域解释了为什么财富分布是重尾的,但是糖域变化中的不平等的普遍性表明,不平等是许多经济体的特征,甚至是非常简单的经济体。 一些实验表明避免或减轻并不容易,它们带有一些规则,对纳税和其他收入转移进行建模。
## 9.6 实现糖域
糖域比以前的模型更复杂,所以我不会在这里介绍整个实现。 我将概述代码的结构,您可以在 Jupyter 笔记本`chap09.ipynb`中查看本章的细节,它位于本书的仓库中。 如果你对细节不感兴趣,你可以跳到下一节。
以下是带有`step`方法的`Agent`类:
```py
class Agent:
def step(self, env):
self.loc = env.look_around(self.loc, self.vision)
self.sugar += env.harvest(self.loc) - self.metabolism
self.age += 1
```
在每个步骤中,智能体移动,收获糖,并增加年龄。
参数`env`是环境的引用,它是一个`Sugarscape`对象。 它提供了方法`look_around`和收获:
+ `look_around`获取智能体的位置,这是一个坐标元组,以及智能体的视野,它是一个整数。 它返回智能体的新位置,这是糖分最多的可见细胞。
+ `harvest `需要智能体的(新)位置,并在移除并返回该位置的糖分。
这里是`Sugarscape`类和它的`step`方法(不需要替换):
```py
class Sugarscape(Cell2D):
def step(self):
# loop through the agents in random order
random_order = np.random.permutation(self.agents)
for agent in random_order:
# mark the current cell unoccupied
self.occupied.remove(agent.loc)
# execute one step
agent.step(self)
# if the agent is dead, remove from the list
if agent.is_starving():
self.agents.remove(agent)
else:
# otherwise mark its cell occupied
self.occupied.add(agent.loc)
# grow back some sugar
self.grow()
return len(self.agents)
```
`Sugarscape`继承自`Cell2D`,因此它与我们所见过的其他基于网格的模型相似。
这些属性包括`agents`,它是`Agent`对象的列表,以及`occupied`,它是一组元组,其中每个元组包含智能体占用的细胞的坐标。
在每个步骤中,`Sugarscape`以随机顺序遍历智能体。 它调用每个智能体的`step`,然后检查它是否已经死亡。 所有智能体都移动后,一些糖会恢复。
如果您有兴趣更加了解 NumPy ,您可能需要仔细看看`make_visible_locs`,它构建一个数组,其中每行包含智能体可见的细胞坐标,按距离排序,但距离相同的细胞 是随机顺序。
你可能想看看`Sugarscape.make_capacity`,它初始化细胞的容量。 它演示了`np.meshgrid`的使用,这通常很有用,但需要一些时间才能理解。
## 9.7 迁移和波动行为
![](img/9-5.png)
图 9.5:`Sugarscape`中的波动行为:初始状态(左),6 步后(中)和 12 步后(右)
虽然`Sugarscape`的主要目的不是探索空间中的智能体的移动,但 Epstein 和 Axtell 在智能体迁移时,观察到一些有趣的模式。
如果我们开始把所有智能体放在左下角,他们会迅速走向最近的高容量细胞的“山峰”。 但是如果有更多的智能体,单个山峰不足以支持它们的话,他们很快就会耗尽糖分,智能体被迫进入低容量地区。
视野最长的那些,首先穿过山峰之间的山谷,并且像波一样向东北方向传播。 因为他们在身后留下一些空细胞,所以其他智能体不会追随,直到糖分恢复。
结果是一系列离散的迁移波,每个波都像一个连贯的物体,就像我们在规则 110 CA 和生命游戏中看到的飞船(参见第?节)。
图?显示了初始条件下(左),6 个步骤(中)和 12 个步骤(右)之后的模型状态。 你可以看到,前两个波到达并穿过第二个山峰,留下了一串空细胞。 您还可以看到这个模型的动画版本,其中波形更清晰可见。
虽然这些波动由智能体组成,但我们可以将他们视为自己的实体,就像我们在“生命游戏”中想到的滑翔机一样。
这些波动的一个有趣的属性是,它们沿对角线移动,这可能是令人惊讶的,因为这些智能体本身只是向北或向东移动,从不向东北方移动。 像这样的结果 - 团队或“集合”拥有智能体没有的属性和行为 - 在基于智能体的模型中很常见。 我们将在下一章看到更多的例子。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册