From: Karryanna Date: Wed, 13 May 2015 21:51:39 +0000 (+0200) Subject: Labelling: Breeding X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=df800b3b4342e639528867b7b342600e5e685245;p=leo.git Labelling: Breeding --- diff --git a/labeller.c b/labeller.c index 345b70c..3171782 100644 --- a/labeller.c +++ b/labeller.c @@ -53,6 +53,7 @@ int dbg_overlaps = 0; int dbg_rank = 0; int dbg_evolution = 0; int dbg_mutation = 0; +int dbg_breeding = 0; int page_width_int; int page_height_int; @@ -177,14 +178,14 @@ struct map_part **get_parts(struct placement *symbol, struct individual *individ int randint(int min, int max); -struct placement **get_closure(struct placement *placement, struct individual *parent1, struct individual *parent2); -void copy_symbols(struct placement **closure, struct individual *parent, struct individual *child); +struct placement **get_closure(struct placement *placement); +void copy_symbols(struct placement **closure, struct individual *parent, struct individual *child, bool **processed_ptr); void move_symbol(struct placement *p); void move_symbol_point(struct placement *p); void move_symbol_segment(struct placement *p); struct placement **get_overlapping(struct placement *p); -void filter(struct placement **list, bool *pred); +struct placement **filter(struct placement **list, bool **pred_ptr); int flip(int a, int b); double randdouble(void); @@ -1050,7 +1051,15 @@ printf("Having %u point requests, %u line requests and %u area requests\n", GARY if (dbg_evolution) dump_penalties(population1); - printf("Dealing with %d requests\n", num_requests); + + breed_pop_size = conf_breed_pop_size * conf_pop_size; + breed_rbest_size = conf_breed_rbest * conf_pop_size; + if (dbg_evolution) + { + printf("Breeding parameters:\n"); + printf(" %d individuals are created\n", breed_pop_size); + printf(" %d best individuals in old population are considered\n", breed_rbest_size); + } mutate_pop_size = conf_mutate_pop_size * conf_pop_size; mutate_rbest_size = conf_mutate_rbest * conf_pop_size; @@ -1074,6 +1083,7 @@ printf("Having %u point requests, %u line requests and %u area requests\n", GARY if (dbg_evolution) printf("*** Iteration %d ***\n", iteration); + breed(); mutate(); elite(); @@ -1167,39 +1177,24 @@ bool shall_terminate(void) void breed(void) { - int acc = 0; int i=0; - printf("%.2f\n", ((double) conf_breed_pop_size_perc/100)); - int conf_breed_pop_size = ((double) conf_breed_pop_size_perc/100) * conf_pop_size; + struct individual **breed_buffer; - while (i < conf_breed_pop_size) + while (i < breed_pop_size) { - printf("%d < %d, breeding\n", i, conf_breed_pop_size); - int parent1 = randint(1, conf_breed_pop_size); - int parent2 = randint(1, conf_breed_pop_size); - printf("Will breed %d and %d, chosen of %d best of %d population (intended to be %d)\n", parent1, parent2, conf_breed_pop_size, GARY_SIZE(population1), conf_pop_size); + int parent1 = randint(0, breed_rbest_size-1); + int parent2 = randint(0, breed_rbest_size-1); + if (dbg_breeding) + printf("Will breed %d and %d\n", parent1, parent2); + breed_buffer = perform_crossover(population1[parent1], population1[parent2]); population2[pop2_ind++] = breed_buffer[0]; population2[pop2_ind++] = breed_buffer[1]; free(breed_buffer); - i++; - } - - acc += conf_breed_rbest_perc; - - return; // FIXME: DEBUG HACK - - int remaining = (1 - acc) * (conf_pop_size * conf_breed_perc); - int step = remaining / conf_pop_size; - for (; iplacements)); for (uns i=0; iplacements); i++) { - printf("%dth placement out of %d\n", i, num_requests); - if (! parent1->placements[i].processed) + if (! processed[parent1->placements[i].ind]) { - struct placement **clos_symbols = get_closure(&(parent1->placements[i]), parent1, parent2); + if (dbg_breeding) + printf("Creating symbol closure for placement %u\n", i); + + struct placement **clos_symbols = get_closure(&(parent1->placements[i])); int x = randint(1, 2); if (x == 1) { - copy_symbols(clos_symbols, parent1, child1); - copy_symbols(clos_symbols, parent2, child2); + if (dbg_breeding) + printf("Copying parent->child 1->1 and 2->2\n"); + copy_symbols(clos_symbols, parent1, child1, &processed); + copy_symbols(clos_symbols, parent2, child2, &processed); } else { - copy_symbols(clos_symbols, parent2, child1); - copy_symbols(clos_symbols, parent1, child2); + if (dbg_breeding) + printf("Copying parent->child 2->1 and 1->2\n"); + copy_symbols(clos_symbols, parent2, child1, &processed); + copy_symbols(clos_symbols, parent1, child2, &processed); } - printf("Symbols copied; %lld\n", GARY_SIZE(clos_symbols)); + GARY_FREE(clos_symbols); } + } - if (conf_mutate_children) - { - if (randint(1, 1000) < conf_mutate_children_prob * 1000) perform_mutation(child1); - if (randint(1, 1000) < conf_mutate_children_prob * 1000) perform_mutation(child2); - } + GARY_FREE(processed); + + if (conf_mutate_children) + { + if (randint(1, 1000) < conf_mutate_children_prob * 1000) perform_mutation(child1); + if (randint(1, 1000) < conf_mutate_children_prob * 1000) perform_mutation(child2); } buffer[0] = child1; @@ -1604,12 +1608,12 @@ int randint(int min, int max) return (r * (max - min)); } -struct placement **get_closure(struct placement *placement, struct individual *parent1, struct individual *parent2 UNUSED) +struct placement **get_closure(struct placement *placement) { - printf("Getting closure\n"); struct placement **closure; GARY_INIT(closure, 0); - bool *chosen = malloc(GARY_SIZE(parent1->placements) * sizeof(bool)); + bool *chosen = malloc(GARY_SIZE(placement->individual->placements) * sizeof(bool)); + for (uns i=0; iindividual->placements); i++) { chosen[i] = 0; } chosen[placement->request->ind] = 1; struct placement **p = GARY_PUSH(closure); *p = placement; @@ -1617,13 +1621,28 @@ struct placement **get_closure(struct placement *placement, struct individual *p uns first = 0; while (first < GARY_SIZE(closure)) { - printf("Iterating, first is %d\n", first); + if (dbg_breeding) + printf("Iterating, first is %d of current %u\n", first, GARY_SIZE(closure)); struct placement **overlapping = get_overlapping(placement); - filter(overlapping, chosen); + if (! overlapping) { first++; continue; } + + struct placement **filtered = filter(overlapping, &chosen); + if (dbg_breeding) + printf("There are %u new overlapping symbols\n", GARY_SIZE(filtered)); + GARY_FREE(overlapping); + overlapping = filtered; for (uns j=0; jrequest->ind] = 1; + if (! chosen[overlapping[j]->request->ind]) + { + if (overlaps(*p, overlapping[j])) + { + p = GARY_PUSH(closure); *p = overlapping[j]; + if (dbg_breeding) + printf("Adding placement of request %d (in fact at [%.2f; %.2f] of size %d x %d)\n", overlapping[j]->request->ind, overlapping[j]->x, overlapping[j]->y, overlapping[j]->request->variants[overlapping[j]->variant_used].width, overlapping[j]->request->variants[overlapping[j]->variant_used].height); + chosen[overlapping[j]->request->ind] = 1; + } + } } GARY_FREE(overlapping); first++; @@ -1632,15 +1651,20 @@ struct placement **get_closure(struct placement *placement, struct individual *p return closure; } -void copy_symbols(struct placement **closure, struct individual *parent, struct individual *child) +void copy_symbols(struct placement **closure, struct individual *parent, struct individual *child, bool **processed_ptr) { - //printf("%d\n", child->penalty); - //printf("Closure size: %lld\n", GARY_SIZE(closure)); + bool *processed = *processed_ptr; + if (dbg_breeding) + printf("Will copy %u symbols\n", GARY_SIZE(closure)); + for (uns i=0; irequest->ind; + processed[closure[i]->ind] = 1; + int ind = closure[i]->ind; child->placements[ind] = parent->placements[ind]; child->placements[ind].processed = 0; + child->placements[ind].map_links = NULL; + update_map_parts(&child->placements[ind]); } } @@ -1763,16 +1787,51 @@ void init_individual(struct individual *i) printf("Individual inited, has %u map parts\n", GARY_SIZE(i->map)); } -struct placement **get_overlapping(struct placement *p UNUSED) +struct placement **get_overlapping(struct placement *p) { struct placement **buffer; GARY_INIT(buffer, 0); + + struct map_part **parts = get_map_parts(p); + if (! parts) return NULL; + + for (uns i=0; iplacement->next; + while (mp) + { + if (p->variant_used >= 0) + { + struct placement **p = GARY_PUSH(buffer); + *p = mp->placement; + } + mp = mp->next; + } + } + GARY_FREE(parts); + + if (dbg_map_parts) + printf("Returning %u potentially overlapping placements\n", GARY_SIZE(buffer)); + return buffer; } -void filter(struct placement **list UNUSED, bool *pred UNUSED) +struct placement **filter(struct placement **list, bool **pred_ptr) { - // FIXME + bool *pred = *pred_ptr; // As GARY can't be passed directly + struct placement **filtered; + GARY_INIT(filtered, 0); + + for (uns i=0; irequest->ind]) + continue; + + struct placement **p = GARY_PUSH(filtered); + *p = list[i]; + } + + return filtered; } int flip(int a, int b)