用Python模拟霍特林博弈:从街头冰淇淋店到互联网产品定价的实战推演

博弈论霍特林博弈Python模拟
于 2026-05-30 11:58:47 修改
·本内容遵循CC 4.0 BY-SA版权协议

用Python模拟霍特林博弈:从街头冰淇淋店到互联网产品定价的实战推演

想象一下,炎炎夏日里一条笔直的街道上,两家冰淇淋店分别位于两端。顾客们会根据价格和步行距离决定去哪家购买——这就是1929年Harold Hotelling提出的经典模型。但霍特林博弈的智慧远不止于此,从外卖平台的配送范围优化,到视频会员的差异化定价,再到共享单车的投放策略,这个看似简单的模型能解释无数现实商业现象。

本文将用Python带你亲手搭建霍特林模型的动态模拟系统。不同于静态的理论推导,我们将通过可交互的代码实验,直观观察空间竞争如何影响定价策略。无论你是想理解商业竞争本质的产品经理,还是希望用博弈论优化策略的数据分析师,这些代码都能成为你的决策实验室。

1. 环境搭建与基础模型

首先确保你的Python环境已安装以下库:

PYTHON
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, FloatSlider
%matplotlib inline

1.1 线性城市的基本假设

我们构建一个长度为1的"线性城市",消费者均匀分布在[0,1]区间。假设两家商店分别位于a=0和b=1的位置,销售同质化产品。消费者选择商店时考虑:

  • 商品价格(p1, p2)
  • 单位距离旅行成本t(可理解为时间成本或运费)

需求函数推导的关键在于找到"无差异消费者位置"x*,即:

TEXT
U - t*x* - p1 = U - t*(1-x*) - p2

解得x* = (p2 - p1 + t)/(2t)。据此可编写基础需求函数:

PYTHON
def demand(p1, p2, t, a=0, b=1):
x_star = (p2 - p1 + t*(b-a)) / (2*t)
d1 = np.clip(x_star, 0, 1) # 商店1需求
d2 = 1 - np.clip(x_star, 0, 1) # 商店2需求
return d1, d2

1.2 价格均衡的可视化

固定商店2价格p2=1.5,观察商店1价格变化如何影响市场份额:

PYTHON
p2 = 1.5
t = 0.5
p1_range = np.linspace(0.1, 3, 100)
d1_values = [demand(p1, p2, t)[0] for p1 in p1_range]
 
plt.figure(figsize=(10,6))
plt.plot(p1_range, d1_values, label='商店1需求')
plt.axvline(x=p2, color='r', linestyle='--', label='商店2价格')
plt.xlabel('商店1价格')
plt.ylabel('需求量')
plt.legend()
plt.grid(True)

当p1=p2时,市场份额平分;价格低于竞争者时获得更多客户——这与直觉完全一致。但真正的博弈在于双方会如何动态调整价格?

2. 动态博弈与纳什均衡

2.1 利润函数与最优响应

假设单位成本c=1,利润函数为:

PYTHON
def profit(p1, p2, t, c=1):
d1, _ = demand(p1, p2, t)
return (p1 - c) * d1

商店1在面对p2时会选择使利润最大化的p1。通过求导可得最优响应函数:

TEXT
p1 = (p2 + t + c)/2

实现代码:

PYTHON
def best_response(p2, t, c=1):
return (p2 + t + c) / 2

2.2 均衡收敛模拟

通过迭代反应观察价格如何收敛到均衡:

PYTHON
def simulate_equilibrium(t=0.5, c=1, max_iter=20):
p1, p2 = c, c # 初始价格为成本价
history = []
for _ in range(max_iter):
p1 = best_response(p2, t, c)
p2 = best_response(p1, t, c)
history.append((p1, p2))
return np.array(history)

绘制收敛过程:

PYTHON
history = simulate_equilibrium()
plt.plot(history[:,0], label='商店1价格')
plt.plot(history[:,1], label='商店2价格')
plt.axhline(y=1+0.5, color='k', linestyle='--', label='理论均衡')
plt.legend()
plt.xlabel('迭代次数')
plt.ylabel('价格')

2.3 旅行成本的影响

旅行成本t越大,产品差异化程度越高。我们观察不同t值下的均衡价格:

t值 均衡价格 均衡利润
0.1 1.1 0.05
0.3 1.3 0.15
0.5 1.5 0.25
0.8 1.8 0.4

代码验证:

PYTHON
t_values = [0.1, 0.3, 0.5, 0.8]
equilibrium_prices = [1 + t for t in t_values]
profits = [t/2 for t in t_values]

3. 商店位置的内生决定

经典模型中商店位置是外生给定的,现实中企业会战略性地选择位置。我们扩展模型,让位置也成为决策变量。

3.1 位置-价格联合博弈

定义利润函数时加入位置参数:

PYTHON
def profit_full(p1, p2, a, b, t, c=1):
x_star = (p2 - p1 + t*(1-a-b)) / (2*t*(1-a-b)) + (1-b+a)/2
d1 = np.clip(x_star, 0, 1)
return (p1 - c) * d1

3.2 位置策略模拟

固定一家位置,观察另一家的最优响应:

PYTHON
a_values = np.linspace(0, 0.5, 50)
profits = []
for a in a_values:
p1_eq = 1 + t*(1-a)*(3+a)/3 # 均衡价格公式
profit = profit_full(p1_eq, p1_eq, a, 1-a, t)
profits.append(profit)
 
plt.plot(a_values, profits)
plt.xlabel('商店1位置a')
plt.ylabel('均衡利润')

结果显示中间位置(最小差异化)反而是利润最低的,这与霍特林著名的"主街悖论"一致。

4. 互联网产品的差异化竞争

将空间差异转化为产品特性差异,模型可应用于:

4.1 视频会员定价案例

假设:

  • "位置"代表内容偏好(0=电影爱好者,1=剧集爱好者)
  • 旅行成本t代表用户对非偏好内容的容忍度

模拟代码:

PYTHON
def streaming_demand(p1, p2, t, a, b):
# a,b代表平台内容侧重
x_star = (p2 - p1 + t*(1-a-b)*(1+a-b)) / (2*t*(1-a-b))
return np.clip(x_star, 0, 1)
 
# 平台A侧重电影(a=0.2),平台B侧重剧集(b=0.8)
demand_A = streaming_demand(15, 18, 10, 0.2, 0.8)

4.2 可交互模拟器

创建Jupyter交互控件,实时观察参数影响:

PYTHON
@interact(
t=(1, 20, 1),
a=(0, 0.5, 0.1),
b=(0.5, 1, 0.1)
)
def plot_streaming(t=10, a=0.2, b=0.8):
p_range = np.linspace(10, 30, 100)
demands = [streaming_demand(p, 20, t, a, b) for p in p_range]
plt.plot(p_range, demands)
plt.xlabel('价格')
plt.ylabel('市场份额')

5. 模型局限与扩展方向

虽然霍特林模型极具洞察力,但现实更复杂。可以考虑以下扩展:

  1. 多维差异化:同时考虑价格、质量、服务等多维度
PYTHON
# 二维差异化模型示例
def utility(distance, price, quality):
return quality - 0.5*distance - price
  1. 动态博弈:多期竞争与用户迁移成本

  2. 网络效应:用户选择受现有用户规模影响

  3. 数据驱动的参数估计

PYTHON
# 用实际数据校准t值
from scipy.optimize import minimize
def calibrate_t(observed_share, prices, locations):
def error(t):
pred = demand(prices[0], prices[1], t, locations[0], locations[1])[0]
return (pred - observed_share)**2
return minimize(error, x0=0.5).x[0]

这些扩展方向都能在原有代码框架上实现,为商业决策提供更精细的模拟工具。

别再只盯着价格战了Python模拟霍特林博弈,看‘位置’如何决定利润天花板
霜霜很乖哦
512
别再只盯着价格战了Python模拟霍特林博弈,看看‘位置’如何决定利润
寒月潇凌
509
别再只盯着价格战了!用Python模拟霍特林博弈,看‘位置’如何决定企业利润
雨前羽街
234
从“囚徒困境”到“智猪博弈Python代码模拟5个经典博弈论模型(附源码)
本文通过Python代码实现了囚徒困境、智猪博弈、性别之战、古诺模型和霍特林模型五个经典博弈论模型,涵盖非零和博弈、协调博弈、寡头竞争与空间竞争等核心类型。重点展示参与者、策略与收益三要素的编程建模方法,并支持参数调节与均衡分析,适用于算法理解、教学演示及策略仿真。
weixin_30258901
300
从‘囚徒困境’到‘性别战’Python代码模拟5个经典博弈论模型,帮你理解Nash均衡
本文使用Python实现囚徒困境、性别战、古诺模型、霍特林模型和监督博弈五大经典博弈论模型,通过支付矩阵建模、最佳反应函数求解及混合策略分析,直观呈现Nash均衡的形成机制与特征。重点涵盖占优策略识别、多重均衡处理、空间竞争建模及随机化策略应用,所有案例均基于NumPy和Matplotlib完成数值计算与可视化。
weixin_30673611
359
从“囚徒困境”到“性别战”Python代码模拟5个经典博弈论模型,理解Nash均衡
杨良枝
62
复现论文具有异质乘客的网约车市场平台整合研究
本博客复现了关于异质乘客下网约车平台整合的研究,基于霍特林模型构建无/有整合者的双市场均衡框架,实现纳什均衡与共享垄断下的定价与工资决策求解;通过Python数值分析验证整合对等待时间、平台利润及司机收入的影响,并支持参数敏感性分析与多维度可视化。
pk_xz123456
143
数字图像处理实验图像压缩
本文介绍了一个使用Python和OpenCV库实现的图像压缩程序,包括离散余弦变换(DCT)和霍特林变换两种方法。程序通过对图像进行变换、系数筛选和逆变换,实现图像的压缩和解压。实验结果显示,这两种方法能有效降低图像的存储空间和传输带宽。
paddiiii
389
python数据分析-相关分析
本文介绍了典型相关分析,一种用于多变量分析的方法,由霍特林提出。它通过寻找两组变量的最大相关线性组合来度量它们之间的关系。在Python中,可以使用scikit-learn的CCA类来实现这个过程。文章给出了使用鸢尾花数据集的例子,展示了如何计算两个数据子集的典型相关系数。
python慕遥
1783
Hotelling霍特林模型(上) | 3种模型求解及Maltab代码——基于一次交通成本
本文详解《城市用地分类与规划建设用地标准》(GB50137-2011)中的8大类、35中类、42小类用地体系,涵盖功能分区、土地估值、基础设施配套等技术原理,并提供Python代码实现用地数据可视化、混合度分析与兼容性评估,助力城市规划数字化。
2501_93190922
1044
[学习笔记] numpy次成分分析和PCA降维
本文探讨了使用SVD(奇异值分解)进行次成分分析和PCA(主成分分析)对图像及随机数据集进行降维的方法。通过实例展示了如何利用Python的numpy库实现图像的次成分复原,并基于霍特林变换将10维数据集降维至5维,为理解复杂数据结构提供了有效途径。
weixin_30815427
196
机器学习——主成分分析Python实现
本文介绍了主成分分析(PCA)的基本概念,并详细阐述了PCA的实施步骤,包括数据标准化、协方差矩阵计算、特征向量选择等。在Python中,PCA可通过Scikit-Learn库实现,调整n_components参数进行降维。最后,文章以《Python数据分析与挖掘实战》数据集为例,展示了PCA的实际应用。
机器恒
1136
通过K-L变换的图像压缩(python实现)
本文介绍了K-L变换的基本概念,包括其在图像处理中的应用步骤,如读取图片、计算协方差矩阵、特征分解等,并提供了Python代码实例,展示了如何使用K-L变换进行图像数据压缩和重构。,
NebulaGMY_萌新星云
1429
学习笔记1 | 机器学习实战(Harrington)
本文是关于《机器学习实战》的学习笔记,介绍了机器学习的基础知识,包括训练集、特征、目标变量等概念,主要任务如分类和回归,以及如何根据目的选择合适的算法。同时,概述了Python在机器学习中的优势和劣势,以及NumPy库的基础应用。
Leonadoice
309
MATLAB算法实战应用案例精讲-【降维算法】主成分分析( PCA)(附R语言、Python和MATLAB代码)
本文详细介绍了主成分分析(PCA)的原理、步骤、优缺点及其在数据降维中的应用。PCA通过特征值分解协方差矩阵实现,用于提取数据的主要特征,减少变量个数。文章还提供了Python、R和MATLAB的代码示例,包括房地产指数分析和葡萄酒分类案例。PCA在基因测序、图像处理等领域有广泛应用。
林聪木
639
Python机器学习笔记之降维
本文解析了如何使用PCA和NMF算法对鸢尾花和人脸数据进行降维,展示了在Python机器学习中实际操作和可视化过程。通过PCA对鸢尾花数据集进行二维投影,并对比NMF在人脸特征提取中的应用。
Mr_Stutter
1282
本校暑假训练营8_Python数据入门4-降维1
本文深入浅出地介绍了机器学习的基本概念,包括应用场景、算法类型及关键术语。探讨了监督学习与无监督学习的区别,并详细解释了因子分析、奇异值分解(SVD)和主成分分析(PCA)等技术在数据降维中的应用。
scl、
417
python 在统计学中的自定义api实现
本文介绍如何使用Python进行基本的统计学计算,包括频率、众数、中位数、均值、极差、四分位数、方差和标准差等核心统计指标的计算方法。
PETERMAOSX
337
主成分分析matlab代码_学点统计主成分分析(PCA)怎么降维分析的?内含代码+教程...
主成分分析(PCA)是多元统计分析中的重要方法,用于降维和理解变量间的关联。PCA通过对原始数据进行线性变换,找出能够解释大部分数据变异性的少数主成分。其步骤包括数据标准化、计算协方差矩阵、选取特征向量等。在地质、生物、医学等领域有广泛应用。PCA的主要目标是减少变量数量,同时保持数据集的主要信息。使用PCA时,通常关注累积贡献度达到75%以上的主成分。软件如SAS、SPSS、Python和R包都提供了实现PCA的工具。
weixin_40004212
287
特征变换(5)K-L变换
本文探讨了K-L变换在模式识别和图像处理中的应用,特别是如何通过减少特征量并保持信息完整性来简化高维数据集,进而提高处理效率与准确性。通过实例展示了如何实现K-L变换,包括矩阵操作、特征向量提取和图像特征分解,并对比了全特征重构与使用单一主要特征重构的效果。
指尖热度
4146