#include #include #include #include #define N 100 // population size #define L 100 // max memory size #define G 10000 // max number of different genes in the world double s=0.1; //selection strength double v=1.0; //prob of inventing new gene per generation double p=1.0; //prob of dependency of memes int nl=100; //number of opportunities to learn int ngen=10000; //number of generations int iseed=9095; double wmax,wbar,nbar; int gmax; void one_generation(int meme[N][L],int nmeme[N],double w[N],double h[N],int dep[G],int copy[G]); void fitness(int meme[N][L],int nmeme[N],double w[N],int dep[G],int copy[G]); void print_stuff(int meme[N][L],int nmeme[N],double w[N],double h[N],int dep[G],int copy[G]); int main(){ int i,j,igen; int meme[N][L],nmeme[N]; int dep[G],copy[G]; double w[N],h[N]; srand48(iseed); //seed random number generator for(i=0;i0 meme i depends on meme dep[i] // if dep[i]=-1, meme i is independent copy[i]=0; } copy[1]=N; //N copies of meme 1 for(i=0;i 0.5){ a1[N].group = 1; }else if(flip_value < 0.5){ a1[N].group = 0; } r=drand48(); } while(r>w[ipar]/wmax); do{ flip_value = drand48()*N; if(flip_value > 0.5){ flip_value = 1; }else flip_value = 0; if(a1[N].group == 0){ jpar=drand48()*N; } if(a1[N].group == 1){ if(flip_value == 1){ jpar=drand48()*N; } else { while(flip_value!=1){ flip_value = drand48()*N; if(flip_value == 1){ jpar=drand48()*N; } } } } r=drand48(); } while((r>w[jpar]/wmax)||(jpar==ipar)); //two parents must be different h1[i]=h[ipar]; //h = prob of horizontal descent of meme (learn from parent) //initially this probability is copied without changing from ipar. //now have M chances of learning a meme //with prob vert/2 learn from ipar, prob vert/2 learn from jpar, prob h=1-vert learn from anyone j1=0; k=0; do{ r=drand48(); vert=(1.0-h[i])/2.0; if(rw[icul]/wmax)||(icul==ipar)||(icul==jpar)); j2=drand48()*nmeme[icul]; new=meme[icul][j2]; } //now check whether the new meme is already known //if not, learn it same=0; for(j=0;j0)&&(gmaxwmax) wmax=w[i]; wbar+=w[i]; nbar+=nmeme[i]; } wbar/=N; nbar/=N; for(i=1;i0) printf("meme %4d depends on %4d -- copies %d\n",i,dep[i],copy[i]); } for(i=0;i