【学术小白成长之路】03三方演化博弈(基于复制动态方程)均衡点与稳定性分析、特征值求解

从本专栏开始,笔者正式研究演化博弈分析,其中涉及到双方演化博弈分析,三方演化博弈分析,复杂网络博弈分析等等。
先阅读了大量相关的博弈分析的文献,总结了现有的研究常用的研究流程,针对每个流程进行拆解。具体学习每个步骤中的步骤的实现方法和流程。基础性文章,希望对您有帮助,如果存在错误或不足之处,还请海涵。且看且珍惜!

在这里插入图片描述

1.均衡点计算

参与主体根据既得利益不断调整策略以追求自身利益的改善,最终达到动态平衡的策略称为演化稳定策略(ESS)。

在判定演化稳定策略之前首先要求出演化博弈的均衡点。令F(x))=0、F(y)=0和F(z)=0,即系统策略选择的变化率为零时,可以得到该动力系统的均衡点。

在计算出均衡点之前,我们可以先构建出来雅可比矩阵,先不进行计算,用于后面将均衡点带入雅可比矩阵之中进行计算。

可以看出,雅可比矩阵就对应函数在x,y,z概率上的偏导。
在这里插入图片描述
如某篇文章中所示,在计算出复制动态方程后,通过构建的复制动态方程,来构建雅克比矩阵。
在这里插入图片描述

这时候,我们令F(x)=0;F (y)=0;F (z)=0就可以计算出对应的xyz的组合,如(0,0,0)、(0,1,0)这样的组合均衡点。

一般会解出来很多这样的组合解,但是这样均衡点不一定具有稳定,还需要进一步计算。

2.稳定性分析

获取均衡点之后,就可以用到上文构建的雅可比矩阵

将求得的均衡点代入雅可比矩阵求此时矩阵对应的特征值

依据特征值,来判断均衡点的稳定性,一般文章中都是以特征值全负值的数为ESS点

如果特征值均小于0,则均衡点有渐进稳定性,为演化稳定策略;
若的特征值均大于0,则为不稳定点;
若特征值有1或2个大大0,则为鞍点:
在这里插入图片描述

在这里插入图片描述

接下来,就可以进行模拟仿真的分析,可以借助Python,Matlab之内的工具进行实现

3.稳定性及特征值求解MatLAB的代码实现

syms x y z E1 C1 C2 G1 S1 E2 C3 G2 E3 S2 S3 C5;

% 定义方程
fx = x*(1 - x)*(E1 - C1 + y*(C2 + G1 + S1 - E2 + z*E2 - z*C2) + z*(C2 + G2 - E2));
fy = y*(1 - y)*(x*(z*E3 - z*E2 - G1 - S1) - C3 + G1);
fz = z*(1 - z)*(S2 + S3 - C5);

%雅可比矩阵
disp(['雅可比矩阵'])
A=[diff(fx,x) diff(fx,y) diff(fx,z);
  diff(fy,x) diff(fy,y) diff(fy,z);
  diff(fz,x) diff(fz,y) diff(fz,z)]

%(2〉求均衡点:首先构建等式数组,然后使用solve函数来计算均衡点,输出对应的均衡点,最后构建均衡点数
equ=[fx==0,fy==0,fz==0];
answ=solve(equ,[x,y,z]);

% 输出均衡点数组
disp(['均衡点:']);
A1 = [answ.x, answ.y, answ.z];
disp(A1);

% 均衡点个数
disp(['均衡点个数:']);
disp(length(answ.x));

在这里插入图片描述
最后将均衡点代入雅可比矩阵当中,求此刻对应的特征值。

% 初始化结果矩阵
xz = [];

for j = 1:length(answ.x)
    disp(['第 ', num2str(j), ' 个均衡点: ']); % 显示当前均衡点的索引
    A1(j, :) = A(j, :); % 取出当前均衡点对应的矩阵行
    disp(['均衡点代入矩阵后的矩阵: ']); % 显示代入后的矩阵
    x1 = A1(j, 1); y1 = A1(j, 2); z1 = A1(j, 3); % 提取当前均衡点的值
    B = subs(A, [x y z], [x1 y1 z1]); % 用当前均衡点的值代入 A
    
    disp(['均衡点代入后对应矩阵的特征值: ']); % 提示显示特征值
    [V, R] = eig(B); % 计算特征值和特征向量
    B1 = R(1, 1); % 取特征值
    B2 = R(2, 2); % 取特征值
    B3 = R(3, 3); % 取特征值
    
    xz = [xz; B1, B2, B3]; % 将特征值组合在一起
end

% 为方便整理,以列的形式输出特征值
disp(['第一列特征值集合: ']); % 提示显示第一列特征值
disp(xz(:, 1)); % 显示第一列特征值
disp(['第二列特征值集合: ']); % 提示显示第二列特征值
disp(xz(:, 2)); % 显示第二列特征值
disp(['第三列特征值集合: ']); % 提示显示第三列特征值
disp(xz(:, 3)); % 显示第三列特征值

在这里插入图片描述

4. 单个均衡点特征值求解

有的时候将求解的多个特征值,一次性求解的时候,可能会出现计算不出来的情况
或者有的时候,只需要求解纯策略均衡点下的特征值
这时候,就可以将自己定义出均衡点的值,代入到矩阵当中
代码如下:

clc;clear;
% 定义符号变量
syms x y z E1 C1 C2 G1 S1 E2 C3 G2 E3 S2 S3 C5;

% 定义方程
fx = x*(1 - x)*(E1 - C1 + y*(C2 + G1 + S1 - E2 + z*E2 - z*C2) + z*(C2 + G2 - E2));
fy = y*(1 - y)*(x*(z*E3 - z*E2 - G1 - S1) - C3 + G1);
fz = z*(1 - z)*(S2 + S3 - C5);

% 计算雅可比矩阵
disp(['雅可比矩阵'])
A = [diff(fx,x) diff(fx,y) diff(fx,z);
     diff(fy,x) diff(fy,y) diff(fy,z);
     diff(fz,x) diff(fz,y) diff(fz,z)];

% 显示雅可比矩阵
disp(A);

% 自定义将计算得到的特征值输入矩阵,例如将 (0, 0, 0) 代入雅可比矩阵
A_at_0 = subs(A, [x, y, z], [0, 0, 0]);

% 计算特征值
eigenvalues = eig(A_at_0);

% 求解出来特征值,并显示特征值
disp(['特征值:'])
disp(eigenvalues);

在这里插入图片描述

很抱歉,我无法提供完整的代码示例,因为这是一个非常复杂的问题,需要根据具体的演化博弈模型进行调整和修改。但是,我可以给出一个基本的流程和代码框架,供您参考。 1. 设置参数:根据具体的演化博弈模型,确定参者数量、策略数量、收益函数等参数。 2. 求解收益矩阵:根据收益函数,生成一个收益矩阵。 3. 生成复制动态方程组:根据演化博弈动态方程,生成一个复制动态方程组。 4. 求解演化博弈均衡点及其特征值:使用matlab的非线性求解函数,如fsolve或fmincon,求解演化博弈均衡点及其特征值。 5. 生成雅可比矩阵:根据均衡点,生成雅可比矩阵。 6. 数值仿真:使用matlab的ode45函数进行数值仿真,求解演化博弈的轨迹。 7. 生成相位图:使用matlab的plot函数生成演化博弈的相位图。 下面是一个示例代码框架: ``` % 设置参数 n = 3; % 参者数量 m = 2; % 策略数量 r = 1; % 收益函数参数 s = 0.5; % 收益函数参数 % 求解收益矩阵 payoff = zeros(m^n,n); for i=1:m^n strategy = dec2base(i-1,m,n)-'0'+1; for j=1:n payoff(i,j) = r*sum(strategy==strategy(j))-s; end end % 生成复制动态方程组 syms x1 x2 x3 eq1 = x1*(payoff(1,1)*x1+payoff(2,1)*x2+payoff(3,1)*x3) == x1*(payoff(1,1)*x1+payoff(2,1)*x2+payoff(3,1)*x3); eq2 = x2*(payoff(1,2)*x1+payoff(2,2)*x2+payoff(3,2)*x3) == x2*(payoff(1,2)*x1+payoff(2,2)*x2+payoff(3,2)*x3); eq3 = x3*(payoff(1,3)*x1+payoff(2,3)*x2+payoff(3,3)*x3) == x3*(payoff(1,3)*x1+payoff(2,3)*x2+payoff(3,3)*x3); eq = [eq1, eq2, eq3]; % 求解演化博弈均衡点及其特征值 x0 = [1/3,1/3,1/3]; [x,fval,exitflag,output,jacobian] = fsolve(eq,x0); % 生成雅可比矩阵 J = double(subs(jacobian,{x1,x2,x3},{x(1),x(2),x(3)})); % 数值仿真 tspan = [0,10]; x0 = [1/3,1/3,1/3]; [t,x] = ode45(@(t,x) [x(1)*(payoff(1,1)*x(1)+payoff(2,1)*x(2)+payoff(3,1)*x(3));x(2)*(payoff(1,2)*x(1)+payoff(2,2)*x(2)+payoff(3,2)*x(3));x(3)*(payoff(1,3)*x(1)+payoff(2,3)*x(2)+payoff(3,3)*x(3))], tspan, x0); % 生成相位图 plot3(x(:,1),x(:,2),x(:,3)); ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驭风少年君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值