次のように作り、 Gnuplotで表示させる。 ちなみに、ここでファイルを分割するには、次を使うと便利。
split -51 pattern.txt sh_
のコマンドでOK.
50行×50行の行列の後、一つの空白のため、 51行ごとに分割。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LAT 50
/*for function*/
double ransuu01();
int bc();
main(){
int s[LAT][LAT];
int i,j,k,h,t,nt;
int focal,nei,nei_r, nei_b,nei_e;
int count_e,choose;
int judge;
double happy[LAT][LAT];
double no_neighbor;
double initial_r, initial_b; /*initial densities of red and blue*/
double ini_ran;
double threshold_r, threshold_b;
srand(time(0));// seed for random number
FILE *fpc,*fpd;
fpc=fopen("pattern.txt","w");
fpd=fopen("happyness.txt","w");
no_neighbor = 8.0;//Moore neighborhood
initial_r = 0.3;
initial_b = 0.5;
threshold_r = 0.3;
threshold_b = 0.5;
/*initial distribution of red and blue*/
for(i=0;i<LAT;i++){
for(j=0;j<LAT;j++){
ini_ran = ransuu01();
s[i][j]=0;
if( ini_ran < initial_r) s[i][j]=1;
else if( ini_ran < initial_r + initial_b) s[i][j]=2;
}
}
for(nt=0;nt<100;nt++){
for(t=0;t<10;t++){
/* choose one site occupied by a red or a blue from the whole lattice sites */
focal = 0;
while(focal == 0){
i= (int)((double)LAT*ransuu01()) ;
j= (int)((double)LAT*ransuu01()) ;
focal = s[i][j];
}
/*calculate the happyness of a player in (i, j)*/
nei_r = 0;
nei_b = 0;
nei_e = 0;
for(k=-1;k<=1;k++){
for(h=-1;h<=1;h++){
if(k*k + h*h > 0 ){
nei=s[bc(i+k)][bc(j+h)];
if(nei == 1) nei_r = nei_r + 1;
else if(nei == 2) nei_b = nei_b + 1;
nei_e = (int)no_neighbor - nei_r - nei_b;
}
}
}
/*move if the player does not feel happy */
if(nei_e > 0){// empty sites exits in the neighbor sites.
if(focal == 1){ //red
if((double)nei_r/no_neighbor < threshold_r){
//以下は、空白隣接点のうち、一つをランダムに選んで、そこへ移動するという作業
count_e=0;
choose = rand()%nei_e + 1;
judge=0;
for(k=-1;k<=1;k++){
for(h=-1;h<=1;h++){
if( k*k + h*h > 0 && judge==0){
if( s[bc(i+k)][bc(j+h)] == 0 ) count_e=count_e + 1;
if(count_e == choose){
s[bc(i+k)][bc(j+h)]=focal;
s[i][j]=0;
judge=1;
}
}
}
}
}
}
else if(focal == 2){
if( (double)nei_b/no_neighbor < threshold_b){
count_e=0;
choose = rand()%nei_e + 1;
judge=0;
for(k=-1;k<=1;k++){
for(h=-1;h<=1;h++){
if( k*k + h*h > 0 && judge==0){
if( s[bc(i+k)][bc(j+h)]== 0 ) count_e=count_e + 1;
if(count_e == choose){
s[bc(i+k)][bc(j+h)]=focal;
s[i][j]=0;
judge=1;
}
}// if( k*k + h*h > 0)
}// for h
}// for k
}//if(nei_b < threshold_b)
}// else if(focal == 2) blue
}//if(nei_e > 0)
/*lattice pattern*/
if(t == 2){
for(i=0;i<LAT;i++){
for(j=0;j<LAT;j++)
fprintf(fpc,"%d ",s[i][j]);
fprintf(fpc,"\n");
}// for i
fprintf(fpc,"\n");
}//if(t)
/*happyness*/
if(t == 2){
for(i=0;i<LAT;i++){ for(j=0;j<LAT;j++){
happy[i][j]=0.0;
focal = s[i][j];
nei_r = 0; nei_b = 0; nei_e = 0;
for(k=-1;k<=1;k++){
for(h=-1;h<=1;h++){
if(k*k + h*h > 0 ){ // except both k=0 and h=0
nei=s[bc(i+k)][bc(j+h)];
if(nei == 1) nei_r = nei_r + 1;
else if(nei == 2) nei_b = nei_b + 1;
nei_e = 8 - nei_r - nei_b;
}//if(k*k + h*h > 0 )
}// for h
}// for k
if(focal == 1) happy[i][j]=(double)nei_r/no_neighbor;
else if(focal == 2) happy[i][j]=(double)nei_b/no_neighbor;
}//for(j=0;j<LAT;j++)
}//for(i=0;i<LAT;i++)
for(i=0;i<LAT;i++){
for(j=0;j<LAT;j++) fprintf(fpd,"%f ",happy[i][j]);
fprintf(fpd,"\n");
}// for i
fprintf(fpd,"\n");
}//if(t== 100)
fprintf(fpd,"\n");
//printf("\n\n");
} //for t
} //for nt
fclose(fpd);
fclose(fpc);
return 0;
}
double ransuu01()
{
return (double)rand()/((double)RAND_MAX+1.0);
}
int bc(i)
int i;
{
if(0<=i && i<LAT) return i;
if(i<0) return i+LAT;
else if(i>=LAT) return i-LAT;
}
Gnuplotで表示させるためのファイルとして次のように書けば、ちゃんと表示される。
set yrange [] reverse set palette defined (0 "white",1 "blue", 2 "red") plot 'sh_aa' matrix with image pause 1 plot 'sh_ab' matrix with image pause 1 plot 'sh_ac' matrix with image pause 1 plot 'sh_ad' matrix with image pause 1 略
[出力結果]
Back to C Language

