博弈论实战:从囚徒困境到商业竞争,Python代码解析纳什均衡

发布时间:2026/8/28 9:27:25
博弈论实战:从囚徒困境到商业竞争,Python代码解析纳什均衡 1. 从“石头剪刀布”到商业博弈对策论模型入门如果你玩过“石头剪刀布”或者看过电影《美丽心灵》里纳什在酒吧里和朋友讨论如何搭讪女生的片段那你已经接触过对策论最朴素的思想了。对策论也叫博弈论听起来高深莫测但它的核心就是研究一群“聪明人”在相互影响、相互算计的情况下如何做出对自己最有利的决策。它不是教你如何“赢”而是帮你分析在对手也追求自身利益最大化时整个局面会走向何方以及是否存在一个对所有人都“不坏”的稳定状态。我最初接触对策论是在一个供应链优化的项目里。当时我们公司作为供应商和几个大客户在谈年度采购协议。客户希望价格越低越好我们则希望利润越高越好。这看起来是个零和博弈但深入分析后发现如果我们承诺一个略低但稳定的价格并配合更灵活的供货计划客户可以减少库存成本我们也能获得长期稳定的订单实现双赢。这个“双赢点”的寻找过程本质上就是在构建和对策论模型。后来无论是分析平台上的商家竞价策略还是设计多智能体协作的算法对策论的思维框架都成了我的核心工具之一。今天我就结合几个经典案例和可运行的Python代码带你烧脑一回把对策论模型从理论讲透到实战。2. 核心概念拆解玩家、策略与收益矩阵在深入代码之前我们必须统一语言理解对策论模型的几个基石。这就像下棋前你得先认识棋盘和棋子。2.1 局中人、策略与收益任何一个对策论模型都离不开这三个要素局中人参与决策的个体或团体。比如“石头剪刀布”游戏中的你和对手商业竞争中的两家公司甚至是自动驾驶车队里的每一辆车。局中人是理性的都以最大化自己的收益为目标。策略每个局中人在博弈中可以选择的行动方案。在“石头剪刀布”中策略集就是{石头剪刀布}。在一个定价模型中策略可能是“定高价”、“定中价”、“定低价”。收益每个局中人在所有参与者都选择特定策略后所获得的结果通常用数字效用或支付表示。收益矩阵是展示这些结果的经典工具。2.2 用收益矩阵可视化博弈收益矩阵是最直观的表示方法尤其适用于两个局中人玩家A和玩家B、每个局中人策略有限的情况。我们来看一个经典的“囚徒困境”。假设两个共犯被隔离审讯。他们各自有两个策略沉默合作或招供背叛。收益这里指刑期数值越小越好规则如下如果都沉默合作因证据不足各判1年。如果都招供背叛证据确凿各判5年。如果一人招供一人沉默则招供者因立功立即释放0年沉默者因抗拒从严判8年。我们可以用收益矩阵表示通常写成A的收益 B的收益的形式A \ B沉默招供沉默(-1, -1)(-8, 0)招供(0, -8)(-5, -5)这个简单的矩阵蕴含了丰富的博弈思想。从个人理性出发无论对方选择什么“招供”都是每个囚徒的严格优势策略自己的收益总是更高或相等。但两人都选择优势策略的结果-5 -5却比两人都合作-1 -1要差。这就是个人理性与集体理性的矛盾也是“困境”所在。注意收益的数值代表“效用”可正可负。在囚徒困境中我们用负号表示刑期损失所以数值越大负得越少越好。在其他场景如利润博弈正数代表收益数值越大越好。理解收益的方向至关重要。2.3 纳什均衡博弈的稳定状态纳什均衡是对策论中最重要的概念之一由约翰·纳什提出。它描述的是一种策略组合在该组合下任何一个局中人单方面改变自己的策略都不会让他的收益变得更好。换句话说在纳什均衡点上每个人都“没有动力”去改变当前的选择。在“囚徒困境”中招供 招供这个策略组合就是一个纳什均衡。给定B招供A的最优反应是招供-5 -8给定A招供B的最优反应也是招供。双方都“锁死”在这个状态。尽管沉默沉默对集体更好但它不是纳什均衡因为任何一方都有动机单方面背叛去获得0收益。理解纳什均衡的关键在于它不一定是全局最优解甚至可能像囚徒困境一样是“糟糕”的但它是一种稳定的、可预测的结果。在实际分析中寻找纳什均衡就是寻找博弈可能收敛到的稳定点。3. 经典模型实战从囚徒困境到性别之战理论需要案例来滋养。下面我们用Python代码来具体实现和分析两个经典模型你会看到如何从定义收益矩阵开始一步步推导出博弈的均衡。3.1 案例一囚徒困境的代码实现与均衡求解我们将使用Python的numpy库来进行矩阵运算并用简单的逻辑来寻找纳什均衡对于这种小型矩阵我们可以用遍历法。import numpy as np # 定义收益矩阵 # 玩家A的策略0-沉默 1-招供 # 玩家B的策略0-沉默 1-招供 # payoff_A[a][b] 表示当A选aB选b时A的收益 payoff_A np.array([[-1, -8], # A选沉默时对应B沉默和招供 [ 0, -5]]) # A选招供时对应B沉默和招供 # payoff_B[a][b] 表示当A选aB选b时B的收益 payoff_B np.array([[-1, 0], # B选沉默时对应A沉默和招供 [-8, -5]]) # B选招供时对应A沉默和招供 # 注意这里矩阵的索引是 (A的策略, B的策略)所以B的收益矩阵看起来是转置的但逻辑正确。 print(玩家A的收益矩阵) print(payoff_A) print(\n玩家B的收益矩阵) print(payoff_B) # 寻找纯策略纳什均衡遍历法 def find_pure_nash(payoff_A, payoff_B): nA, nB payoff_A.shape nash_equilibria [] for a in range(nA): for b in range(nB): # 检查对于A给定B选ba是否是最优反应 is_best_for_A (payoff_A[a, b] payoff_A[:, b]).all() # 检查对于B给定A选ab是否是最优反应 is_best_for_B (payoff_B[a, b] payoff_B[a, :]).all() if is_best_for_A and is_best_for_B: nash_equilibria.append((a, b)) return nash_equilibria equilibria find_pure_nash(payoff_A, payoff_B) print(\n纯策略纳什均衡策略索引, equilibria) # 映射回策略名称 strategy_names {0: 沉默, 1: 招供} for a, b in equilibria: print(f 均衡策略A选择 {strategy_names[a]}, B选择 {strategy_names[b]}) print(f 对应收益A获得 {payoff_A[a, b]}, B获得 {payoff_B[a, b]})运行这段代码输出会清晰地显示唯一的纯策略纳什均衡是招供 招供双方各获得-5的收益。这个简单的程序框架是分析任何有限策略、双人矩阵博弈的基础。3.2 案例二性别之战与混合策略均衡“性别之战”是另一个经典模型描述了即使双方有共同利益也可能因偏好不同而产生协调失败。故事是这样的一对情侣男方想去看拳击赛女方想去看芭蕾舞但他们更希望待在一起而不是分开行动。收益矩阵如下数值越大越开心男 \ 女芭蕾拳击芭蕾(2, 3)(0, 0)拳击(0, 0)(3, 2)这里存在两个纯策略纳什均衡芭蕾芭蕾和拳击拳击。但问题来了该选哪一个如果缺乏沟通男方可能猜女方会选芭蕾于是自己也选芭蕾女方可能猜男方会选拳击于是自己也选拳击结果导致拳击芭蕾或芭蕾拳击的糟糕结局收益为0。在这种情况下引入混合策略就非常自然。混合策略是指局中人以一定的概率随机选择自己的纯策略。我们可以计算混合策略纳什均衡即找到一组概率使得对方无论选择哪个纯策略其期望收益都相等从而没有动机偏离这个随机策略。我们来计算一下男方选择拳击的概率p和女方选择拳击的概率q。在混合策略均衡下给定女方的混合策略(q, 1-q)男方选择芭蕾和拳击的期望收益应该相等。import sympy as sp # 定义符号变量 p, q sp.symbols(p q) # p: 男选拳击的概率 q: 女选拳击的概率 # 男方的期望收益计算 # 男选芭蕾的期望收益当女选芭蕾(1-q)时得2当女选拳击(q)时得0 E_man_ballet 2*(1-q) 0*q # 男选拳击的期望收益当女选芭蕾(1-q)时得0当女选拳击(q)时得3 E_man_boxing 0*(1-q) 3*q # 在混合策略均衡中男方选择芭蕾和拳击的期望收益应相等 equation_man sp.Eq(E_man_ballet, E_man_boxing) # 同理计算女方的期望收益相等条件 # 女选芭蕾的期望收益当男选芭蕾(1-p)时得3当男选拳击(p)时得0 E_woman_ballet 3*(1-p) 0*p # 女选拳击的期望收益当男选芭蕾(1-p)时得0当男选拳击(p)时得2 E_woman_boxing 0*(1-p) 2*p equation_woman sp.Eq(E_woman_ballet, E_woman_boxing) # 解方程组 solution sp.solve((equation_man, equation_woman), (p, q)) print(混合策略纳什均衡概率) print(f 男方选择拳击的概率 p {solution[p]}) print(f 女方选择拳击的概率 q {solution[q]})求解结果是 p 3/5, q 2/5。这意味着在混合策略均衡中男方会以60%的概率选择拳击女方会以40%的概率选择拳击。这个结果很有意思虽然双方都更希望在一起但男方因为更偏爱拳击收益32所以在混合策略中会更倾向于选择拳击女方则相反。这个均衡的期望收益可以通过计算得到通常低于协调成功时的收益这反映了因偏好不同导致的协调成本。实操心得在编写这类代码时最容易出错的地方是收益矩阵的索引和期望收益的计算。务必明确每个维度的含义通常是payoff[行玩家的策略 列玩家的策略]并在计算期望收益时用对方的概率分布来加权自己的收益。画一个简单的决策树有助于理清思路。4. 复杂模型进阶演化博弈与重复博弈初探现实中的博弈往往不是一锤子买卖而是多次、动态的并且参与者可能不是完全理性的而是通过模仿和学习来调整策略。这就引出了两个重要的进阶方向演化博弈论和重复博弈。4.1 演化博弈策略的生存与淘汰演化博弈论将生物进化中的“自然选择”思想引入博弈论。它不假设参与者完全理性而是假设他们遵循简单的规则如模仿成功者研究策略在群体中的动态变化。一个核心概念是演化稳定策略即如果一个群体都采用该策略那么小的变异策略入侵者无法在群体中生存扩散。我们可以用“鹰鸽博弈”来模拟。假设动物争夺资源策略一是“鹰派”战斗到底策略二是“鸽派”展示威吓若对方战斗则逃跑。设定收益资源价值V4战斗成本C6。鹰对鹰双方战斗各有50%机会获胜但必然承担成本期望收益为 (V-C)/2 -1。鹰对鸽鹰获得全部资源V4鸽获得0。鸽对鹰鸽获得0鹰获得4。鸽对鸽双方分享资源各得V/22。我们用Python模拟一个由大量个体组成的群体每个个体随机配对进行鹰鸽博弈其繁殖后代的数量与其收益成正比收益可视为适应度。import numpy as np import matplotlib.pyplot as plt # 参数设置 V 4 # 资源价值 C 6 # 战斗成本 payoff_matrix np.array([ [(V-C)/2, V], # 鹰的收益对鹰对鸽 [0, V/2] # 鸽的收益对鹰对鸽 ]) def simulate_evolution(population_size1000, generations100, init_hawk_ratio0.5): 模拟鹰鸽博弈的演化过程 # 初始化群体1代表鹰0代表鸽 population np.random.choice([1, 0], sizepopulation_size, p[init_hawk_ratio, 1-init_hawk_ratio]) hawk_ratio_history [init_hawk_ratio] for gen in range(generations): # 随机配对简化每个个体与随机另一个体博弈 fitness np.zeros(population_size) for i in range(population_size): j np.random.randint(population_size) # 随机选择对手 my_strat population[i] opp_strat population[j] fitness[i] payoff_matrix[my_strat, opp_strat] # 选择与繁殖适应度转换为非负概率用于加权随机选择下一代 # 为防止负适应度进行平移 min_fitness fitness.min() if min_fitness 0: fitness_shifted fitness - min_fitness 0.01 else: fitness_shifted fitness 0.01 probabilities fitness_shifted / fitness_shifted.sum() # 通过加权随机选择生成新一代群体 population np.random.choice([1, 0], sizepopulation_size, p[probabilities.mean(), 1-probabilities.mean()]) # 更精确的方式是根据每个个体的概率选择其策略但上述均值近似简化了计算 # 这里采用更准确的模拟根据适应度比例选择父代产生子代 indices np.random.choice(np.arange(population_size), sizepopulation_size, pprobabilities) population population[indices] current_hawk_ratio population.mean() hawk_ratio_history.append(current_hawk_ratio) return hawk_ratio_history # 运行模拟 history simulate_evolution(population_size500, generations200, init_hawk_ratio0.8) # 绘制演化轨迹 plt.figure(figsize(10, 6)) plt.plot(history, linewidth2) plt.xlabel(迭代代数, fontsize12) plt.ylabel(群体中鹰派策略的比例, fontsize12) plt.title(鹰鸽博弈演化模拟 (V4, C6), fontsize14) plt.grid(True, alpha0.3) plt.axhline(y2/3, colorr, linestyle--, label理论演化稳定策略比例 (p2/3)) plt.legend() plt.show()运行这段代码你会发现无论初始“鹰派”比例是多少经过多代演化群体中“鹰派”的比例会稳定在2/3左右。这个值就是该参数下的演化稳定策略混合比例。通过改变V和C的值你可以观察均衡比例如何变化这能很好地解释自然界中攻击性行为为何不会无限扩张因为战斗成本C的存在。4.2 重复博弈从背叛走向合作单次的囚徒困境导向了相互背叛的糟糕结局。但如果同样的两个囚徒被反复审讯多次重复博弈情况就可能发生变化。因为未来还有互动背叛可能会招致后续的报复合作则可能换来长远的利益。最著名的策略是“以牙还牙”第一轮选择合作之后每一轮都重复对手上一轮的行动。如果双方都采用“以牙还牙”那么合作就可以持续。我们可以模拟一个重复囚徒困境的锦标赛。import numpy as np import itertools # 定义策略函数 def tit_for_tat(history, my_index): 以牙还牙首轮合作之后模仿对方上一轮的行动 if not history: # 第一轮 return 0 # 0代表合作沉默1代表背叛招供 else: # history[-1] 是上一轮的策略元组 (A的选择, B的选择) return history[-1][1 - my_index] # 返回对方上一轮的选择 def always_defect(history, my_index): 永远背叛 return 1 def always_cooperate(history, my_index): 永远合作 return 0 def random_strategy(history, my_index): 随机策略 return np.random.choice([0, 1]) def grudger(history, my_index): 好好先生只要对方从未背叛就一直合作一旦对方背叛一次就永远背叛 if not history: return 0 # 检查历史上对方是否有过背叛 opponent_choices [round_data[1 - my_index] for round_data in history] if 1 in opponent_choices: return 1 else: return 0 # 博弈支付矩阵基于之前的囚徒困境但改为正收益数值越大越好 # (合作 背叛) (0, 1) payoff { (0, 0): (3, 3), # 相互合作各得3分类似各判1年改为各得3分奖励 (0, 1): (0, 5), # 我合作你背叛我得0分你得5分 (1, 0): (5, 0), # 我背叛你合作我得5分你得0分 (1, 1): (1, 1) # 相互背叛各得1分 } def play_round(strategy_func_A, strategy_func_B, history): 进行一轮博弈 choice_A strategy_func_A(history, 0) choice_B strategy_func_B(history, 1) payoff_A, payoff_B payoff[(choice_A, choice_B)] return (choice_A, choice_B), payoff_A, payoff_B def run_match(strategy_A, strategy_B, rounds100): 运行两个策略的多轮对决 history [] total_A, total_B 0, 0 for _ in range(rounds): (choice_A, choice_B), score_A, score_B play_round(strategy_A, strategy_B, history) history.append((choice_A, choice_B)) total_A score_A total_B score_B return total_A, total_B # 策略列表 strategies { TitForTat: tit_for_tat, AlwaysDefect: always_defect, AlwaysCooperate: always_cooperate, Random: random_strategy, Grudger: grudger } # 进行循环赛 strategy_names list(strategies.keys()) n len(strategy_names) results np.zeros((n, n)) print(重复囚徒困境锦标赛结果行策略对列策略的总得分) print(策略名称:, strategy_names) for i, name_i in enumerate(strategy_names): row_scores [] for j, name_j in enumerate(strategy_names): score_i, score_j run_match(strategies[name_i], strategies[name_j], rounds200) results[i, j] score_i row_scores.append(score_i) print(f{name_i:15s}: {row_scores}) # 计算每个策略的总分 total_scores results.sum(axis1) print(\n各策略总排名) ranked_indices np.argsort(total_scores)[::-1] # 降序排列 for rank, idx in enumerate(ranked_indices): print(f第{rank1}名: {strategy_names[idx]} 总分{total_scores[idx]:.0f})在这个模拟中你往往会发现“以牙还牙”和“好好先生”这类“宽容但具有报复性”的策略表现优异而“永远背叛”虽然能在与“永远合作”的对决中占便宜但在多样化的策略环境中总分并不高。这解释了在长期关系中建立基于互惠的合作机制是可能的也是演化上稳定的。5. 商业场景应用价格战与合谋的博弈分析理论学得再多不如看一个贴近现实的例子。我们用一个简化的双寡头价格竞争模型伯川德模型来展示对策论在商业决策中的应用。假设市场上有两家公司生产同质化产品边际成本均为c10。他们同时决定价格P1和P2。消费者总是选择价格更低的产品。如果价格相同则平分市场。市场需求函数为 Q 100 - P其中P是市场最低价。那么每家公司的利润函数为如果 P1 P2: 公司1获得全部市场需求利润 π1 (P1 - c) * (100 - P1)公司2利润为0。如果 P1 P2: 公司2获得全部市场需求利润 π2 (P2 - c) * (100 - P2)公司1利润为0。如果 P1 P2: 两家平分市场利润 π1 π2 0.5 * (P1 - c) * (100 - P1)。这个博弈的纳什均衡是什么我们可以用Python来寻找。import numpy as np c 10 # 边际成本 price_range np.arange(c, 100) # 可能的价格范围从成本价到100 # 计算利润的函数 def profit(price_self, price_other): if price_self price_other: return (price_self - c) * (100 - price_self) elif price_self price_other: return 0 else: # 价格相等 return 0.5 * (price_self - c) * (100 - price_self) # 构建最佳反应函数给定对手价格我的最优价格 best_response {} for p_other in price_range: profits [profit(p, p_other) for p in price_range] best_price_idx np.argmax(profits) best_response[p_other] price_range[best_price_idx] # 寻找纳什均衡满足 P1 BR(P2) 且 P2 BR(P1) 的价格对 nash_equilibria [] for p1 in price_range: p2 best_response[p1] if best_response[p2] p1: # 检查是否互为最优反应 nash_equilibria.append((p1, p2)) print(可能的纯策略纳什均衡价格对 (P1, P2):) for eq in set(nash_equilibria): # 去重 print(f 公司1价格: {eq[0]}, 公司2价格: {eq[1]}) print(f 公司1利润: {profit(eq[0], eq[1]):.2f}, 公司2利润: {profit(eq[1], eq[0]):.2f})运行代码你会发现唯一的纯策略纳什均衡是 P1 P2 c 10。此时利润为0这就是伯川德悖论即使只有两家公司产品同质化下的价格竞争也会导致完全竞争的结果利润被挤压至零。这解释了现实中为何企业要拼命进行产品差异化、建立品牌忠诚度——就是为了跳出这个“囚笼”。如果两家公司合谋像垄断者一样行动他们会共同制定价格P以最大化总利润总利润 π_total (P - c) * (100 - P)。通过求导可得最优垄断价格 P_mon (100 c) / 2 55此时总利润为 (55-10)(100-55)2025每家分得1012.5。这远高于竞争均衡的0利润。但合谋协议是不稳定的因为任何一家公司都有动机偷偷降价一点比如降到54以抢夺全部市场获得利润 (54-10)(100-54)2024几乎翻倍。这又回到了囚徒困境的结构。因此在一次性博弈中合谋难以维持但在重复博弈中通过“以牙还牙”式的惩罚机制你敢降价我下一期也降价合谋有可能成为均衡。6. 模型局限与实战心得对策论模型提供了强大的分析框架但它并非万能钥匙。在实际应用中有几个关键的局限性必须时刻警惕。首先理性人假设的挑战。模型假设局中人完全理性且无限聪明能精确计算所有策略的收益并做出最优反应。现实中人的决策受认知局限、情绪、偏见影响。比如在“最后通牒博弈”中理论上回应者应该接受任何正数的分配方案因为总比没有好但实验表明人们常常会拒绝他们认为“不公平”的分配即使自己受损。这时就需要将“公平偏好”等行为经济学因素纳入模型。其次共同知识假设。博弈论通常假设收益矩阵、理性程度是所有局中人的“共同知识”我知道你知道我知道我知道你知道我知道……。现实中信息往往是不对称、不完整的。比如在拍卖中你对拍品的估价只有你自己清楚。这引出了更复杂的“贝叶斯博弈”模型。再者模型是对现实的极端简化。商业竞争中的策略空间是连续且多维的价格、质量、营销、渠道远非几个离散选项能概括。收益也难以精确量化品牌声誉、长期客户关系等无形价值很难放入矩阵。在我的实战经验中对策论模型最大的价值不在于给出一个精确的“最优解”而在于提供一种系统性的思考方式。它强迫你明确以下几点谁是决策者界定局中人有时需要把不同部门甚至客户也考虑进来。他们有哪些可行的选择穷举策略空间哪怕只是主要选项。不同选择组合下各自的结果是什么定性或定量估算收益这是最耗时但也最关键的一步。是否存在稳定的均衡点寻找纳什均衡预测可能的结果。如何改变博弈结构通过改变收益、引入新的策略或局中人来引导博弈走向更理想的结果例如设计激励机制或签订长期合同。例如在为一个内容平台设计创作者激励方案时我们就把平台和创作者看作博弈双方。平台策略是“高补贴/低补贴”创作者策略是“深耕内容/追逐热点”。通过构建收益矩阵并分析均衡我们发现单纯的高补贴可能导致创作者追逐短期流量而损害内容生态而“适度补贴流量倾斜于优质内容”的规则设计能引导博弈走向一个“平台获得优质内容、创作者获得长期收益”的更优均衡。这个过程就是对策论思维的典型应用。最后关于工具对于快速原型和教学Python的numpy,sympy,nashpy一个专门计算纳什均衡的库就足够了。对于更复杂的动态博弈或涉及大量智能体的模拟可能需要用到专门的仿真平台。但记住工具只是辅助最核心的永远是你对问题本质的洞察和建模能力。从今天起试着用“收益矩阵”的视角去审视身边的竞争与合作你会发现很多现象背后都有一套简洁而深刻的博弈逻辑在运转。

相关新闻