MATLAB演化博弈仿真(双方)操作详解
声明:笔者所用win7+MATLAB2016b版本。安装破解过程可能会有部分问题,可直接联系笔者或百度。
正文:
论文标题:《农户与企业合作下的农产品质量安全演化博弈仿真研究》
①首先确定复制动态方程。下述方程是摘自论文中,请读者对方程有个印象。
②其次确定参数。数值取值原因详见论文。
③将上述数值先笔算代入复制动态方程中。
可以得到最后的表达式为:
F(x)=x(1-x)(0.9875y-0.3875) ; F(Y)= y(1-y)(0.135x-0.075)
原论文是用Netlogo仿真,本文改用MATLAB进行实验。打开MATLAB,点击编辑器|新建|脚本,
输入代码如下:
%定义函数,function开始,end结束
function dxdt=differential(t,x)%定义一个名为differential的函数
dxdt=[x(1)*(1-x(1))*(0.9875*x(2)-0.3875);x(2)*(1-x(2))*(0.135*x(1)-0.075)];
%x(1)是演化博弈中一方的决策概率X,x(2)是演化博弈中另一方的决策概率Y。x(1)*(1-x(1))*(0.6-0.9875*(1-x(2)))是F(X),中间分号隔开,x(2)*(1-x(2))*0.06是F(Y),把初始设定值代入即可
end
注:MATLAB注释符为%,仅起注释作用,读者若视之碍眼可删除,注意代码输入需英文输入法,标点符号容易出bug。有关代码的问题可直接联系笔者。
代码在MATLAB中如下显示:
点击运行,保存命名为“differential.m”,并“添加到路径”。文件一定要保存在自己清楚的位置。
点击“+””(点击的按钮,笔者均已标注),新建一个脚本,并输入以下代码:
%先做dy/dt与dx/dt的关系图像
for i=0:0.1:1 %横坐标的取值范围是[0,1],图中间隔为0.1
for j=0:0.1:1 %纵坐标的取值范围是[0,1],图中间隔为0.1
[T,Y]=ode45('differential',[0 5],[i j]);%ode45()是用于求解微分方程数值解的函数,differential是求解的函数名,出图的代码中的函数名与之前定义的要一样, [0 5]是时间T的区间,[i j]是初始值向量
figure(1)%建立图形的函数,系统自动从1,2,…建立图形,figure(1)是第一幅图的意思
grid on %显示网格线,删除或在前面加上%可以不显示网格
plot(Y(:,1),Y(:,2));% Y(:,1)是dx/dt,Y(:,2)是dy/dt
hold on%意思是将前面的坐标系、网格线、x、y的图像整合在一起显示
end%结束第二个for
end%结束第一个for
set(gca,'XTick',[0:0.1:1],'YTick',[0:0.1:1])%设置网格的显示格式,gca获取当前
xlabel('x占比');%在图中的横坐标显示“x占比”
ylabel('y占比'); %在图中的纵坐标显示“y占比”
%其次做dx/dt与时间T的关系图像
for i=0:0.1:1
for j=0:0.1:1
[T,Y]=ode45('differential',[0 5],[i j]);
figure(2)
grid on
plot(T,Y(:,1));
hold on
end
end
xlabel('x占比');
ylabel('y占比');
%最后做dy/dt与时间T的关系图像
for i=0:0.1:1
for j=0:0.1:1
[T,Y]=ode45('differential',[0 5],[i j]);
figure(3)
grid on
plot(T,Y(:,2));
hold on
end
end
xlabel('x占比');
ylabel('y占比');
点击运行|保存|添加到路径,命名为“map.m”。文件一定要保存在自己熟记的位置。
运行过后,出现三张图,如下:
点击文件|另存为,保存类型选择jpg或png,即可复制粘贴至论文中。
读者请注意,前面我们的出图是分散的,现将两个博弈主体的比例放置在同一张图,我们试试改完以后的代码,运行之后有什么不同。
可以直观看到,图一没变,图二将前面的图二、图三整合到一张图上。
代码如下:
%the first map
for i=0:0.1:1
for j=0:0.1:1
[T,Y]=ode45('differential',[0 100],[i j]);
figure(1)
grid on
plot(Y(:,1),Y(:,2));
hold on
end
end
set(gca,'XTick',[0:0.1:1],'YTick',[0:0.1:1])%设置网格的显示格式,gca获取当前
xlabel('x占比');
ylabel('y占比');
%the second map
for i=0:0.1:1
for j=0:0.1:1
[T,Y]=ode45('differential',[0 100],[i j]);
figure(2)
grid on
plot(T,Y(:,1),'r*-','lineWidth',1);%先绘制F(X)随时间T变化的图像,'r*-'是由“*”绘制的红色线条,'lineWidth',1绘制宽度为1的线条,数值越大线条越粗。
hold on
plot(T,Y(:,2),'b--','lineWidth',1);%再绘制F(Y)随时间T变化的图像,' b--'是由“-”绘制的蓝色线条
hold on
end
end
set(gca,'XTick',[0:10:100],'YTick',[0:0.1:1])
legend('企业','农户')%在图中显示各博弈方(企业、农户)对应的线条,因为将博弈方添加到一张图,所以有必要进行标注
xlabel('时间');
ylabel('占比');
原文交代如下:
只需将上述代码稍改一下即可,笔者已将改动之处做了标记。
代码如下:
%the first map
for i=0:0.1:1
for j=0:0.1:1
[T,Y]=ode45('differential',[0 100],[i j]);
figure(1)
grid on
plot(Y(:,1),Y(:,2));
hold on
end
end
set(gca,'XTick',[0:0.1:1],'YTick',[0:0.1:1])%设置网格的显示格式,gca获取当前
xlabel('x占比');
ylabel('y占比');
%the second map
for i=0.56%%%%%%%%%%%% hey,改这里
for j=0.40%%%%%%%%%%%% hey,改这里
[T,Y]=ode45('differential',[0 100],[i j]);
figure(2)
grid on
plot(T,Y(:,1),'r*-','lineWidth',1);
hold on
plot(T,Y(:,2),'b--','lineWidth',1);
hold on
end
end
set(gca,'XTick',[0:10:100],'YTick',[0:0.1:1])
legend('企业','农户')%在图中显示各博弈方(企业、农户)对应的线条
xlabel('时间');
ylabel('占比');
出图效果如下:
原论文当中出图如下,请读者自行对比netlogo与MATLAB的不同之处。
当然,关于演化博弈仿真这块,论文当中还有其他图像,请读者自行根据本文方法实验,笔者不再展开。