谢林模型及其Python实现

谢林模型(Schelling Model)是由美国经济学家托马斯·谢林在1971年提出的一种用于模拟社会分隔与种族分布的模型。该模型以简单的规则展示了个体集体行为如何导致群体级别的分隔现象,尽管每个个体的意愿可能是相对宽容的。

模型背景

谢林模型主要应用于城市规划和社会科学等领域,揭示了即使在相对宽容的条件下,个体的选择也能导致明显的分隔。例如,在城市中,种族或社会经济地位的群体可能会因对邻居的偏好而聚集在一起。

模型构建

在谢林模型中,我们假设一个方格,上面分布着两种不同颜色的个体(A和B),以及一些空的方格。每个个体只关心其邻居的数量,希望自己的邻居中有某种比例是自己种族的个体,以此来决定是否保持在当前的位置。

模型规则
  1. 方格的每个位置可能是空的、个体A或者个体B。
  2. 个体希望邻居中至少有一定比例是与自己相同的个体。
  3. 如果不满足该比例,个体将选择移动到其他空位。

Python实现

接下来,我们通过Python代码实现谢林模型。我们将使用matplotlib库来可视化该模型的进程。

import numpy as np
import matplotlib.pyplot as plt
import random

# 定义模型参数
grid_size = 50
num_a = 200
num_b = 200
empty_spaces = grid_size * grid_size - num_a - num_b
min_neighbors = 0.4  # 希望的邻居比例

# 创建初始随机分布的方格
def create_grid():
    grid = np.full((grid_size, grid_size), ' ')
    positions = random.sample(range(grid_size * grid_size), num_a + num_b + empty_spaces)
    for pos in positions[:num_a]:
        grid[pos // grid_size, pos % grid_size] = 'A'
    for pos in positions[num_a:num_a + num_b]:
        grid[pos // grid_size, pos % grid_size] = 'B'
    return grid

# 可视化方格
def plot_grid(grid):
    plt.imshow(grid == 'A', cmap='Blues', alpha=0.5)
    plt.imshow(grid == 'B', cmap='Reds', alpha=0.5)
    plt.axis('off')
    plt.show()

# 检查个体周围的邻居情况
def check_neighbors(grid, x, y):
    neighbors = {'A': 0, 'B': 0}
    for dx in [-1, 0, 1]:
        for dy in [-1, 0, 1]:
            if dx == 0 and dy == 0:
                continue
            nx, ny = x + dx, y + dy
            if 0 <= nx < grid_size and 0 <= ny < grid_size:
                neighbor_type = grid[nx, ny]
                if neighbor_type in neighbors:
                    neighbors[neighbor_type] += 1
    return neighbors

# 模拟移动
def schelling_model(grid):
    for x in range(grid_size):
        for y in range(grid_size):
            if grid[x, y] == 'A' or grid[x, y] == 'B':
                neighbors = check_neighbors(grid, x, y)
                total_neighbors = neighbors['A'] + neighbors['B']
                if total_neighbors > 0:
                    if (neighbors['A'] / total_neighbors) < min_neighbors:
                        move_to_empty(grid, x, y)

# 移动到空位
def move_to_empty(grid, x, y):
    empty_positions = list(zip(*np.where(grid == ' ')))
    if empty_positions:
        new_x, new_y = random.choice(empty_positions)
        grid[new_x, new_y] = grid[x, y]
        grid[x, y] = ' '

# 初始化并可视化
grid = create_grid()
plot_grid(grid)

# 运行模型
iterations = 10
for _ in range(iterations):
    schelling_model(grid)
    plot_grid(grid)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.

旅行图

以下是模型运行过程中个体状态的旅行图,展示了个体在不同状态间的转换:

谢林模型状态变化 A B
移动状态
移动状态
A
初始状态
初始状态
B
不满意
不满意
A
找到新位置
找到新位置
B
重新安置
重新安置
谢林模型状态变化

状态图

下面是个体状态的状态图,描述个体在不同状态之间的关系:

坐标 满意 不满意 移动中 位置选择 重新安置

结论

谢林模型通过简单的规则展示了复杂的群体行为,揭示了即使个体选择是相对宽容的,群体却可能出现明显的分隔现象。通过对这一模型的Python实现,我们可以更好地理解城市中的种族分布、社交网络及其他社会现象。希望本文能够帮助读者掌握谢林模型的基本概念及其实现方式,激发对社会科学研究的探索兴趣。