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;
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;
}
}