From 5b2ee807007c89a8da6aaf4b395842a62329a1a8 Mon Sep 17 00:00:00 2001 From: Karryanna Date: Wed, 13 May 2015 23:55:39 +0200 Subject: [PATCH] Labelling: Ranking now considers also distances --- labeller.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/labeller.c b/labeller.c index 58fa844..e74e4e4 100644 --- a/labeller.c +++ b/labeller.c @@ -1409,6 +1409,51 @@ int individual_overlap(struct individual *individual) return overlap; } +double get_distance(struct placement *p) +{ + if (p->variant_used < 0) return 0; + struct variant *v = &p->request->variants[p->variant_used]; + + double dx, dy, distance; + switch (p->request->type) + { + case REQUEST_POINT: ; + struct request_point *rp = (struct request_point *) p->request; + dx = rp->x + p->request->variants[p->variant_used].offset_x - p->x; + dy = rp->y + p->request->variants[p->variant_used].offset_y - p->y; + distance = sqrt(dx*dx + dy*dy); + if (dbg_rank >= VERBOSITY_PLACEMENT) + printf("Point placed at [%.2f; %.2f], expected at [%.2f; %.2f]\n", p->x, p->y, rp->x, rp->y); + break; + case REQUEST_AREA: ; + struct request_area *ra = (struct request_area *) p->request; + dx = ra->cx + p->request->variants[p->variant_used].offset_x - p->x; + dy = ra->cy + p->request->variants[p->variant_used].offset_y - p->y; + distance = sqrt(dx*dx + dy*dy); + if (dbg_rank >= VERBOSITY_PLACEMENT) + printf("Area placed at [%.2f; %.2f], expected at [%.2f; %.2f]\n", p->x, p->y, ra->cx, ra->cy); + break; + default: + return 0; + } + + if (dbg_rank >= VERBOSITY_PLACEMENT) + printf("Placement %d has distance %.2f\n", p->ind, distance); + return distance; +} + +double individual_distances(struct individual *individual) +{ + int distances = 0; + + for (uns i=0; iplacements); i++) + { + distances += get_distance(&individual->placements[i]); + } + + return distances; +} + int cmp_individual(const void *a, const void *b) { struct individual **ia = (struct individual **) a; @@ -1431,6 +1476,11 @@ void rank_population(void) if (dbg_rank) printf("Increasing penalty by %d for overlap\n", penalty); population1[i]->penalty += penalty; + + penalty = individual_distances(population1[i]); + if (dbg_rank) + printf("Increasing penalty by %d for distances\n", penalty); + population1[i]->penalty += penalty; } } -- 2.39.2