/* allocation simulation cc simpall.c -o bsimp -lm */ #include #include #include #include #define MAXGENS 100 #define NPLANTS 1000 #define SEASONLEN 100.0 #define GROWTH 0.02 #define MUTATERATE 0.05 #define LZERO 1.0 #define SOLNTYPE 1 /* 1-constant, 2-switch */ typedef struct plant_def { double trait; double size; double fitness; } Plant; Plant plants1[NPLANTS], plants2[NPLANTS]; void InitSeed(void); void InitPlants(Plant *plnt); void ZeroPlants(Plant *plnt); void GrowPlants(Plant *plnt); void ReproducePlants(Plant *parents, Plant *babies); void PrintPlants(Plant *plnt); int main(void) { int ttt; Plant *babes, *adults, *tmpy; adults = plants2; babes = plants1; InitSeed(); InitPlants(babes); for(ttt=0;ttttm_sec+1)*(preztime->tm_min+1)* (preztime->tm_hour+1)*(preztime->tm_year)*(preztime->tm_year)); if(seed%2==0) seed++; srand48(seed); } void InitPlants(Plant *plnt) { int i; for(i=0;itrait = drand48(); #endif #if(SOLNTYPE==2) plnt->trait = drand48()*SEASONLEN; #endif } } void ZeroPlants(Plant *plnt) { int i; for(i=0;isize = LZERO; plnt->fitness = 0.0; } } void GrowPlants(Plant *plnt) { int i; double efac; for(i=0;itrait)*SEASONLEN); plnt->size = LZERO*efac; plnt->fitness = (GROWTH*plnt->trait*LZERO)*(efac-1.0) /(GROWTH*(1.0-plnt->trait)); #endif #if(SOLNTYPE==2) plnt->size = LZERO*exp(GROWTH*plnt->trait); plnt->fitness = GROWTH*plnt->size*(SEASONLEN-plnt->trait); #endif } } void ReproducePlants(Plant *parents, Plant *babies) { int i, j; double totrep, rnum; double brakes[NPLANTS]; Plant *plnt; plnt = parents; /* measure the total fitness in the habitat */ totrep = 0.0; for(i=0;ifitness; brakes[i] = totrep; } for(i=0;i brakes[j]) j++; else { while(rnum < brakes[j]) j--; j++; } babies->trait = parents[j].trait; if(drand48()trait = drand48(); #endif #if(SOLNTYPE==2) babies->trait = drand48()*SEASONLEN; #endif } } /* dist[] holds freq distribution of trait vals flag[] marks counted individuals (0-uncounted,-1 marks halotype(?), 1-counted) */ void PrintPlants(Plant *plnt) { int i, j, flag[NPLANTS], dist[NPLANTS], biggie=0; for(i=0;ibiggie) biggie = dist[i]; } } for(i=0;itrait,plnt->size,plnt->fitness, 5.0*dist[i]/(double)biggie); } }