浏览器运行环境异常,请检查是否开启本站的JavaScript权限或下载最新版浏览器
Logo
综合
文章
圈子
帮助
签到
创作
极速下载
资源区
学习区
专栏区
无标题文章
按赞
反对
评论
收藏
分享

基于蒙特卡罗方法的一维意见传播模型

学习区-科研
0
3.7k
注:我学习数模时候写的捏

一、设计思路(包括规则说明 参数设定)

演化规则: 参数设定: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)   网页链接(blog.csdn.net)
1条评论
学习数学建模的软件的话我个人很喜欢mathematica,里面已经包含了很多预置的函数的,就像元胞自动机和蒙特卡洛的模型,就不用从头造轮子了。
(#°Д°)你到底了哦
logo
有维咔App就够了
随时随地发现资源,免去网页端烦恼广告
打开App