林隔离模型简介托马斯.谢林(Thomas Schelling)的隔离模型(Schelling’s Segregation Model)是美国经济学家托马斯.谢林于20世纪六七十年代年提出的。他的隔离模型是基于一个社会学家提出的“相似邻居”理论。 该描述的是同质性对于空间隔离的影响与作用,揭示了种族和收入隔离背后的原理。谢林模型是个关于人们选择在哪居住的模型。 原理非常简单,就是说,在一个区域中,有两种类型的人,这两种人起先都是随机分布在该区域中。 然后在生活的过程中,每个类型的人都会观察周围的人,然后做出相应的喜好决策。 谢林模型定义的是一个人发现他居住的位置非本类人数过多,超过了他的阈值,他就会选择搬走。 这个阈值是可以自己设定的,在谢林模型中设定为30%。 即建模规则为:如果一个人是A类,且他居住的位置是A类人群的比例大于30%,则不动,如果是同类人群的比例小于30%,那么他就会随机选择一个其他的位置搬走,然后进入下一轮观察和决策。 真实的纽约种族分布和收入分布,都显示出了明显的隔离现象 谢林模型被认为是abm的hello world,因为它的特点是符合了ABM的基本原则: 会产生行为的智能体 智能体行为遵循一定的规则 智能体产生的行为会导致宏观上的结果
经过研究:尽管每个单独的个体都并非严格意义上的种族分子(仅仅要求同种族比例不低于30%),而是因为有一些简单的种族的居住偏好,但是基于这种偏好的长期互动下,最终会形成居住的种族隔离。 模拟结果老规矩,我们还是先看模拟计算的结果: 我在50 * 50的范围内,生成了2000个不同的个体,然后每个个体都有一个随机的位置,然后每个个体都有一个随机的类型。 
大家看那我圈出来的两两对比的地方,会发现出现了搬家的现象。 因为30%的容忍度,所以搬家现象出现的还不是很频繁,仔细对比之后,发现虽然较初始化的情况下,杂居的现象略有变化,但是隔离的表型还是不太明显。 我们降低一下容忍度,比如提高到50%,也就是需要高于一半的人与你不同种族类型,你就搬家,在看看演变结果: 可以看到,在50%的容忍度下,隔离的现象就相当明显了: 
我们继续降低容忍度,比如把同类型需求提高到70%,结果就发生了不共戴天、老死不相往来的现象: 同类需求的容忍度,提高到70%所表达出来的情况,就类似于了交战区了……不当不会出现相互杂居的情况,而且就算有相接的地方,也会画出隔离带…… 
结合以上几种情况,我们可以看到,无论是开明或是排外,聚居现象均有可能出现,而非常开明或是非常排外也可能不出现聚居现象,因此聚居现象本身并不能说明居民的倾向,宏观层面的聚居现象与微观层面的居民行为并不一致。这种现象被称为“涌现”(emergence)——系统中的个体通过相互作用,在群体水平上呈现出了出乎意料的新特征。它是复杂系统(complex system)的重要特性之一。 建模过程
个体属性结构:个体只需要一个能够记录本身属于那个类型的属性即可。
环境结构:这里采用最简单的二维网格结构,为了方便计算,网格留下一个属性,表示当前网格是否已经有人居住了。
个人行为规则:计算当前位置周围的同类型的个数,然后与阈值比较,然后做出相应的行为。空地不会参与计算。

注意这里计算的时候,是需要把自己计算进去的, 例如: A点,周边有五个地块有邻居,总体值就是5+1=6 ,除自己以外只有一个蓝色,则是同类型为:1+1 = 2。同类比例就是2/6 = 0.33。
B点,周边有四个地块有邻居,总体值就是4+1=5,除自己以外有两个红色,则是同类型为:1+2 = 3。同类比例就是3/5 = 0.6。
C点,周边都是空地,也就算自己 / 周边值 + 1,否则会出现除0错误。
个体与环境的互动:个体计算阈值之后,如果超出容忍度,则会随机选择一个空地,然后搬家。那么就需要先把所有有空的位置给查找出来,然后随机选择一个。
环境的互动规则:个体搬走之后,会把当前位置标记为空地,然后把新位置标记为居住。
个体之间的互动规则:个体之间只有计算阈值,没有其他的互动规则。
代码实现与解析import agentpy as ap import numpy import matplotlib.pyplot as plt import seaborn as sns import IPython
plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
# 这个方法是用来随机选择一个空地的 def random_to_pos(model): status_array = model.area["status"] empty_indices = numpy.where(status_array == 0) empty_indices_tuple = tuple(empty_indices) random_index = numpy.random.choice(len(empty_indices_tuple[0])) return (int(empty_indices_tuple[0][random_index]), int(empty_indices_tuple[1][random_index]))
class Schelling_model(ap.Model): def setup(self): self.p = { "size": 50, "agent_num": 2000, "steps": 100, }
self.area = ap.Grid(self, [self.p['size']] * 2, track_empty=True, check_border=True) # 这个状态代表这个网格上是否有人 self.area.add_field('status',0) self.agents = ap.AgentDList(self, self.p['agent_num'])
pos = set() pop_type = [] while len(pos) < len(self.agents): x = self.random.randint(0, self.p['size']-1) y = self.random.randint(0, self.p['size']-1) if (x,y) not in pos: pos.add((x,y)) pop_type.append(self.random.randint(0, 1)) self.area["status"][x,y] = 1 self.area.add_agents(self.agents, positions=pos, empty=True) self.agents.type = 0
# 随机选择一半的人,把他们的类型设置1 for agent in self.random.sample(self.agents, int(self.p['agent_num'] * 0.5)): agent.type = 1 def step(self): pop = self.agents.select(self.agents.type < 3) stop = True for person in pop: p_neighbors = self.area.neighbors(person) if person.type == 0: self_type = len(numpy.where(numpy.array(p_neighbors.type) ==0)[0]) +1 else: self_type = len(numpy.where(numpy.array(p_neighbors.type) ==1)[0]) +1
if float(self_type)/(len(p_neighbors)+1) <= 0.7: stop = False self_pos = self.area.positions[person] newpos = random_to_pos(self) self.area["status"][self_pos[0],self_pos[1]] = 0 self.area.move_to(person, (newpos[0],newpos[1])) self.area["status"][newpos[0],newpos[1]] = 1 if self.t >= self.p["steps"] or stop: self.stop() def end(self): pass
def animation_plot(model, ax): color_dict = {0:'#FF0000', 1:'#0000FF', None:'#FFFFFF'} attr_grid = model.area.attr_grid('type') ap.gridplot(attr_grid, ax=ax, color_dict=color_dict, convert=True,alpha=0.5) ax.set_title(f"谢林隔离模型\n" f"演变步数: {model.t}")
fig, ax = plt.subplots() model = Schelling_model() # 生成动画和html的控件 animation = ap.animate(model, fig, ax, animation_plot) IPython.display.HTML(animation.to_jshtml(fps=5))
研究结论谢林模型揭示了微观的行为经过长期的进化,将会产生不可预期的结果:在模型中,没有任何一个组织和领导者,去规范你必须要去那个地方居住,也没有人要求你必须搬走或者搬来,且每个人都并非是严格意义上的种族分子(仅要求30%,也就是可以容忍三分之二的人与你不同种族类型,这并非非常过分的要求),但是经过长期互动后,最终会形成居住的种族隔离。比如说,美国芝加哥,黑人居住区从1940年到1960年,越来越多的黑人在某个区域聚集。原因在于自然属性相同,选择相同;相互认识、相互影响,进而趋同。人们宽容的允许身边有各种收入阶层的人存在(30%的收入相当的邻居),但是最终却形成了隔离;而只想和收入等级相同(80%)的邻居居住的社区却形成不了收入隔离。以居住隔离为例,谢林模型模拟了同质性的动态变化,如果同质性是一个自然现象,则促进或阻止不同社会情景下的同质性,将会对社会发展产生重要影响。
|