#include #include #include #include "genetic.h" #include "rand.h" #include "sync.h" using namespace genetic; const int len = 12; const float max_float = 999.9f; static uint64_t seed = 12; static float num_mutate_chance = 0.5; static int num_parents = 2; static int num_children = 2; static int target_sum = 20000; static int target_product = 10*target_sum; Array make_new_arr() { Array arr = make_array(len); for (int i = 0; i < arr.len; i++) { arr[i] = norm_rand(seed) * max_float; } return arr; } void mutate(Array &arr_to_mutate) { for (int i = 0; i < len; i++) { if (norm_rand(seed) < num_mutate_chance) { arr_to_mutate[i] = norm_rand(seed) * max_float; } } } void crossover(const Array*> parents, const Array *> out_children) { for (int i = 0; i < len; i++) { (*out_children.data[0])[i] = i < len/2 ? (*parents.data[0])[i] : (*parents.data[1])[i]; (*out_children.data[1])[i] = i < len/2 ? (*parents.data[1])[i] : (*parents.data[0])[i]; } } float fitness(const Array &cell) { float sum = 0; float product = 1; for (int i = 0; i < cell.len; i++) { sum += cell.data[i]; product *= cell.data[i]; } return abs(sum - target_sum)*abs(sum - target_sum) + abs(product - target_product); } int main(int argc, char **argv) { int num_gens = 10000; Strategy> strat { .num_threads = atoi(argv[1]), .stats_print_period_s = 2, .num_cells_per_thread = 100000, .num_generations = num_gens, .share_breakthroughs=true, .share_breakthrough_gen_period=10, .test_all = true, .test_chance = 0.0, // doesn't matter .enable_crossover = true, .crossover_parent_num = 2, .crossover_parent_stride = 1, .crossover_children_num = 2, .enable_mutation = true, .mutation_chance = 0.7, .rand_seed = seed, .higher_fitness_is_better = false, .make_default_cell=make_new_arr, .mutate=mutate, .crossover=crossover, .fitness=fitness }; TimeSpan start = now(); auto best_cell = run(strat); TimeSpan runtime = now() - start; float sum = 0; float product = 1; printf("Winning cell: "); for (int i = 0; i < best_cell.len; i++) { float val = best_cell[i]; sum += val; product *= val; printf("%f ", val); } printf("\n"); printf("Final Sum: %f\n", sum); printf("Final Product: %f\n", product); printf("Execution Time %d (min) %f (s)\n", static_cast(sync::to_min(runtime)), fmod(to_s(runtime), 60) ); }