1.演化博弈入门代码

MATLAB演化博弈仿真(双方)操作详解

声明:笔者所用win7+MATLAB2016b版本。安装破解过程可能会有部分问题,可直接联系笔者或百度。

正文

论文标题:《农户与企业合作下的农产品质量安全演化博弈仿真研究》
①首先确定复制动态方程。下述方程是摘自论文中,请读者对方程有个印象。

image.png

image.png
image.png

②其次确定参数。数值取值原因详见论文。

image.png

③将上述数值先笔算代入复制动态方程中。
可以得到最后的表达式为:
F(x)=x(1-x)(0.9875y-0.3875) ; F(Y)= y(1-y)(0.135x-0.075)
原论文是用Netlogo仿真,本文改用MATLAB进行实验。打开MATLAB,点击编辑器|新建|脚本,
image.png

输入代码如下:

%定义函数,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中如下显示:

image.png

点击运行,保存命名为“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”。文件一定要保存在自己熟记的位置。


image.png

运行过后,出现三张图,如下:


image.png
image.png

image.png

点击文件|另存为,保存类型选择jpg或png,即可复制粘贴至论文中。

读者请注意,前面我们的出图是分散的,现将两个博弈主体的比例放置在同一张图,我们试试改完以后的代码,运行之后有什么不同。

image.png
image.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('占比');

原文交代如下:


image.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.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('占比');

出图效果如下:


image.png

image.png

原论文当中出图如下,请读者自行对比netlogo与MATLAB的不同之处。


image.png

当然,关于演化博弈仿真这块,论文当中还有其他图像,请读者自行根据本文方法实验,笔者不再展开。

你可能感兴趣的:(1.演化博弈入门代码)