简介这份资源面向博弈论学习者、高校学生及对策略分析感兴趣的IT从业者聚焦3个参与者的非合作博弈与合作博弈的MATLAB实现帮助读者把纳什均衡、联盟博弈、Shapley值等抽象概念落到可运行的代码上。压缩包为zip格式整体约10.44MB上游未提供具体文件数量与类型明细从描述看应包含MATLAB脚本与函数文件用于构建支付矩阵、迭代求解均衡策略、模拟联盟结构与收益分配可能还涉及零和与非零和、完全信息与不完全信息等扩展博弈类型。目前已有975人浏览学习说明该主题在相关群体中具备一定关注度。读者可借助其中的代码框架理解博弈建模思路掌握用矩阵运算与优化算法查找均衡解的方法并在此基础上修改参数、扩展参与者数量或尝试新的博弈场景适合作为课程实验、课题研究或自学练习的参考素材。1. 三个参与者的博弈从“新建文件夹”到能跑出纳什均衡你拿到一个压缩包解压后只有一个叫“新建文件夹_3个参与者的非合作博弈_博弈_MATLAB合作博弈_合作博弈”的目录里面躺着几个 .m 文件和一个说明文档。这不是什么神秘项目而是一份典型的博弈论课程设计或科研入门作业用 MATLAB 把三个参与者之间的非合作博弈和合作博弈各跑一遍输出均衡解、收益矩阵和可能的核仁或夏普利值。它解决的核心问题是——当参与者从两个变成三个策略空间从矩阵变成三维张量手算几乎不可能必须靠代码枚举或迭代求解。适合谁正在做博弈论大作业的本科生、需要快速验证三人博弈模型的研究生以及想用 MATLAB 把抽象博弈论落成可复现数字的工程师。热搜里“MATLAB”“非合作博弈”“合作博弈”反复出现说明大家卡在同一个地方知道定义但不知道怎么让代码跑出正确结果。2. 三人非合作博弈纯策略与混合策略的 MATLAB 枚举三人非合作博弈和两人最大的区别在于收益不再是一个矩阵而是一个三维数组。参与者1选行、参与者2选列、参与者3选页每个单元格里放一个三元组分别对应三人的收益。纯策略纳什均衡的判定逻辑很直接对每个策略组合检查任何一个人单独偏离后收益是否变高。如果三个人都没有单方面偏离动机这个组合就是纯策略纳什均衡。听起来简单但三人各3个策略就是27个组合每个组合要检查3次偏离手算容易漏。MATLAB 的优势在于把“检查偏离”写成循环几行代码就能穷举。2.1 用三维数组存收益维度顺序与索引陷阱先定义收益数组。常见做法是payoff zeros(3,3,3,3)最后一维放三个参与者的收益。但更清晰的方式是分开存三个3×3×3数组分别对应参与者1、2、3的收益。这样在检查偏离时不用反复取payoff(:,:,:,i)代码可读性更高。下面是一个三人各三策略的收益定义示例策略名用s1,s2,s3表示。% 三人各3个策略收益分开存每个数组维度为 3x3x3 % 维度顺序行参与者1策略列参与者2策略页参与者3策略 payoff1 zeros(3,3,3); payoff2 zeros(3,3,3); payoff3 zeros(3,3,3); % 填充收益这里给一组对称但非平凡的数值便于验证 % 参与者1收益 payoff1(:,:,1) [4 1 3; 2 5 0; 3 2 4]; payoff1(:,:,2) [2 3 1; 5 0 4; 1 4 2]; payoff1(:,:,3) [3 0 2; 1 4 5; 4 1 3]; % 参与者2收益转置前两维模拟策略交互差异 payoff2 permute(payoff1, [2 1 3]) * 0.8 0.5; % 参与者3收益再换一种映射避免完全对称 payoff3 permute(payoff1, [3 2 1]) * 0.6 1.0;逻辑说明payoff1(:,:,1)表示参与者3选策略1时参与者1和2的策略组合对应的收益矩阵。permute用来交换维度制造参与者之间的收益差异避免三人完全对称导致均衡过多。参数说明0.8和0.5只是示例系数实际建模时按问题背景填写。注意维度顺序一旦定下后面所有索引都必须一致否则会出现“策略对不上收益”的翻车。2.2 纯策略纳什均衡的穷举脚本与偏离检查有了收益数组穷举就水到渠成。核心是三层循环遍历所有策略组合再对每个参与者检查“换策略后收益是否更高”。下面这段代码直接可跑。n 3; % 每个参与者的策略数 pureNE []; % 存纯策略纳什均衡的策略组合 for i 1:n for j 1:n for k 1:n % 当前组合收益 u1 payoff1(i,j,k); u2 payoff2(i,j,k); u3 payoff3(i,j,k); % 检查参与者1偏离固定j,k遍历i dev1 false; for ip 1:n if payoff1(ip,j,k) u1 dev1 true; break; end end % 检查参与者2偏离固定i,k遍历j dev2 false; for jp 1:n if payoff2(i,jp,k) u2 dev2 true; break; end end % 检查参与者3偏离固定i,j遍历k dev3 false; for kp 1:n if payoff3(i,j,kp) u3 dev3 true; break; end end if ~dev1 ~dev2 ~dev3 pureNE [pureNE; i j k]; end end end end disp(纯策略纳什均衡行参与者1策略列参与者2策略页参与者3策略); disp(pureNE);逻辑说明对每个组合(i,j,k)分别检查三个参与者是否存在单方面偏离后收益严格更高的策略。只有三人都没有偏离动机时才记录为纯策略纳什均衡。参数说明n是策略数改成其他值也能跑表示严格改进如果允许无差异偏离可改成但那样均衡会变多通常不建议。运行后如果pureNE为空说明该博弈没有纯策略纳什均衡需要转向混合策略。2.3 混合策略用迭代法逼近三人纳什均衡三人混合策略纳什均衡没有像两人零和博弈那样的线性规划直接解法常见做法是迭代最佳响应。思路是给每个参与者初始化一个混合策略概率分布然后轮流固定其他两人的分布计算自己的期望收益把概率质量移到期望收益最高的纯策略上反复迭代直到分布变化小于阈值。下面是一个简化版实现。maxIter 1000; tol 1e-6; p1 ones(1,n)/n; p2 ones(1,n)/n; p3 ones(1,n)/n; for iter 1:maxIter % 更新参与者1固定p2,p3计算每个纯策略的期望收益 exp1 zeros(1,n); for i 1:n for j 1:n for k 1:n exp1(i) exp1(i) p2(j)*p3(k)*payoff1(i,j,k); end end end [~, best1] max(exp1); new_p1 zeros(1,n); new_p1(best1) 1; p1 p1 (new_p1 - p1) * 0.1; % 平滑更新避免震荡 % 更新参与者2 exp2 zeros(1,n); for j 1:n for i 1:n for k 1:n exp2(j) exp2(j) p1(i)*p3(k)*payoff2(i,j,k); end end end [~, best2] max(exp2); new_p2 zeros(1,n); new_p2(best2) 1; p2 p2 (new_p2 - p2) * 0.1; % 更新参与者3 exp3 zeros(1,n); for k 1:n for i 1:n for j 1:n exp3(k) exp3(k) p1(i)*p2(j)*payoff3(i,j,k); end end end [~, best3] max(exp3); new_p3 zeros(1,n); new_p3(best3) 1; p3 p3 (new_p3 - p3) * 0.1; % 收敛判断 if norm(p1 - new_p1) tol norm(p2 - new_p2) tol norm(p3 - new_p3) tol break; end end fprintf(迭代次数%d\n, iter); fprintf(参与者1混合策略%.4f %.4f %.4f\n, p1); fprintf(参与者2混合策略%.4f %.4f %.4f\n, p2); fprintf(参与者3混合策略%.4f %.4f %.4f\n, p3);逻辑说明每次只让一个参与者把概率质量向当前最佳纯策略移动一小步0.1是学习率。学习率太大容易震荡太小收敛慢。参数说明maxIter和tol按精度需求调整如果迭代结束还没收敛可以减小学习率或增加迭代次数。注意这个迭代法不保证收敛到唯一均衡三人博弈可能存在多个混合均衡初始值不同结果可能不同这是常见现象不是代码写错了。3. 三人合作博弈夏普利值与核仁的 MATLAB 实现合作博弈关注的是参与者结成联盟后如何分配总收益。三人合作博弈的特征函数v(S)定义在所有子集上空集收益为0单人联盟收益为各自单干收益双人联盟收益为两人合作总收益三人联盟收益为全体合作总收益。核心解概念是夏普利值它按“边际贡献”的平均值分配收益计算上就是遍历所有排列对每个参与者计算他加入前联盟时的收益增量再取平均。三人只有6种排列手算可行但用 MATLAB 写出来更不容易错也方便改成更多人。3.1 特征函数定义与夏普利值计算脚本先定义特征函数。常见做法是用一个结构体或映射表存每个子集的收益。三人子集一共7个非空{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。下面用数组按固定顺序存索引对应子集编号。% 子集顺序1{1}, 2{2}, 3{3}, 4{1,2}, 5{1,3}, 6{2,3}, 7{1,2,3} v zeros(1,7); v(1) 10; % 参与者1单干 v(2) 8; % 参与者2单干 v(3) 6; % 参与者3单干 v(4) 25; % 1和2合作 v(5) 20; % 1和3合作 v(6) 18; % 2和3合作 v(7) 40; % 三人合作 % 所有排列 perms3 perms([1 2 3]); shapley zeros(1,3); for p 1:size(perms3,1) order perms3(p,:); coalition []; for idx 1:3 player order(idx); % 加入前的联盟收益 if isempty(coalition) v_before 0; else v_before getV(coalition, v); end % 加入后的联盟收益 coalition_after sort([coalition player]); v_after getV(coalition_after, v); % 边际贡献累加 shapley(player) shapley(player) (v_after - v_before); end end shapley shapley / size(perms3,1); fprintf(夏普利值参与者1%.4f参与者2%.4f参与者3%.4f\n, shapley(1), shapley(2), shapley(3)); % 辅助函数根据联盟成员返回特征函数值 function val getV(members, v) key sort(members); if isequal(key, [1]), val v(1); elseif isequal(key, [2]), val v(2); elseif isequal(key, [3]), val v(3); elseif isequal(key, [1 2]), val v(4); elseif isequal(key, [1 3]), val v(5); elseif isequal(key, [2 3]), val v(6); elseif isequal(key, [1 2 3]), val v(7); else, val 0; end end逻辑说明perms([1 2 3])生成6种加入顺序。对每种顺序依次让参与者加入当前联盟计算加入前后的特征函数差值即边际贡献。累加后除以6得到夏普利值。参数说明v数组的数值按实际问题填写但必须满足超可加性即大联盟收益不小于任何拆分后的收益之和否则夏普利值可能为负分配无意义。辅助函数getV用isequal判断联盟成员注意排序后再比较避免顺序不同导致匹配失败。3.2 核仁与稳定集用线性规划找分配方案夏普利值给出一个具体分配但不一定在核仁里。核仁是满足所有联盟“不满意度”最小化的分配方案通常用线性规划求解。MATLAB 的linprog可以直接用。三人合作博弈的核仁问题可以写成最小化最大超额值e约束是每个联盟的分配之和加上e不小于该联盟的特征函数值且总分配等于大联盟收益。下面是一个可跑的linprog示例。% 变量顺序[x1, x2, x3, e] % 目标最小化 e f [0 0 0 1]; % 不等式约束 A*x b这里写成 -x(S) - e -v(S) % 联盟 {1}: -x1 - e -v(1) % 联盟 {2}: -x2 - e -v(2) % 联盟 {3}: -x3 - e -v(3) % 联盟 {1,2}: -x1-x2 - e -v(4) % 联盟 {1,3}: -x1-x3 - e -v(5) % 联盟 {2,3}: -x2-x3 - e -v(6) % 联盟 {1,2,3}: -x1-x2-x3 - e -v(7) A [-1 0 0 -1; 0 -1 0 -1; 0 0 -1 -1; -1 -1 0 -1; -1 0 -1 -1; 0 -1 -1 -1; -1 -1 -1 -1]; b -v([1 2 3 4 5 6 7]); % 等式约束x1x2x3 v(7) Aeq [1 1 1 0]; beq v(7); % 变量下界x1,x2,x3 无下界可负e 无下界 lb [-inf -inf -inf -inf]; ub [inf inf inf inf]; [x, fval] linprog(f, A, b, Aeq, beq, lb, ub); fprintf(核仁分配x1%.4fx2%.4fx3%.4f最大超额 e%.4f\n, x(1), x(2), x(3), x(4));逻辑说明e是最大超额值越小说明分配越稳定。约束-x(S) - e -v(S)等价于x(S) e v(S)即每个联盟分到的总和不低于其单干收益减去e。等式约束保证总分配等于大联盟收益。参数说明lb和ub设为无穷表示不限制分配正负但实际合作博弈中通常要求个体理性即x(i) v(i)可以额外加约束。如果linprog报无解检查特征函数是否满足超可加性或者把e的下界放宽。4. 避坑与排查三人博弈代码最容易翻车的五个地方三人博弈的代码量不大但维度一多错误往往很隐蔽。下面五条是我自己踩过或者帮别人排查时反复遇到的每条按“现象→原因→解决”写照着查能省不少时间。现象一纯策略纳什均衡结果为空但理论上应该有。原因通常是收益数组维度顺序搞混了。比如payoff1(i,j,k)里i是参与者1的策略但填充数据时按(参与者3, 参与者2, 参与者1)的顺序填了。解决在填充前先写注释明确维度顺序填充后用size检查再随机抽一个组合手动算一遍偏离和代码输出对比。现象二混合策略迭代不收敛概率一直在震荡。原因多半是学习率太大或者博弈本身没有唯一混合均衡。解决把学习率从0.1降到0.01增加迭代次数如果仍然震荡说明存在多个均衡可以换几组初始值观察是否收敛到不同分布这本身也是有效信息。现象三夏普利值算出来是负数或者总和不对。原因有两个一是特征函数不满足超可加性比如v(1,2) v(1)v(2)这样合作没有增益夏普利值可能为负二是getV函数里联盟匹配漏了某个子集导致边际贡献算错。解决先检查v(4) v(1)v(2)、v(5) v(1)v(3)、v(6) v(2)v(3)、v(7) v(4)v(3)等超可加条件再检查getV是否覆盖所有7个子集。现象四linprog报“无可行解”。原因通常是约束写反了符号或者b的维度不对。解决把A*x b逐条写出来确认每个联盟的约束方向一致检查b -v(...)是否转置成了列向量linprog要求b是列向量。现象五代码在 MATLAB 2023 里跑中文注释乱码。这是热搜里反复出现的问题。原因MATLAB 2023 默认编码可能是 GBK而文件保存为 UTF-8。解决在 MATLAB 命令行执行feature(DefaultCharacterSet,UTF-8)或者用编辑器另存为时选择 UTF-8 编码如果已经乱码用native2unicode转换但最稳妥的还是统一保存为 UTF-8 并在启动时设置编码。提示三人博弈的收益数组一旦维度超过3建议用ndgrid生成索引避免手写多层循环时把i,j,k写混。5. 从三人到N人用元胞数组和递归把代码写活三人博弈的代码写完后最自然的想法是扩展到更多人。但每增加一个参与者循环层数就多一层收益数组维度也多一维硬编码很快就不现实。我一般会把收益存成元胞数组每个元胞对应一个参与者的收益函数句柄然后用递归或ndgrid生成所有策略组合。这样从三人到五人代码结构不用大改。具体做法定义nPlayers和每个参与者的策略数nStrategies用ndgrid生成所有组合的索引矩阵。下面是一个通用框架以三人为例但改成四人只需改nPlayers。nPlayers 3; nStrategies [3 3 3]; % 每个参与者的策略数 % 生成所有策略组合 grids cell(1, nPlayers); [grids{:}] ndgrid(1:nStrategies(1), 1:nStrategies(2), 1:nStrategies(3)); allCombos cell2mat(cellfun((x) x(:), grids, UniformOutput, false)); % 收益函数输入一个组合返回三个参与者的收益 payoffFunc (combo) [ ... combo(1)*2 combo(2) combo(3); ... combo(1) combo(2)*2 combo(3); ... combo(1) combo(2) combo(3)*2]; % 穷举纯策略纳什均衡 pureNE []; for c 1:size(allCombos,1) combo allCombos(c,:); u payoffFunc(combo); isNE true; for p 1:nPlayers for s 1:nStrategies(p) devCombo combo; devCombo(p) s; uDev payoffFunc(devCombo); if uDev(p) u(p) isNE false; break; end end if ~isNE, break; end end if isNE pureNE [pureNE; combo]; end end disp(纯策略纳什均衡); disp(pureNE);逻辑说明ndgrid生成所有策略组合的笛卡尔积allCombos每行是一个组合。payoffFunc接收组合返回收益向量替换成实际收益计算即可。偏离检查用devCombo临时替换第p个参与者的策略比较收益。参数说明nStrategies改成[3 3 3 3]就是四人博弈但组合数会变成81计算量仍然可控如果策略数继续增大需要改用迭代最佳响应而不是穷举。验证方法对三人情况把通用框架的输出和前面手写三层循环的结果对比如果一致说明框架正确。然后逐步增加参与者数量观察均衡数量和计算时间的变化。我自己的习惯是每扩展一次维度先用一个已知答案的小例子验证再跑真实数据。三人博弈是理解多人博弈的跳板把这一层写扎实后面加人只是改参数的事。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
ESP32上跑WASM:从Runtime原理到实战踩坑 1. 从一颗芯片的困惑说起:ESP32 凭什么跑 WASM第一次听说有人要在 ESP32 上跑 WebAssembly,我的反应和大多数人一样:这不是胡闹吗?ESP32 用的是 Xtensa 或者 RISC-V 架构的 CPU,指令集跟 x86、ARM 完全不搭边ÿ… · 2026/9/23 10:33:04
UNet遥感影像语义分割实战:从切片到训练的PyTorch完整指南 简介:面向毕业设计场景的基于UNet的遥感图像语义分割完整实现,适合计算机视觉方向的本科生及研究生参考。资源内含69个文件,包含Python源码与pyc编译文件、Jupyter Notebook演示脚本、PNG示例图、LaTeX论文源文件以及PDF文档,包体… · 2026/9/23 10:33:04
C#学生管理系统带数据库:连接、避坑与二次开发指南 简介:基于C#与MySQL的学生管理系统完整项目,面向需要参考教务管理、多角色权限或三层架构设计的C#学习者和开发者。压缩包共99个文件,约5.27MB,核心包含33个.cs源码文件、14个.resx界面资源、2个.sql数据库脚本以及sln/csproj工程… · 2026/9/23 10:33:04
权利的游戏第一季迅雷手写实现:3个完整示例搞定项目 权利的游戏第一季迅雷手写实现:3个完整示例搞定项目 看了一堆教程还是不会写项目?别急,问题不在你笨,在于没人给你看 完整示例 。 我见过太多学员,理论背得滚瓜烂熟,一动手就抓瞎。今天这篇,不整虚的,直接上干货。… · 2026/9/23 11:11:03
签到图标避坑指南:拆解前端状态同步核心逻辑 签到图标避坑指南:拆解前端状态同步核心逻辑 版本升级后 API 全变了?别慌,很多开发者在重构老旧项目时,最头疼的不是业务逻辑,而是那些看似简单却暗藏玄机的 UI 状态同步问题。尤其是 签到图标… · 2026/9/23 11:11:03
3步搞定爱普生l383图解原理,拒绝配置卡半天 3步搞定爱普生l383图解原理,拒绝配置卡半天 配置环境就卡半天?爱普生l383驱动装不上,打印测试页全黑,这时候别急着砸打印机。很多开发者在处理打印驱动底层逻辑或嵌入式控制时,往往被“黑盒”状态劝退。今天不聊虚的,直接上 图解原理… · 2026/9/23 11:10:56
激光设备电源系统设计:从负载特性到工程调试的完整指南 1. 激光设备电源系统到底在供什么1.1 从激光器的负载特性说起很多人第一次接触激光设备时,会把注意力全放在光学谐振腔、泵浦源、冷却系统上,觉得电源不过是个“插上就能用”的配角。但实际在产线上待久了就会发现,激光器出光功率不稳、脉冲波… · 2026/9/23 11:10:50
可调试的NLP词云联想实战源码包 简介:本资源是一个面向高校计算机专业初学者的自然语言处理实践项目,聚焦词云生成与语义联想功能实现,适用于NLP入门学习、课程设计参考及AI可视化教学场景。项目基于Python开发,完整包含757个文件,以347张PNG词云效果… · 2026/9/23 11:10:43
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29