Ejemplo n.º 1
0
def evolution(gen_size, num_of_gens, num_of_parents, num_of_bests, epochs, to_print):
    start_time = time.time()
    cur_gen = []
    prev_gen = []
    n_gen = 0
    best_org_fit = 0
    best_org_weights = []

    # initializing generation 0
    for i in range(0, gen_size):
        cur_gen.append(Organism())

    # start evolution
    while n_gen < num_of_gens:
        n_gen += 1
        prev_gen.clear()
        # compute fitness for each organism on current generation
        for org in cur_gen:
            org.forward_propagation(X_train, Y_train)
            prev_gen.append(org)

        cur_gen.clear()
        prev_gen = sorted(prev_gen, key=lambda x: x.fitness)
        prev_gen.reverse()
        # save the fitness of the best organism of current generation
        cur_best_fit = prev_gen[0].fitness

        # save the fitness and weights of the best organism until now
        if cur_best_fit > best_org_fit:
            best_org_fit = cur_best_fit
            best_org_weights.clear()
            for layer in prev_gen[0].layers:
                best_org_weights.append(layer.get_weights()[0])
        if to_print:
            print('Generation: %1.f' % n_gen, '\tBest Fitness: %.4f' % cur_best_fit)
        # crossover current generation
        cur_gen = crossover(gen_size, prev_gen, num_of_bests, num_of_parents)

    best_organism = Organism(best_org_weights)
    best_organism.compile_train(epochs, X_train, Y_train, to_print)

    # test
    Y_hat = best_organism.predict(X_test)
    Y_hat = Y_hat.argmax(axis=1)
    end_time = time.time()
    return accuracy_score(Y_test, Y_hat), end_time - start_time