From d1855b61c3ab67b5cbb18f9413531bed9e0406bd Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Thu, 12 Apr 2018 10:36:43 +0800 Subject: [PATCH] 9. --- 9.md | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 5 deletions(-) diff --git a/9.md b/9.md index b4246ea..e8f1425 100644 --- a/9.md +++ b/9.md @@ -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 个步骤(右)之后的模型状态。 你可以看到,前两个波到达并穿过第二个山峰,留下了一串空细胞。 您还可以看到这个模型的动画版本,其中波形更清晰可见。 + +虽然这些波动由智能体组成,但我们可以将他们视为自己的实体,就像我们在“生命游戏”中想到的滑翔机一样。 + +这些波动的一个有趣的属性是,它们沿对角线移动,这可能是令人惊讶的,因为这些智能体本身只是向北或向东移动,从不向东北方移动。 像这样的结果 - 团队或“集合”拥有智能体没有的属性和行为 - 在基于智能体的模型中很常见。 我们将在下一章看到更多的例子。 + -- GitLab