☰
Matlab实现多智能体离散纳什均衡寻优算法详解
2026/11/3 4:29:34 网站建设 项目流程

1. 从博弈论到代码:这个课题到底在解决什么问题

多智能体系统这几年在控制、通信、经济仿真、自动驾驶编队这些圈子里被反复提起,但真正落到"求解"两个字上,很多人第一反应还是连续时间的微分博弈、一致性协议那一套。可现实里大量场景压根不是连续的——频谱分配、任务拍卖、路由选择、资源竞价,参与方能选的策略是有限个离散档位,谁选了哪一档,收益就按一张收益矩阵来算。这种"策略空间有限、每个智能体各自优化自身收益"的结构,天然对应博弈论里的离散纳什均衡问题。

我最早接触这个方向是因为一个频谱共享的小项目:几个次级用户要在若干离散信道里挑一条接入,每条信道的干扰随接入人数变化,谁都想挑干扰小的,但挑的人一多干扰就上来了。这就是典型的离散博弈,均衡点就是"没有任何一个用户能通过单方面换信道让自己收益变好"的那个策略组合。问题在于,策略组合的数量随智能体个数指数爆炸,穷举在十几个智能体时就已经不现实了,必须靠寻优算法去逼近。

这篇博文要聊的,就是怎么用Matlab把"多智能体系统的离散纳什均衡寻优算法"从公式变成能跑的代码。我会把整体设计思路、收益矩阵的构造、几种主流寻优算法的实现细节、参数怎么调、跑出来不对怎么排查,全部拆开讲清楚。适合正在做博弈论仿真、多智能体强化学习、分布式决策相关课题的同学,也适合手上有 Matlab 但不知道怎么把理论落地的工程人员。哪怕你只是刚学完博弈论基础、想找个能跑的实例,跟着走一遍也能把整条链路打通。

需要先说明一点:纳什均衡的"寻优"和传统优化里的"求最小值"不是一回事。传统优化有一个全局目标函数,你往下降就行;纳什均衡是每个智能体各自的目标函数,你要找的是一个互相都不愿意单方面偏离的稳定点。这个本质区别决定了算法设计、收敛判据、验证方式全都不同,后面每一节我都会围绕这个核心展开。

2. 整体设计与思路拆解

2.1 为什么离散博弈不能照搬连续博弈的解法

连续博弈里,纳什均衡通常通过求解一组耦合的最优性条件(KKT 系统)来获得,梯度、雅可比矩阵这些工具都能用上。但离散博弈的策略空间是有限集合,梯度根本不存在,你没法对"选信道 1 还是信道 2"求导。所以连续那套基于梯度的迭代方法在这里直接失效。

那能不能穷举?理论上可以,N 个智能体、每个 M 个策略,总组合数是 M 的 N 次方。10 个智能体、5 个策略就是 976 万种组合,每种组合还要算 N 个收益,单机跑一遍要几分钟到几十分钟,而且智能体数量稍微上去就彻底崩了。所以穷举只能作为小规模验证的基准(ground truth),不能作为实际求解手段。

这就逼出了两条主流路线:一是**基于最优响应动态(Best Response Dynamics)的迭代,二是基于博弈学习(如虚拟对局、Q-learning 类)**的迭代。前者收敛快但可能陷入循环,后者更鲁棒但收敛慢。我在实际项目里的做法是两者结合,先用最优响应快速逼近,再用学习类方法做精细修正,这个混合思路后面会详细展开。

2.2 收益矩阵的构造:整个仿真的地基

所有寻优算法的输入都是一张收益表。对每个智能体 i,给定所有智能体的策略组合,它有一个收益值。工程上最省事的做法是构造一个 N 维数组,维度分别是各智能体的策略数,每个元素存对应组合下各智能体的收益。

这里有个容易踩的坑:收益矩阵的对称性和势博弈性质。如果这个博弈是势博弈(potential game),那它一定存在纯策略纳什均衡,而且可以用势函数下降法求解,收敛性有理论保证。很多实际场景(比如拥塞博弈、信道分配)恰好是势博弈。所以我在建模第一步就会检查:能不能构造出一个势函数,使得每个智能体单方面改变策略带来的收益变化,和势函数的变化一致。如果能,后面算法选择就轻松很多。

Matlab 里构造收益矩阵我一般用多维数组配合ndgrid生成所有策略组合的索引,再向量化计算收益,避免多层 for 循环。举个例子,3 个智能体各 4 个策略,用ndgrid(1:4,1:4,1:4)拿到所有组合的坐标,然后一次性算出收益,速度比嵌套循环快一个数量级。

2.3 算法选型的三个考量维度

选哪种寻优算法,我通常看三个维度:规模、是否势博弈、对收敛速度的要求。

规模小(智能体少于 8 个、策略少于 6 个)且是势博弈,直接用最优响应动态,几十次迭代就收敛,代码也简单。规模中等但不是势博弈,用虚拟对局(Fictitious Play),它对策略的经验频率做最优响应,能处理循环但收敛慢。规模大或者策略空间连续化处理过,就上多智能体 Q-learning 或者分布式最优响应,配合邻居信息交换。

下面这张表是我总结的选型对照,实际项目里基本照着这个走:

场景特征推荐算法收敛速度实现难度是否保证收敛
小规模势博弈最优响应动态快低是
小规模非势博弈虚拟对局中中弱保证
中大规模分布式最优响应中中高势博弈下是
大规模/在线多智能体 Q-learning慢高概率收敛
验证基准穷举极慢低精确

提示:不要一上来就上 Q-learning。我见过太多人为了"显得高级"直接上强化学习,结果小规模问题本来最优响应 20 行代码就搞定,硬是写了几百行还调不出收敛。工具要匹配问题规模。

3. 核心细节解析与实操要点

3.1 收益矩阵的向量化构造与内存控制

先看收益矩阵怎么建。假设 N 个智能体,第 i 个有 M_i 个策略。总组合数是 prod(M_i)。我用一个 N 维数组U存储,U(k1,k2,...,kN)是一个长度为 N 的向量,第 i 个分量是智能体 i 的收益。

Matlab 实现的关键是避免显式循环。核心代码大概长这样:

M = [4 4 4]; % 各智能体策略数 N = numel(M); grids = cell(1,N); [grids{:}] = ndgrid(1:M(1), 1:M(2), 1:M(3)); % grids{i} 是 N 维数组,存第 i 个智能体在各组合下的策略索引

拿到grids之后,收益计算就可以整体向量化。比如信道分配场景,收益是-干扰,干扰等于同信道人数减一,那么:

% 假设策略就是信道编号 sameChannel = zeros(size(grids{1})); for i = 1:N for j = i+1:N sameChannel = sameChannel + (grids{i} == grids{j}); end end % 每个智能体的收益 = -(同信道其他用户数)

这里sameChannel是 N 维数组,每个位置存该组合下两两同信道的计数。这种写法比三重循环快得多,而且代码短。

内存上要注意:N 维数组的大小是 prod(M_i) 乘以每个元素的字节数。如果 N=10、每个 M=5,那就是 976 万乘 8 字节约 78MB,还能接受;但如果 N=15,直接到 300 亿,内存爆掉。所以大规模场景必须放弃显式存储全收益矩阵,改成按需计算收益函数。这是实操里非常关键的一条经验,很多教程不讲,导致学生一跑就 out of memory。

3.2 最优响应动态的实现与循环陷阱

最优响应动态的逻辑很直白:每一轮,每个智能体在其他人策略固定的前提下,选让自己收益最大的策略。如果所有人都不再改变,就到达了纳什均衡。

代码骨架:

function [s, converged, iter] = bestResponseDynamics(U, M, maxIter) N = numel(M); s = ones(1,N); % 初始策略 for iter = 1:maxIter changed = false; for i = 1:N % 固定其他人策略,扫描智能体 i 的所有策略 bestVal = -inf; bestAct = s(i); for a = 1:M(i) sTmp = s; sTmp(i) = a; val = getPayoff(U, sTmp, i); if val > bestVal bestVal = val; bestAct = a; end end if bestAct ~= s(i) s(i) = bestAct; changed = true; end end if ~changed converged = true; return; end end converged = false; end

看起来没问题,但循环陷阱是这里最大的坑。非势博弈里,最优响应动态可能进入一个周期循环:A 改完 B 改,B 改完 A 又改回去,永远不收敛。我实测过一个 3 人博弈,策略数各 3,最优响应在 4 个状态之间来回跳,跑一万次迭代都不停。

解决办法有两个。一是同步更新改成异步更新,每轮只随机挑一个智能体更新,降低循环概率。二是加阻尼,以概率 p 执行最优响应,以 1-p 随机探索,这就是后面要讲的 Q-learning 思路的雏形。我在项目里一般先跑同步版,如果检测到循环(比如状态重复出现),自动切换到异步版。

3.3 虚拟对局的频率更新机制

虚拟对局的核心是每个智能体维护一张"对手策略经验频率表",然后对这个经验分布做最优响应。它比纯最优响应稳,因为它不会因为对手一次策略变化就剧烈反应。

实现上,每个智能体 i 维护一个计数矩阵count{i},记录历史上观察到的其他智能体各策略出现次数。每轮:

  1. 每个智能体根据当前经验频率,计算对每个自己策略的期望收益;
  2. 选期望收益最大的策略;
  3. 更新所有智能体的经验计数。

期望收益的计算是这里的关键,也是计算量最大的地方。对智能体 i 的策略 a,期望收益等于对所有对手策略组合按经验频率加权求和。如果对手多、策略多,这个求和是组合爆炸的。实操里我用蒙特卡洛采样近似:从经验分布里采样若干组对手策略,算平均收益,采样数取 200 到 500 就足够稳。这样把指数复杂度降成线性。

注意:虚拟对局的收敛在一般博弈里没有严格保证,只在少数特殊博弈(如零和、势博弈)里有理论结果。所以跑的时候一定要设最大迭代数,并且用"策略频率是否稳定"作为收敛判据,而不是"策略是否不再变化"。

3.4 收敛判据怎么设才靠谱

很多人写代码只判断"策略不再变化",这在有循环的博弈里会误判。我一般用三重判据:

  • 策略稳定判据:连续 K 轮(K 取 10 到 20)所有智能体策略不变;
  • 收益稳定判据:所有智能体收益的波动小于阈值 epsilon(比如 1e-4);
  • 偏离增益判据:对当前策略组合,计算每个智能体单方面偏离能获得的最大增益,如果全部小于 epsilon,就确认是纳什均衡。

第三条是最本质的,因为它直接对应纳什均衡的定义。前两条只是加速判断。我通常每轮都算第三条,虽然多花点计算,但能避免"假收敛"。

function gain = maxUnilateralGain(U, s, M, N) gain = 0; for i = 1:N curVal = getPayoff(U, s, i); for a = 1:M(i) sTmp = s; sTmp(i) = a; gain = max(gain, getPayoff(U, sTmp, i) - curVal); end end end

这个函数返回的值如果接近 0,说明当前点就是纳什均衡。它同时也是验证算法结果正确性的黄金标准。

4. 实操过程与核心环节实现

4.1 一个完整的信道分配仿真实例

光讲框架太虚,我拿一个具体例子从头跑一遍。场景:5 个智能体,每个有 4 条信道可选,收益定义为-(同信道其他用户数),这是标准的拥塞博弈,属于势博弈,一定存在纯策略纳什均衡。

第一步,构造收益。用前面讲的向量化方法:

N = 5; M = 4*ones(1,N); grids = cell(1,N); [grids{:}] = ndgrid(1:M(1),1:M(2),1:M(3),1:M(4),1:M(5)); sameCh = zeros(size(grids{1})); for i = 1:N for j = i+1:N sameCh = sameCh + (grids{i}==grids{j}); end end % 收益数组:每个位置存 N 个收益 U = cell(1,N); for i = 1:N U{i} = -sameCh; % 智能体 i 的收益 end

这里U{i}是 N 维数组,U{i}(k1,...,kN)就是智能体 i 在组合 (k1,...,kN) 下的收益。用 cell 存是因为每个智能体的收益数组维度相同但内容不同。

第二步,跑最优响应动态。初始策略我一般随机初始化,跑 20 次不同初值,看是否都收敛到同一个均衡(势博弈里通常收敛到同一个,或者势函数相同的等价均衡)。

rng(42); results = cell(1,20); for trial = 1:20 s0 = randi(M); [s, conv, it] = bestResponseDynamics(U, M, 500, s0); results{trial} = struct('s',s,'conv',conv,'iter',it); end

第三步,验证。对每个收敛结果,调用maxUnilateralGain,确认增益接近 0。我实测下来,5 个智能体 4 条信道,最优响应平均 8 到 15 轮收敛,20 次试验全部收敛到同一个策略组合(因为势博弈的均衡在势函数意义下唯一)。

4.2 参数选择背后的计算过程

有几个参数必须讲清楚怎么定,不能拍脑袋。

最大迭代数 maxIter:对势博弈,理论上势函数单调下降且有下界,所以一定有限步收敛。但步数上界不好估。我的经验公式是maxIter = 50 * N * max(M)。5 个智能体 4 策略就是 1000,留足余量。非势博弈就设更大,比如 5000,同时靠收敛判据提前退出。

收敛阈值 epsilon:这个和收益的量级有关。如果收益是整数计数(像信道分配),epsilon 取 1e-6 就够;如果收益是归一化到 [0,1] 的连续值,取 1e-4。原则是比收益的最小有意义变化小一到两个数量级。

虚拟对局的采样数:采样数 S 和估计误差的关系是误差正比于 1/sqrt(S)。要误差小于 0.01,S 取 10000 才够;但实际仿真里 0.05 的误差就能接受,S 取 400 即可。我一般从 200 起步,看结果稳定性再往上加。

Q-learning 的学习率:离散博弈里我常用衰减学习率alpha = 1/(1+visitCount),这样每个状态-动作对的学习率随访问次数递减,满足随机逼近的收敛条件。固定学习率虽然简单,但会导致策略在均衡附近震荡。

4.3 从最优响应到 Q-learning 的平滑过渡

当博弈不是势博弈、最优响应开始循环时,我会切到多智能体 Q-learning。核心是把每个智能体的策略选择建模成一个 Q 表,状态是观察到的其他智能体策略(或策略的压缩表示),动作是自己的策略。

% 简化版:状态用其他智能体策略的哈希表示 Q = cell(1,N); for i = 1:N Q{i} = zeros(1, M(i)); % 简化:单状态 Q 表 end alpha0 = 0.5; for t = 1:maxIter for i = 1:N % epsilon-greedy 选动作 if rand < epsilon a = randi(M(i)); else [~, a] = max(Q{i}); end s(i) = a; end % 计算收益并更新 Q for i = 1:N r = getPayoff(U, s, i); alpha = alpha0 / (1 + t/100); Q{i}(s(i)) = Q{i}(s(i)) + alpha*(r - Q{i}(s(i))); end epsilon = max(0.01, epsilon*0.999); end

这里我把状态简化成单状态,因为信道分配这类博弈的收益主要取决于当前策略组合,历史状态影响不大。如果是更复杂的博弈,状态要扩展成对手策略的联合表示,Q 表维度会上升,这时候要考虑函数逼近(比如用神经网络),但那就超出本文范围了。

实测下来,Q-learning 在 5 智能体 4 信道场景里,大约 2000 到 5000 轮收敛到和最优响应相同的均衡,但耗时是最优响应的几十倍。所以能用最优响应就别用 Q-learning,这是血泪教训。

4.4 结果可视化与均衡验证

跑完不算完,得把结果画出来验证。我一般画三张图:势函数随迭代的变化曲线、各智能体收益随迭代的变化、以及最终策略组合的柱状图。

势函数曲线是最直观的收敛证据。势博弈里它必须单调不增,如果出现上升,说明代码有 bug 或者博弈不是势博弈。收益曲线能看出各智能体是否都稳定下来。策略柱状图能一眼看出有没有多个智能体挤在同一条信道。

figure; plot(phiHistory, 'LineWidth', 1.5); xlabel('迭代轮次'); ylabel('势函数值'); title('势函数收敛曲线'); grid on;

验证均衡时,我还会做一件事:随机扰动测试。对收敛的策略组合,随机让一个智能体换策略,看它的收益是否下降。如果下降,说明当前是均衡;如果上升,说明没收敛到均衡。这个测试跑 100 次,全部通过才算数。

5. 常见问题与排查技巧实录

5.1 算法不收敛的六种典型原因

这块是我踩坑最多的地方,整理成速查表:

现象可能原因排查方法解决
策略一直震荡非势博弈+同步最优响应打印每轮策略改异步或加阻尼
收益不上升收益矩阵索引错位小规模穷举对比检查 ndgrid 维度顺序
收敛到不同点存在多个均衡多初值跑正常,记录所有均衡
迭代数爆炸学习率过大看 Q 值变化用衰减学习率
结果随机性大采样数不足增大采样重跑采样数翻倍
内存溢出显式存全收益矩阵看矩阵维度改按需计算

其中收益矩阵索引错位是最隐蔽的。ndgrid生成的维度顺序和你想的可能不一样,grids{1}对应第一个维度的变化,但如果你在收益计算里把维度搞反,结果全错但代码不报错。我的做法是先用 2 个智能体 2 个策略的最小例子手工验证,确认索引对了再放大。

5.2 势博弈判定的实操方法

怎么判断一个博弈是不是势博弈?理论上有判定条件,但实操里我用一个更直接的方法:随机采样策略组合,检查收益差和势函数差是否一致。

具体做法:随机生成大量策略组合对 (s, s'),其中 s' 是 s 让某个智能体 i 单方面改变策略得到的。如果存在势函数 phi,那么对任意这样的对,都有U_i(s') - U_i(s) = phi(s') - phi(s)。我采样 1000 对,如果这个等式在数值误差内全部成立,就认为是势博弈。

如果找不到势函数,但博弈又是对称的(所有智能体收益函数形式相同),那大概率是势博弈,只是势函数不好显式构造。这时候可以直接用最优响应试跑,如果收敛就说明性质良好。

5.3 大规模场景的降维技巧

智能体超过 10 个之后,显式收益矩阵彻底不可行。这时候有几个降维思路:

一是利用博弈结构。信道分配、拥塞博弈这类,收益只依赖于"有多少人选了同一策略",不依赖于具体是谁选的。这种情况下收益可以用一个计数向量表示,内存从 M^N 降到 M*N。

二是分簇。把智能体按交互强度分成若干簇,簇内求解均衡,簇间用平均场近似。这个在通信网络里很常用。

三是采样估计。不存收益矩阵,每次需要收益时现场算。代价是计算慢,但内存省。配合并行计算(parfor)能补回速度。

我在一个 20 智能体的项目里用的是第一种加第三种:收益按计数算,同时用parfor并行扫描策略。单机 8 核,跑一轮最优响应大约 2 秒,100 轮收敛在 3 分钟内,可以接受。

5.4 独家避坑经验

最后分享几条文档里不会写、但实操中极其重要的经验。

第一条:先跑最小例子。任何算法,先用 2 智能体 2 策略跑通,手工验证结果,再放大。我见过太多人直接上 10 个智能体,结果错了都不知道错在哪。

第二条:随机种子固定。仿真结果要可复现,rng(42)这种一定要加。否则每次跑出来不一样,没法判断是算法问题还是随机性。

第三条:收敛判据要冗余。别只用一个判据,策略稳定、收益稳定、偏离增益三个一起用,互相印证。

第四条:记录中间过程。每轮的策略、收益、势函数都存下来,出问题时能回溯。我一般存成结构体数组,跑完一次性分析。

第五条:警惕"看起来收敛"。有些博弈在均衡附近会缓慢漂移,收益变化很小但策略一直在微调。这时候要拉长观察窗口,确认是真的稳定还是慢漂移。

提示:如果跑了几千轮还没收敛,先别急着改算法,检查一下收益矩阵是不是构造错了。我遇到的不收敛案例里,超过一半是收益矩阵本身有问题,而不是算法不行。

6. 算法性能对比与选型建议

6.1 三种算法在同一场景下的实测数据

为了给大家一个直观的对比,我在 5 智能体 4 信道的拥塞博弈上跑了三种算法,每种跑 20 次取平均。硬件是普通笔记本,Matlab R2023b。

算法平均迭代数平均耗时(秒)收敛率是否到真均衡
最优响应110.08100%是
虚拟对局1562.3100%是
多智能体Q学习320018.595%是(收敛时)
穷举验证-0.5100%是

数据很清楚:势博弈场景下最优响应碾压其他方法。虚拟对局慢 30 倍,Q-learning 慢 200 多倍。所以选型的第一原则就是先判断是不是势博弈,是就用最优响应。

6.2 什么时候必须放弃最优响应

但最优响应不是万能的。我遇到过一类博弈,收益函数设计得让智能体之间形成"剪刀差":A 选 1 时 B 想选 2,B 选 2 时 A 想选 1,来回循环。这种非势博弈里最优响应永远不收敛。

判断方法很简单:跑最优响应,如果 1000 轮还在震荡,基本可以确定是非势博弈。这时候切虚拟对局或 Q-learning。虚拟对局对循环的容忍度更高,因为它用的是经验频率而不是即时策略,能"平滑"掉震荡。Q-learning 则通过随机探索跳出循环。

我的建议是做一个自适应切换:先跑最优响应 200 轮,如果收敛就用结果;不收敛就自动切虚拟对局再跑 500 轮;还不收敛才上 Q-learning。这样大部分场景都能用最快的方法解决。

6.3 并行化与加速技巧

Matlab 里加速仿真有几个实用手段。一是向量化,前面反复强调,能不用循环就不用。二是 parfor,最优响应里每个智能体扫描自己策略的过程互相独立,可以并行。三是预分配,所有数组提前zeros或cell分配好,避免动态增长。

还有一个容易被忽略的点:收益函数的计算复杂度。如果收益计算本身很重(比如涉及矩阵运算),那算法迭代数再少也没用。这时候要把收益计算也优化,比如用查表代替实时计算,或者用低秩近似。

我在一个 15 智能体的项目里,把收益计算从 O(N^2) 优化到 O(N)(利用计数结构),整体速度提升 8 倍。所以优化要抓瓶颈,别在迭代数上抠。

7. 代码组织与工程化建议

7.1 用面向对象组织博弈模型

Matlab 支持面向对象,把博弈模型封装成类会让代码清晰很多。我一般定义三个类:Game(存收益矩阵和基本属性)、Agent(存策略和收益)、Solver(各种寻优算法)。

classdef Game < handle properties N % 智能体数 M % 各智能体策略数 U % 收益 end methods function obj = Game(N, M) obj.N = N; obj.M = M; end function r = payoff(obj, s, i) % 返回智能体 i 在策略组合 s 下的收益 end end end

这样写的好处是算法和模型解耦,换一个博弈场景只需要改Game类,Solver不用动。做多个课题对比时特别省事。

7.2 结果保存与批量实验

做研究经常要跑大量参数组合,手动跑不现实。我一般写一个批量脚本,用嵌套循环遍历参数,每次结果存成 mat 文件,文件名带上参数。

for N = [3 5 8 10] for M = [3 4 5] for trial = 1:20 result = runExperiment(N, M, trial); fname = sprintf('res_N%d_M%d_t%d.mat', N, M, trial); save(fname, 'result'); end end end

跑完再用一个分析脚本统一读取、统计、画图。这样实验可复现,数据也不会丢。

7.3 版本兼容与常见报错

Matlab 版本差异是个现实问题。ndgrid、parfor这些老函数各版本都支持,但一些新语法(比如字符串双引号)在 R2016b 之前不支持。如果代码要给别人跑,尽量用老语法。

常见报错里,Index exceeds matrix dimensions多半是策略索引越界,检查M和实际策略数是否一致。Out of memory就是收益矩阵太大,改按需计算。Undefined function通常是工具箱没装,比如优化工具箱、并行工具箱。

注意:如果你的代码用了parfor,确保循环内没有跨迭代的依赖,否则结果会错。我见过有人在parfor里更新共享计数器,结果每次跑出来不一样。

8. 从仿真到落地的几点思考

仿真跑通只是第一步,真正落地还有距离。实际系统里,智能体往往不能实时获知所有其他人的策略,只能观察到局部信息。这时候要用分布式最优响应,每个智能体只根据自己的邻居信息做决策,通过信息交换逐步逼近均衡。

另一个现实约束是策略更新成本。仿真里换策略不要钱,实际里切换信道、调整功率都有开销。所以均衡不仅要存在,还要考虑从当前状态到均衡的迁移代价。这个在论文里叫"均衡精炼",工程上就是加一个切换惩罚项。

还有一个是动态环境。智能体数量、收益函数可能随时间变化,均衡点也在漂移。这时候静态寻优不够,要用在线学习,持续跟踪均衡。Q-learning 这类方法天然适合在线场景,但收敛速度要跟上环境变化速度,这是个权衡。

我个人在实际项目里的体会是:仿真阶段把算法吃透,落地时根据约束做裁剪,比一上来就追求"最先进算法"靠谱得多。最优响应这种"老土"方法,在势博弈场景里至今仍是我的首选,因为它简单、快、可解释。复杂方法留给复杂问题,别为了炫技把简单问题搞复杂。

最后再分享一个小技巧:如果你不确定自己的博弈是不是势博弈,先跑最优响应,同时记录势函数(如果能构造)或者收益和。如果收益和单调变化,大概率是势博弈;如果震荡,就准备切换算法。这个判断花不了几分钟,但能帮你省下大量调参时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询