这幅图的关键是在如何找出数据点,图形比较简单。
在图形中,蓝色曲线上方代表背叛者区域(D),红色曲线下方代表合作者(C),中间区域代表混合区域(C+D)
拿子图(a)举例,横坐标为噪声因子K(Fermi公式里面的),纵坐标为背叛引诱值b(PDG模型)
计算b从1至1.3,间隔为0.005,K从0至2(不包括0),间隔为0.1。也就是说,在K=0.1时,需要计算b在不同值的情况(在程序中当合作率为0的时候,break节省时间),算下来也小几百了(当时用超算计算的,大概一天就能完事)。
for(T=1.0;T<=2.01;T=T+0.005)//模型参数b
{
aa=0;
initial();//初始化函数
for(steps=0; steps<MC_STEPS; steps++)//MCS=50000
{
game_self();//self-interaction
tongji();//统计合作率
x=(double)cooperator/SIZE;
if(steps>MC_STEPS-5001)//计算后5000步的合作率
{
aa+=x;
}
}//end of the MC steps
XX=(double)aa/5000;//后5000步的合作率平均值
outfile2<<T<<'\t'<<XX<<endl;
cout<<T<<'\t'<<XX<<endl;
if(XX==0) break; //合作率为0则停止
}
得到的文件形式,第一列为参数b,第二列为合作率:
1 0.636253
1.005 0.576585
1.01 0.517846
1.015 0.459417
1.02 0.396725
1.025 0.325442
1.03 0.234785
1.035 0.0836125
1.04 0
程序有多少个,文件就有多少个
然后统计边界值,也就是K等于某值时,b为何值时合作率为1或者0的状态,然后记录下来,注意需要分为两个文件,一个为上边界(合作率为1),一个为下边界(合作率为0)。
此文件为上边界文件,第一列代表K值,第二列代表背叛引诱值b
0.1 0.915
0.2 0.935
0.3 0.94
0.4 0.95
0.5 0.955
0.6 0.96
0.7 0.965
0.8 0.97
0.9 0.97
1.0 0.975
1.1 0.975
1.2 0.975
1.3 0.98
1.4 0.98
1.5 0.98
1.6 0.985
1.7 0.985
1.8 0.985
1.9 0.985
2.0 0.985
此文件为下边界文件,第一列代表K值,第二列代表背叛引诱值b
0.1 1.04
0.2 1.07
0.3 1.08
0.4 1.075
0.5 1.065
0.6 1.06
0.7 1.055
0.8 1.045
0.9 1.04
1.0 1.035
1.1 1.035
1.2 1.03
1.3 1.03
1.4 1.025
1.5 1.025
1.6 1.025
1.7 1.02
1.8 1.02
1.9 1.02
2.0 1.015
上面两个文件中的数据可以得到子图(a),画图参考:http://blog.csdn.net/dingchenxixi/article/details/54016748