例1.
/* 2次元平面内で動作するエージェント */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <unistd.h> #define BUFSIZE 256 /*入力バッファ用配列の長さ*/ #define N 1 /*エージェントの個数*/ #define N_OF_A 2 /*エージェントの属性値の個数*/ #define TIMELIMIT 100 /*シミュレーション打ち切り時刻*/ /*以下はgnuplot利用のための定義*/ #define TMPFILE "tempfile.tmp" /*一時ファイルのファイル名*/ #define GNUPLOT "/bin/gnuplot" /*gnuplotのパスを指定*/ #define RANGE 100 /*gnuplotの出力領域*/ /*座標値(2次元ベクトル)の表現*/ struct coordinate { double x ;/*x座標*/ double y ;/*y座標*/ } ; /*エージェントの表現*/ struct agent { int category ;/*エージェントの種類*/ struct coordinate coord ;/*座標*/ double dattribute[N_OF_A] ;/*属性値(実数)*/ int iattribute[N_OF_A] ;/*属性値(整数)*/ } ; /*関数のプロトタイプの宣言*/ void calcnext(struct agent a[]) ;/*次時刻の状態を計算 */ void fputstate(struct agent a[],int t) ;/*状態を出力*/ void cat0(struct agent *cat0agent) ;/*カテゴリ0の計算メソッド*/ void reverse(int *i) ;/*cat0()の下請け関数*/ /*********************/ /* main()関数 */ /*********************/ int main() { struct agent a[N]={0} ; /*エージェント*/ int t ; FILE *pipe ;/*gnuplotとの通信用パイプ*/ /*パイプを開く*/ if((pipe=popen(GNUPLOT " -persist","w"))==NULL){ /*pipeが開けない*/ fprintf(stderr,"パイプが開けません.\n") ; exit(1) ; } /*gnuplotの初期設定*/ fprintf(pipe,"set xrange [-%d:%d]\n",RANGE,RANGE) ; fprintf(pipe,"set yrange [-%d:%d]\n",RANGE,RANGE) ; /*初期化*/ a[0].iattribute[0]=1 ; /*エージェントシミュレーション*/ for(t=0;t<=TIMELIMIT;++t){/*打ち切り時間まで計算*/ printf("t=%d\n",t) ; calcnext(a) ;/*次時刻の状態を計算 */ fputstate(a,t) ;/*状態をファイル出力*/ /*gnuplotで描画*/ fprintf(pipe,"plot \"" TMPFILE "\" with points pt 4\n") ; fflush(pipe) ; sleep(1) ; /*表示の待ち合わせ*/ } return 0 ; } /*************************/ /* calcnext()関数 */ /* 次時刻の状態を計算 */ /*************************/ void calcnext(struct agent a[]) { int i ; for(i=0;i<N;++i){ /*各エージェントの計算*/ if(a[i].category==0)/*カテゴリ0*/cat0(&a[i]) ; else/*合致するカテゴリがない*/ fprintf(stderr,"ERROR カテゴリがありません(%d)\n",i) ; } } /*************************/ /* cat0()関数 */ /*カテゴリ0の計算メソッド*/ /*************************/ void cat0(struct agent *cat0agent) { /*内部状態の更新*/ reverse(&((*cat0agent).iattribute[0])) ; reverse(&((*cat0agent).iattribute[1])) ; /*内部状態によって次の座標を決定*/ (*cat0agent).coord.x+=(*cat0agent).iattribute[0] ; (*cat0agent).coord.y+=(*cat0agent).iattribute[1] ; } /*************************/ /* reverse()関数 */ /*cat0()関数の下請け関数 */ /*************************/ void reverse(int *i) { if(*i==0) *i=1; else *i=0 ; } /*************************/ /* fputstate()関数 */ /* 状態を出力 */ /*************************/ void fputstate(struct agent a[],int t) { int i ; FILE *fp ; /*一時ファイルのファイルポインタ*/ /*一時ファイルを開く*/ if((fp=fopen(TMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルが開けません\n") ; exit(1) ; } for(i=0;i<N;++i) /*カテゴリと座標の出力*/ fprintf(fp,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; fclose(fp) ;/*一時ファイルを閉じる*/ }
[出力結果]
例2.
/* 2次元平面内で動作するエージェント */ /* 複数のエージェントがランダムウォークします */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <unistd.h> #define BUFSIZE 256 /*入力バッファ用配列の長さ*/ #define N 30 /*エージェントの個数*/ #define N_OF_A 2 /*エージェントの属性値の個数*/ #define TIMELIMIT 100 /*シミュレーション打ち切り時刻*/ #define SEED RAND_MAX-1 /*乱数の種*/ /*以下はgnuplot利用のための定義*/ #define TMPFILE "tempfile.tmp" /*一時ファイルのファイル名*/ #define GNUPLOT "/bin/gnuplot" /*gnuplotのパスを指定*/ #define RANGE 10 /*gnuplotの出力領域*/ /*座標値(2次元ベクトル)の表現*/ struct coordinate { double x ;/*x座標*/ double y ;/*y座標*/ } ; /*エージェントの表現*/ struct agent { int category ;/*エージェントの種類*/ struct coordinate coord ;/*座標*/ double dattribute[N_OF_A] ;/*属性値(実数)*/ int iattribute[N_OF_A] ;/*属性値(整数)*/ } ; /*関数のプロトタイプの宣言*/ void calcnext(struct agent a[]) ;/*次時刻の状態を計算 */ void fputstate(struct agent a[],int t) ;/*状態を出力*/ void cat0(struct agent *cat0agent) ;/*カテゴリ0の計算メソッド*/ double frand(void) ;/*実数乱数*/ /*********************/ /* main()関数 */ /*********************/ int main() { struct agent a[N]={0} ; /*エージェント*/ int t ; FILE *pipe ;/*gnuplotとの通信用パイプ*/ /*パイプを開く*/ if((pipe=popen(GNUPLOT " -persist","w"))==NULL){ /*pipeが開けない*/ fprintf(stderr,"パイプが開けません.\n") ; exit(1) ; } /*gnuplotの初期設定*/ fprintf(pipe,"set xrange [-%d:%d]\n",RANGE,RANGE) ; fprintf(pipe,"set yrange [-%d:%d]\n",RANGE,RANGE) ; /*初期化*/ srand(SEED) ;/*乱数の初期化*/ /*エージェントシミュレーション*/ for(t=0;t<=TIMELIMIT;++t){/*打ち切り時間まで計算*/ printf("t=%d\n",t) ; calcnext(a) ;/*次時刻の状態を計算 */ fputstate(a,t) ;/*状態をファイル出力*/ /*gnuplotで描画*/ fprintf(pipe,"plot \"" TMPFILE "\" with points pt 4\n") ; fflush(pipe) ; sleep(1) ; /*表示の待ち合わせ*/ } return 0 ; } /*************************/ /* calcnext()関数 */ /* 次時刻の状態を計算 */ /*************************/ void calcnext(struct agent a[]) { int i ; for(i=0;i<N;++i){ /*各エージェントの計算*/ if(a[i].category==0)/*カテゴリ0*/cat0(&a[i]) ; else/*合致するカテゴリがない*/ fprintf(stderr,"ERROR カテゴリがありません(%d)\n",i) ; } } /*************************/ /* cat0()関数 */ /*カテゴリ0の計算メソッド*/ /*************************/ void cat0(struct agent *cat0agent) { (*cat0agent).coord.x+=(frand()-0.5) ; (*cat0agent).coord.y+=(frand()-0.5) ; } /*************************/ /* frand()関数 */ /* 実数乱数 */ /*************************/ double frand(void) { return (double)rand()/RAND_MAX ; } /*************************/ /* fputstate()関数 */ /* 状態を出力 */ /*************************/ void fputstate(struct agent a[],int t) { int i ; FILE *fp ; /*一時ファイルのファイルポインタ*/ /*一時ファイルを開く*/ if((fp=fopen(TMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルが開けません\n") ; exit(1) ; } for(i=0;i<N;++i) /*カテゴリと座標の出力*/ fprintf(fp,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; fclose(fp) ;/*一時ファイルを閉じる*/ }
[出力結果]
例3.
/* 2次元平面内で動作するエージェント群 */ /* 2種類のエージェントが相互作用します */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <unistd.h> #define BUFSIZE 256 /*入力バッファ用配列の長さ*/ #define N 50 /*エージェントの個数*/ #define N_OF_A 2 /*エージェントの属性値の個数*/ #define TIMELIMIT 100 /*シミュレーション打ち切り時刻*/ #define SEED RAND_MAX-1 /*乱数の種*/ #define R 0.1 /*近隣を規定する数値*/ /*カテゴリ1のエージェントの速度*/ #define DX 0.1 #define DY 0.1 /*以下はgnuplot利用のための定義*/ #define ATMPFILE "atempfile.tmp" /*一時ファイルのファイル名*/ #define BTMPFILE "btempfile.tmp" /*一時ファイルのファイル名*/ #define GNUPLOT "/bin/gnuplot" /*gnuplotのパスを指定*/ #define RANGE 10 /*gnuplotの出力領域*/ /*座標値(2次元ベクトル)の表現*/ struct coordinate { double x ;/*x座標*/ double y ;/*y座標*/ } ; /*エージェントの表現*/ struct agent { int category ;/*エージェントの種類*/ struct coordinate coord ;/*座標*/ double dattribute[N_OF_A] ;/*属性値(実数)*/ int iattribute[N_OF_A] ;/*属性値(整数)*/ } ; /*関数のプロトタイプの宣言*/ void calcnext(struct agent a[]) ;/*次時刻の状態を計算 */ void fputstate(struct agent a[],int t) ;/*状態を出力*/ double frand(void) ;/*実数乱数*/ void cat0(struct agent *cat0agent,struct agent a[]) ;/*カテゴリ0の計算メソッド*/ void cat1(struct agent *cat1agent) ;/*カテゴリ1の計算メソッド*/ /*********************/ /* main()関数 */ /*********************/ int main() { struct agent a[N]={0} ; /*エージェント*/ int t ; FILE *pipe ;/*gnuplotとの通信用パイプ*/ /*パイプを開く*/ if((pipe=popen(GNUPLOT " -persist","w"))==NULL){ /*pipeが開けない*/ fprintf(stderr,"パイプが開けません.\n") ; exit(1) ; } /*gnuplotの初期設定*/ fprintf(pipe,"set xrange [-%d:%d]\n",RANGE,RANGE) ; fprintf(pipe,"set yrange [-%d:%d]\n",RANGE,RANGE) ; /*初期化*/ srand(SEED) ;/*乱数の初期化*/ /*エージェントの設定*/ a[0].category=1 ; a[0].coord.x=-2 ; a[0].coord.y=-2 ; /*エージェントシミュレーション*/ for(t=1;t<=TIMELIMIT;++t){/*打ち切り時間まで計算*/ printf("t=%d\n",t) ; calcnext(a) ;/*次時刻の状態を計算 */ fputstate(a,t) ;/*状態をファイル出力*/ /*gnuplotで描画*/ fprintf(pipe,"plot \"" ATMPFILE "\" , \"" BTMPFILE "\"with points pt 4\n") ; fflush(pipe) ; sleep(1) ; /*表示の待ち合わせ*/ } return 0 ; } /*************************/ /* calcnext()関数 */ /* 次時刻の状態を計算 */ /*************************/ void calcnext(struct agent a[]) { int i ; for(i=0;i<N;++i){ /*各エージェントの計算*/ if(a[i].category==0)/*カテゴリ0*/cat0(&a[i],a) ; else if(a[i].category==1)/*カテゴリ1*/cat1(&a[i]) ; else/*合致するカテゴリがない*/ fprintf(stderr,"ERROR カテゴリがありません(%d)\n",i) ; } } /*************************/ /* cat0()関数 */ /*カテゴリ0の計算メソッド*/ /*************************/ void cat0(struct agent *cat0agent,struct agent a[]) { int i ; double c0x,c0y,ax,ay ; /*距離の計算に使う変数*/ for(i=0;i<N;++i){ if(a[i].category==1){ /*カテゴリ1のエージェントとの距離を調べる*/ c0x=(*cat0agent).coord.x ; c0y=(*cat0agent).coord.y ; ax=a[i].coord.x ; ay=a[i].coord.y ; if(((c0x-ax)*(c0x-ax)+(c0y-ay)*(c0y-ay))<R){ /*隣接してカテゴリ1のエージェントがいる*/ (*cat0agent).category=1 ;/*カテゴリ1に変身*/ return ; } } } /*カテゴリ1は近隣にはいない*/ (*cat0agent).coord.x+=(frand()-0.5) ; (*cat0agent).coord.y+=(frand()-0.5) ; } /*************************/ /* cat1()関数 */ /*カテゴリ1の計算メソッド*/ /*************************/ void cat1(struct agent *cat1agent) { (*cat1agent).coord.x+=DX ; (*cat1agent).coord.y+=DY ; } /*************************/ /* fputstate()関数 */ /* 状態を出力 */ /*************************/ void fputstate(struct agent a[],int t) { int i ; FILE *fpa,*fpb ; /*一時ファイルのファイルポインタ*/ /*一時ファイルを開く*/ if((fpa=fopen(ATMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルAが開けません\n") ; exit(1) ; } if((fpb=fopen(BTMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルBが開けません\n") ; exit(1) ; } for(i=0;i<N;++i){ /*カテゴリと座標の出力*/ if(a[i].category==0) fprintf(fpa,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; else fprintf(fpb,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; } fclose(fpa) ;/*一時ファイルを閉じる*/ fclose(fpb) ;/*一時ファイルを閉じる*/ } /*************************/ /* frand()関数 */ /* 実数乱数 */ /*************************/ double frand(void) { return (double)rand()/RAND_MAX ; }
[出力結果]
例4.
/* ”感染”のエージェントシミュレーション */ /* 2次元平面内で動作するエージェント群 */ /* 2種類のエージェントが相互作用します */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <unistd.h> #define BUFSIZE 256 /*入力バッファ用配列の長さ*/ #define N 50 /*エージェントの個数*/ #define N_OF_A 2 /*エージェントの属性値の個数*/ #define TIMELIMIT 100 /*シミュレーション打ち切り時刻*/ #define SEED RAND_MAX-1 /*乱数の種*/ #define R 0.1 /*近隣を規定する数値*/ /*カテゴリ1のエージェントの速度*/ #define DX 0.1 #define DY 0.1 /*以下はgnuplot利用のための定義*/ #define ATMPFILE "atempfile.tmp" /*一時ファイルのファイル名*/ #define BTMPFILE "btempfile.tmp" /*一時ファイルのファイル名*/ #define GNUPLOT "/bin/gnuplot" /*gnuplotのパスを指定*/ #define RANGE 10 /*gnuplotの出力領域*/ /*座標値(2次元ベクトル)の表現*/ struct coordinate { double x ;/*x座標*/ double y ;/*y座標*/ } ; /*エージェントの表現*/ struct agent { int category ;/*エージェントの種類*/ struct coordinate coord ;/*座標*/ double dattribute[N_OF_A] ;/*属性値(実数)*/ int iattribute[N_OF_A] ;/*属性値(整数)*/ } ; /*関数のプロトタイプの宣言*/ void calcnext(struct agent a[]) ;/*次時刻の状態を計算 */ void fputstate(struct agent a[],int t) ;/*状態を出力*/ double frand(void) ;/*実数乱数*/ void cat0(struct agent *cat0agent,struct agent a[]) ; /*カテゴリ0の計算メソッド*/ void cat1(struct agent *cat1agent) ;/*カテゴリ1の計算メソッド*/ /*大域変数*/ double factor=1.0 ;/*カテゴリ1のエージェントの歩幅*/ /*********************/ /* main()関数 */ /*********************/ int main(int argc,char *argv[]) { struct agent a[N]={0} ; /*エージェント*/ int t ; FILE *pipe ;/*gnuplotとの通信用パイプ*/ /*factorの初期化*/ if(argc>=2){/*factorの指定がある*/ factor=atof(argv[1]) ; } printf("factor : %lf\n",factor) ; /*パイプを開く*/ if((pipe=popen(GNUPLOT " -persist","w"))==NULL){ /*pipeが開けない*/ fprintf(stderr,"パイプが開けません.\n") ; exit(1) ; } /*gnuplotの初期設定*/ fprintf(pipe,"set xrange [-%d:%d]\n",RANGE,RANGE) ; fprintf(pipe,"set yrange [-%d:%d]\n",RANGE,RANGE) ; /*初期化*/ srand(SEED) ;/*乱数の初期化*/ /*エージェントの設定*/ a[0].category=1 ; a[0].coord.x=-2 ; a[0].coord.y=-2 ; /*エージェントシミュレーション*/ for(t=1;t<=TIMELIMIT;++t){/*打ち切り時間まで計算*/ printf("t=%d\n",t) ; calcnext(a) ;/*次時刻の状態を計算 */ fputstate(a,t) ;/*状態をファイル出力*/ /*gnuplotで描画*/ fprintf(pipe,"plot \"" ATMPFILE "\" , \"" BTMPFILE "\"with points pt 4\n") ; fflush(pipe) ; sleep(1) ; /*表示の待ち合わせ*/ } return 0 ; } /*************************/ /* calcnext()関数 */ /* 次時刻の状態を計算 */ /*************************/ void calcnext(struct agent a[]) { int i ; for(i=0;i<N;++i){ /*各エージェントの計算*/ if(a[i].category==0)/*カテゴリ0*/cat0(&a[i],a) ; else if(a[i].category==1)/*カテゴリ1*/cat1(&a[i]) ; else/*合致するカテゴリがない*/ fprintf(stderr,"ERROR カテゴリがありません(%d)\n",i) ; } } /*************************/ /* cat0()関数 */ /*カテゴリ0の計算メソッド*/ /*************************/ void cat0(struct agent *cat0agent,struct agent a[]) { int i ; double c0x,c0y,ax,ay ; /*距離の計算に使う変数*/ for(i=0;i<N;++i){ if(a[i].category==1){ /*カテゴリ1のエージェントとの距離を調べる*/ c0x=(*cat0agent).coord.x ; c0y=(*cat0agent).coord.y ; ax=a[i].coord.x ; ay=a[i].coord.y ; if(((c0x-ax)*(c0x-ax)+(c0y-ay)*(c0y-ay))<R){ /*隣接してカテゴリ1のエージェントがいる*/ (*cat0agent).category=1 ;/*カテゴリ1に変身*/ return ; } } } /*カテゴリ1は近隣にはいない*/ (*cat0agent).coord.x+=(frand()-0.5) ; (*cat0agent).coord.y+=(frand()-0.5) ; } /*************************/ /* cat1()関数 */ /*カテゴリ1の計算メソッド*/ /*************************/ void cat1(struct agent *cat1agent) { (*cat1agent).coord.x+=(frand()-0.5)*factor ; (*cat1agent).coord.y+=(frand()-0.5)*factor ; } /*************************/ /* fputstate()関数 */ /* 状態を出力 */ /*************************/ void fputstate(struct agent a[],int t) { int i ; FILE *fpa,*fpb ; /*一時ファイルのファイルポインタ*/ /*一時ファイルを開く*/ if((fpa=fopen(ATMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルAが開けません\n") ; exit(1) ; } if((fpb=fopen(BTMPFILE,"w"))==NULL){/*一時ファイルが開けない*/ fprintf(stderr,"一時ファイルBが開けません\n") ; exit(1) ; } for(i=0;i<N;++i){ /*カテゴリと座標の出力*/ if(a[i].category==0) fprintf(fpa,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; else fprintf(fpb,"%lf %lf\n",a[i].coord.x,a[i].coord.y) ; } fclose(fpa) ;/*一時ファイルを閉じる*/ fclose(fpb) ;/*一時ファイルを閉じる*/ } /*************************/ /* frand()関数 */ /* 実数乱数 */ /*************************/ double frand(void) { return (double)rand()/RAND_MAX ; }
[出力結果]
Back to C Language