浏览器运行环境异常,请检查是否开启本站的JavaScript权限或下载最新版浏览器
基于蒙特卡罗方法的一维意见传播模型

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

注:我学习数模时候写的捏

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

演化规则:

参数设定: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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得UP主同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理: DMCA投诉/Report
按赞
按踩
1
收藏
1条评论

学习数学建模的软件的话我个人很喜欢mathematica,里面已经包含了很多预置的函数的,就像元胞自动机和蒙特卡洛的模型,就不用从头造轮子了。

2023-1-30
我是有底线的
内容滑到底啦,去看看别的风景吧