-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevolve.c
More file actions
54 lines (45 loc) · 1.61 KB
/
evolve.c
File metadata and controls
54 lines (45 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "a4.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static int compare(const void *s1, const void *s2) {
Individual *e1 = (Individual *)s1;
Individual *e2 = (Individual *)s2;
double compared = e1->fitness - e2->fitness;
if (fabs(compared) < 10e-9)
return 0;
else if (compared < 0)
return -1;
return 1;
}
PPM_IMAGE *evolve_image(const PPM_IMAGE *image, int num_generations,
int population_size, double rate) {
time_t t;
srand((unsigned)time(&t));
Individual *individual = generate_population(population_size, image->width,
image->height, image->max_color);
comp_fitness_population(image->data, individual, population_size);
qsort(individual, population_size, sizeof(Individual), compare);
for (int i = 1; i <= num_generations; i++) {
crossover(individual, population_size);
mutate_population(individual, population_size, rate);
comp_fitness_population(image->data, individual, population_size);
qsort(individual, population_size, sizeof(Individual), compare);
printf("Generation: %d Fitness: %.12e\n", i, individual[0].fitness);
}
PPM_IMAGE *ReturnImg = malloc(sizeof(PPM_IMAGE));
ReturnImg->data=individual[0].image.data;
ReturnImg->width=image->width;
ReturnImg->height=image->height;
ReturnImg->max_color=image->max_color;
for (int i=1;i<population_size;i++){
free(individual[i].image.data);
}
free(individual);
return ReturnImg;
}
void free_image(PPM_IMAGE *p) {
free(p->data);
free(p);
}