[brlcad-commits] CVS: brlcad/src/gtools/beset beset.c, 1.22, 1.23 beset.h, 1.8, 1.9 population.c, 1
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: Sean M. <br...@us...> - 2007-08-01 20:50:16
|
Update of /cvsroot/brlcad/brlcad/src/gtools/beset In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31132 Modified Files: beset.c beset.h population.c population.h Log Message: no need to malloc a single struct once, just use it Index: beset.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/gtools/beset/beset.c,v retrieving revision 1.22 retrieving revision 1.23 diff -w -u -r1.22 -r1.23 --- beset.c 1 Aug 2007 20:26:23 -0000 1.22 +++ beset.c 1 Aug 2007 20:50:17 -0000 1.23 @@ -114,7 +114,7 @@ int best,worst; fastf_t total_fitness = 0.0f; struct fitness_state *fstate = NULL; - struct population *pop = NULL; + struct population pop; char dbname[256] = {0}; //name of database struct options opts = {DEFAULT_POP_SIZE, DEFAULT_GENS, DEFAULT_RES, 0, 0}; struct individual *tmp = NULL; @@ -134,8 +134,7 @@ /* initialize population and spawn initial individuals */ pop_init(&pop, opts.pop_size); - pop_spawn(pop, pop->db_p->dbi_wdbp); - + pop_spawn(&pop, pop.db_p->dbi_wdbp); for(g = 1; g < opts.gens; g++ ){ #ifdef VERBOSE @@ -147,67 +146,67 @@ best = worst = 0; snprintf(dbname, 256, "gen%.3d", g); - pop->db_c = db_create(dbname, 5); + pop.db_c = db_create(dbname, 5); /* calculate sum of all fitnesses and find * the most fit individual in the population * note: need to calculate outside of main pop * loop because it's needed for pop_wrand_ind()*/ - for(i = 0; i < pop->size; i++) { - fit_diff(pop->parent[i].id, pop->db_p, fstate); - pop->parent[i].fitness = fstate->fitness; + for(i = 0; i < pop.size; i++) { + fit_diff(pop.parent[i].id, pop.db_p, fstate); + pop.parent[i].fitness = fstate->fitness; total_fitness += FITNESS; } /* sort population - used for keeping top N and dropping bottom M */ - qsort(pop->parent, pop->size, sizeof(struct individual), cmp_ind); + qsort(pop.parent, pop.size, sizeof(struct individual), cmp_ind); /* remove lower M of individuals */ - for(i = 0; i < opts.kill_lower > pop->size ? pop->size : opts.kill_lower; i++) { - total_fitness -= pop->parent[i].fitness; + for(i = 0; i < opts.kill_lower > pop.size ? pop.size : opts.kill_lower; i++) { + total_fitness -= pop.parent[i].fitness; } - printf("Most fit individual was %s with a fitness of %g\n", pop->parent[pop->size-1].id, pop->parent[pop->size-1].fitness); - printf("%6.8g\t%6.8g\t%6.8g\n", total_fitness/pop->size, pop->parent[0].fitness, pop->parent[pop->size-1].fitness); + printf("Most fit individual was %s with a fitness of %g\n", pop.parent[pop.size-1].id, pop.parent[pop.size-1].fitness); + printf("%6.8g\t%6.8g\t%6.8g\n", total_fitness/pop.size, pop.parent[0].fitness, pop.parent[pop.size-1].fitness); - for(i = 0; i < pop->size; i++){ + for(i = 0; i < pop.size; i++){ - snprintf(pop->child[i].id, 256, "gen%.3dind%.3d", g, i); + snprintf(pop.child[i].id, 256, "gen%.3dind%.3d", g, i); /* keep upper N */ - if(i >= pop->size - opts.keep_upper){ - pop_gop(REPRODUCE, pop->parent[i].id, NULL, pop->child[i].id, NULL, - pop->db_p, pop->db_c, &rt_uniresource); + if(i >= pop.size - opts.keep_upper){ + pop_gop(REPRODUCE, pop.parent[i].id, NULL, pop.child[i].id, NULL, + pop.db_p, pop.db_c, &rt_uniresource); continue; } /* Choose a random genetic operation and * a parent which the op will be performed on*/ gop = pop_wrand_gop(); - parent1 = pop_wrand_ind(pop->parent, pop->size, total_fitness, opts.kill_lower); - //printf("selected %g\n", pop->parent[parent1].fitness); + parent1 = pop_wrand_ind(pop.parent, pop.size, total_fitness, opts.kill_lower); + //printf("selected %g\n", pop.parent[parent1].fitness); /* If we're performing crossover, we need a second parent */ - if(gop == CROSSOVER && i >= pop->size-opts.keep_upper-1)gop=REPRODUCE; //cannot cross, so reproduce + if(gop == CROSSOVER && i >= pop.size-opts.keep_upper-1)gop=REPRODUCE; //cannot cross, so reproduce if(gop & (REPRODUCE | MUTATE)){ #ifdef VERBOSE - printf("r(%s)\t ---------------> (%s)\n", pop->parent[parent1].id, pop->child[i].id); + printf("r(%s)\t ---------------> (%s)\n", pop.parent[parent1].id, pop.child[i].id); #endif /* perform the genetic operation and output the child to the child database */ - pop_gop(gop, pop->parent[parent1].id, NULL, pop->child[i].id, NULL, - pop->db_p, pop->db_c, &rt_uniresource); + pop_gop(gop, pop.parent[parent1].id, NULL, pop.child[i].id, NULL, + pop.db_p, pop.db_c, &rt_uniresource); } else { //while(parent2 == parent1) -- needed? can crossover be done on same 2 ind? - parent2 = pop_wrand_ind(pop->parent, pop->size, total_fitness, opts.kill_lower); -// printf("selected: %g\n", pop->parent[parent2].fitness); - snprintf(pop->child[i].id, 256, "gen%.3dind%.3d", g, ++i); //name the child and increase pop count + parent2 = pop_wrand_ind(pop.parent, pop.size, total_fitness, opts.kill_lower); +// printf("selected: %g\n", pop.parent[parent2].fitness); + snprintf(pop.child[i].id, 256, "gen%.3dind%.3d", g, ++i); //name the child and increase pop count #ifdef VERBOSE - printf("x(%s, %s) --> (%s, %s)\n", pop->parent[parent1].id, pop->parent[parent2].id, pop->child[i-1].id, pop->child[i].id); + printf("x(%s, %s) --> (%s, %s)\n", pop.parent[parent1].id, pop.parent[parent2].id, pop.child[i-1].id, pop.child[i].id); #endif /* perform the genetic operation and output the children to the cihld database */ - pop_gop(gop, pop->parent[parent1].id, pop->parent[parent2].id, pop->child[i-1].id, pop->child[i].id, - pop->db_p, pop->db_c, &rt_uniresource); + pop_gop(gop, pop.parent[parent1].id, pop.parent[parent2].id, pop.child[i-1].id, pop.child[i].id, + pop.db_p, pop.db_c, &rt_uniresource); } } @@ -216,26 +215,26 @@ * to parent database and population * Note: pop size is constant so we * can keep the storage from the previous - * pop->parent for the next pop->child*/ - db_close(pop->db_p); - pop->db_p = pop->db_c; - tmp = pop->child; - pop->child = pop->parent; - pop->parent = tmp; + * pop.parent for the next pop.child*/ + db_close(pop.db_p); + pop.db_p = pop.db_c; + tmp = pop.child; + pop.child = pop.parent; + pop.parent = tmp; } #ifdef VERBOSE printf("\nFINAL POPULATION\n" "----------------\n"); - for(i = 0; i < pop->size; i++) - printf("%s\tf:%.5g\n", pop->child[i].id, - pop->child[i].fitness); + for(i = 0; i < pop.size; i++) + printf("%s\tf:%.5g\n", pop.child[i].id, + pop.child[i].fitness); #endif fit_clean(fstate); - pop_clean(pop); + pop_clean(&pop); return 0; } Index: beset.h =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/gtools/beset/beset.h,v retrieving revision 1.8 retrieving revision 1.9 diff -w -u -r1.8 -r1.9 --- beset.h 31 Jul 2007 21:54:36 -0000 1.8 +++ beset.h 1 Aug 2007 20:50:17 -0000 1.9 @@ -54,10 +54,10 @@ * MACROS TO IMPROVE READABILITY * OF FITNESS FUNCTION */ -#define FITNESS pop->parent[i].fitness +#define FITNESS (pop.parent[i].fitness) #define DIFF fit_linDiff(pop->parent[i].id, pop->db_p, fstate) -#define NODES fstate->nodes -#define INDEX pop->size-i +#define NODES (fstate->nodes) +#define INDEX (pop.size-i) #endif /* __BESET_H__ */ Index: population.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/gtools/beset/population.c,v retrieving revision 1.18 retrieving revision 1.19 diff -w -u -r1.18 -r1.19 --- population.c 1 Aug 2007 16:46:47 -0000 1.18 +++ population.c 1 Aug 2007 20:50:17 -0000 1.19 @@ -58,16 +58,14 @@ * P O P _ I N I T --- initialize a population of a given size */ void -pop_init (struct population **p, int size) +pop_init (struct population *p, int size) { - *p = bu_malloc(sizeof(struct population), "population"); - - (*p)->parent = bu_malloc(sizeof(struct individual) * size, "parent"); - (*p)->child = bu_malloc(sizeof(struct individual) * size, "child"); - (*p)->size = size; - (*p)->db_p = db_create("gen000", 5); //FIXME: variable names - (*p)->db_p->dbi_wdbp = wdb_dbopen((*p)->db_p, RT_WDB_TYPE_DB_DISK); - (*p)->db_c = DBI_NULL; + p->parent = bu_malloc(sizeof(struct individual) * size, "parent"); + p->child = bu_malloc(sizeof(struct individual) * size, "child"); + p->size = size; + p->db_p = db_create("gen000", 5); //FIXME: variable names + p->db_p->dbi_wdbp = wdb_dbopen(p->db_p, RT_WDB_TYPE_DB_DISK); + p->db_c = DBI_NULL; #define SEED 33 // init in main() bn_rand_init(idx, SEED); @@ -82,7 +80,6 @@ { bu_free(p->parent, "parent"); bu_free(p->child, "child"); - bu_free(p, "population"); } /** Index: population.h =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/gtools/beset/population.h,v retrieving revision 1.10 retrieving revision 1.11 diff -w -u -r1.10 -r1.11 --- population.h 1 Aug 2007 16:46:47 -0000 1.10 +++ population.h 1 Aug 2007 20:50:17 -0000 1.11 @@ -63,7 +63,7 @@ union tree *s_child; }; -void pop_init (struct population **p, int size); +void pop_init (struct population *p, int size); void pop_spawn (struct population *p, struct rt_wdb *db_fp); void pop_clean (struct population *p); void pop_add (struct individual *i, struct rt_wdb *db); |