注:我学习数模时候写的捏
一、设计思路(包括规则说明 参数设定)
演化规则:
参数设定:n——持意见A的个体;
M——持意见B的个体;
其他说明:编写演化过程源程序时对于程序调试不熟悉,故加入了大量printf语句
来观察程序运行步骤。
源程序编写完成后在vs2010上始终无法正常运行,运行过程中常常在第四次循环开始出现-1075052543 858993461等数字。当程序在devc++上运行时则可正常运行。程序这个问题我始终无法解决。(据csdn所说,这是因为程序中出现了未定义行为,导致不同编译器运行结果不同,我尝试更改源程序代码但始终无法解决。)
二、代码(关键部分加注释)
#include<stdio.h>
#include<time.h>
#include <stdlib.h>
int main()
{
double N=0,p=5;//意见比例
int a[100]={0},i=0,I=0;
int h=0,j=0,k=0;
int n=0,m=0;//意见人数
int b[100]={0};//暂存
int t=1,TIME=1000;
int x=0;//随机数
FILE *fp=fopen("yijian.txt","w+");
srand((unsigned)time(0));
for(i=0;i<100;i++)//初始值
{
x=rand()%10;
if(x<p)
{
a[i]=1;
}
else
{
a[i]=0;
}
b[i]=a[i];
//fprintf(fp,"%d ",b[i]);
}
fprintf(fp,"\n ");
while(t<TIME)
{
i=rand()%10;
for(I=i;i<I+100;i=i+1)//元胞机循环规则
{
h=(i+99)%100;
j=(i+101)%100;
k=(i+102)%100;
if(a[i]==a[j])
{
b[h]=a[i];
b[k]=a[i];
}
else
{
b[h]=a[j];
b[k]=a[i];
}
}
n=0;
for(i=0;i<100;i++)
{
a[i]=b[i];
if(a[i]==1)
{
n=n+1;
}
else
{
m=m+1;
}
printf("%d ",a[i]);
//fprintf(fp,"%d ",a[i]);
}
//fprintf(fp,"\n");
N=(double)n/100;
fprintf(fp,"%.2f ",N);//输出频率
t=t+1;
}
fclose(fp);
return 0;
}
三、参考文献
[1] —涵涵—,关于相同代码在vs2017和Dev-c++中结果不同的原因初探索:UB(undefined behaviour)(Z) https://blog.csdn.net/shen962806862/article/details/83067457
schwarz251LV5
这个人确实想隐藏自己(大概
学习数学建模的软件的话我个人很喜欢mathematica,里面已经包含了很多预置的函数的,就像元胞自动机和蒙特卡洛的模型,就不用从头造轮子了。