void plan_individual(struct individual *individual);
int overlaps(struct placement *p1, struct placement *p2);
-int get_overlap(struct placement *p);
+int get_overlap(struct placement *p, int **planed_ptr, int iteration);
int individual_overlap(struct individual *individual);
double get_distance(struct placement *p);
return overlap;
}
-int get_overlap(struct placement *p)
+int get_overlap(struct placement *p, int **planned_ptr, int iteration)
{
+ int *planned = *planned_ptr;
+
if (p->variant_used == -1) return 0;
struct map_part **parts = get_map_parts(p);
}
struct placement **others;
- bool *planned;
- GARY_INIT_ZERO(planned, num_requests);
- planned[p->request->ind] = 1;
+ planned[p->request->ind] = iteration;
GARY_INIT(others, 0);
//printf("Iterating over parts of placement %d (at [%.2f; %.2f] / %d)\n", p->ind, p->x, p->y, p->variant_used);
struct map_placement *mp = parts[i]->placement->next_in_map;
while (mp)
{
- if (! planned[mp->placement->request->ind])
+ if (planned[mp->placement->request->ind] != iteration)
{
struct placement **p = GARY_PUSH(others);
*p = mp->placement;
- planned[mp->placement->request->ind] = true;
+ planned[mp->placement->request->ind] = iteration;
}
mp = mp->next_in_map;
}
overlap += overlaps(p, others[i]);
}
- GARY_FREE(planned);
GARY_FREE(parts);
GARY_FREE(others);
{
int overlap = 0;
+ int *planned;
+ GARY_INIT_ZERO(planned, GARY_SIZE(individual->placements));
+
for (uns i=0; i<GARY_SIZE(individual->placements); i++)
{
- overlap += get_overlap(&individual->placements[i]);
+ overlap += get_overlap(&individual->placements[i], &planned, i+1);
}
+ GARY_FREE(planned);
+
// printf("Total overlap is %d\n", overlap);
return overlap;