演化博弈可以描述群体里不同策略所占比例怎样随相对收益变化。先把一次更新手算清楚,再讨论长期行为。下面使用自己设定的两策略协调博弈,演示复制子方程和一个 Euler 数值步,不把一步计算当作均衡证明或智能体训练结果。
从收益矩阵到比例导数
收益矩阵 A=[[3,0],[0,2]],行是自身策略,列是对手策略;群体比例 x=(0.5,0.5)。按随机匹配的对称单群体设定,策略收益 f=Ax=(1.5,1),平均收益 φ=x·f=1.25。复制子方程为 dx_i/dt=x_i(f_i−φ),所以导数为 (0.125,−0.125)。Nashpy 的教材给出了这套方程;示例矩阵与数值由本文编写。

步长 dt=0.1 的显式 Euler 近似为 x新=x旧+dt×导数,即 (0.5125,0.4875)。这里 x 是群体策略比例,不是同一位语言模型下一 token 概率,也不是已经学好的两个独立 agent 的策略。
运行一次更新并核对不变量
保存 replicator_step.py,运行 python replicator_step.py,只需要 Python 标准库。断言检查总比例、导数和非负性;失败时停下,不用自动归一化遮住坏步长。
from math import isclose
A=[[3.0,0.0],[0.0,2.0]]
x=[0.5,0.5]
dt=0.1
f=[sum(a*b for a,b in zip(row,x)) for row in A]
mean=sum(a*b for a,b in zip(x,f))
dx=[a*(b-mean) for a,b in zip(x,f)]
nxt=[a+dt*b for a,b in zip(x,dx)]
print("fitness,mean,derivative,next:",f,mean,dx,nxt)
assert isclose(sum(dx),0.0,abs_tol=1e-12)
assert isclose(sum(nxt),1.0,abs_tol=1e-12)
assert all(v>=0 for v in nxt)
assert all(isclose(a,b) for a,b in zip(nxt,[0.5125,0.4875]))
不要用一次上升代替长期分析
当前第一种策略比群体平均收益高,所以比例导数为正;第二种策略反向变化。若把初值改为 (0.2,0.8),两种收益为 (0.6,1.6),方向会改变。当前比例影响匹配收益,不能只看矩阵里 3 大于 2 就宣称第一种策略从所有初值都胜出。
连续方程的理论性质和离散近似的数值误差是两件事。步长太大可能使比例变负,即使总和仍为一也不合法;多步模拟需检查步长和误差,采用对应求解器时另记录容差。非对称双群体博弈需分别写两组比例与收益,不能套用这一组方程。
本例不模拟突变、空间邻居、有限群体随机性或个体奖励学习。实际验收保存矩阵方向、初始比例、收益、平均值和导数,确保解释能从输入重算;下一步比较两个初始比例的短程轨迹,再研究平衡点与稳定性。
资料与核对依据
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33077.html