三方演化博弈的复制动态方程写出来三个ODE,ode45跑完曲线收敛到某个角点上,但论文里说的ESS条件对不上,回去查雅可比矩阵的特征值,其中一个特征值实部是正的,那个点压根不稳定。路径D:\EvolutionaryGame\three_party\。
建模的第一步是设策略概率。三方各有两个策略,x、y、z分别表示三方选择“合作”或者“积极”策略的概率,另外三个概率自动是1-x、1-y、1-z,不用单独设变量。收益矩阵按论文里的表填,每方在每个策略组合下的收益写成一个2×2×2的立方体,Matlab里用三个矩阵分开存,payoff_A、payoff_B、payoff_C各一个2×2×2数组,python用numpy的ndarray。
期望收益算完相减得到复制动态方程。养殖户的期望收益是x那方的,U_A1是选参与策略的期望,U_A2是选不参与策略的期望,两者相减再乘x(1-x)就是F(x)。处理中心类似,政府的也类似,三个方程联立。这一套在CSDN那篇三方演化博弈的帖子里有完整推导,公式形式都差不多,区别在收益矩阵的具体参数。
ode45的调用方式记一下,`[t,y] = ode45(@(t,y) three_evo(t,y,p), [0,50], [0.3,0.5,0.4])`,初始概率x=0.3、y=0.5、z=0.4是PLOS ONE那篇网络舆情论文里的设置。three_evo函数里把三个复制动态方程写进去,参数p用struct传,payoff矩阵塞进struct里。时间区间[0,50]够用,大部分情况十几步就收敛到角点了,跑50个时间单位能看到稳态。ode45默认的相对容差1e-3不够,ESS附近收敛很慢,容差给1e-6,`odeset('RelTol',1e-6,'AbsTol',1e-8)`。

稳定性分析不能只靠看曲线。纯策略均衡点一共八个,坐标是(0,0,0)到(1,1,1)的立方体顶点,每个点代入雅可比矩阵算三个特征值。Nature那篇医疗物资分配的论文里写得清楚,所有特征值实部为负是渐近稳定,至少一个实部为正是不稳定,实部有零的话临界状态判不了。Matlab里用符号工具箱算雅可比矩阵,subs代入每个均衡点,eig函数求特征值,三个实部全负才在论文里标ESS。八个点全跑一遍,有时候只有一两个稳定,有时候一个都没有,没有的话回去检查参数设置。
Python这边有现成的包,egtplot专门画三方演化博弈的相图,pip install egtplot装完用plot_static画三角单纯形上的相图,plot_animated做轨迹动画,底层是scipy的odeint解微分方程,跟Matlab的ode45一个逻辑。不想装包的话scipy.integrate.odeint直接解,参数跟Matlab里一样,画图用matplotlib的mplot3d画三维轨迹,三个轴的坐标都是0到1。CSDN上那篇三方演化博弈的Python实现里给了完整的代码框架,收益矩阵换成自己的数就能跑。
参数敏感性分析用的最多的方法是固定其他参数,扫一个参数从0.1到1.0,看最终收敛到哪个均衡点。Matlab里写个循环,每次改参数重新跑ode45,把最终时刻的三个概率存下来,画成热力图或者龙卷风图。CSDN那个三方演化博弈的仿真引擎里内置了参数灵敏度的功能,自动算雅可比特征值的变化。跑批量实验的时候用parfor并行,每个参数点独立跑,省时间。
下次把那个医疗物资分配的模型复现一下,Nature那篇的收益矩阵参数抄过来,看稳定均衡点是E3(0,1,0)还是E8(1,1,1),条件1和条件2对应的参数范围是……
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删