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