]> mj.ucw.cz Git - leo.git/commitdiff
Labelling: Ranking now considers also distances
authorKarryanna <karry@karryanna.cz>
Wed, 13 May 2015 21:55:39 +0000 (23:55 +0200)
committerKarryanna <karry@karryanna.cz>
Wed, 13 May 2015 21:55:39 +0000 (23:55 +0200)
labeller.c

index 58fa844e0e2197752a84b1607a149895f2f1e14c..e74e4e45759f0c35f92e7639f2081756db958843 100644 (file)
@@ -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; i<GARY_SIZE(individual->placements); 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;
   }
 }