MLE-Pacman/GenTunic/gen_tuning.py

64 lines
2.0 KiB
Python

import math
import time
from matplotlib import pyplot as plt
import numpy as np
from GenTunic.gen_math import project_bit
from GenTunic.gen_util import calc_population_fitness, create_population, crossover, mutation, turnament_selection
POPULATIUON_SIZE = 200
MUTATION_RATE = 0.05
CROSSOVER_RATE = 0.65
GEN_SIZE = 8 * 3
THRESHOLD = 0.5
def gen_tuning_main(AMOUNT_TRIES, AMOUNT_RUNS, REWARD_ON_WIN, REWARD_ON_LOSE):
start_time = time.time()
population = create_population(POPULATIUON_SIZE, GEN_SIZE)
best_fintess_values = []
best_fitness = 0
while True:
#? Calc fitness
population_propability, fintess_values = calc_population_fitness(population, AMOUNT_TRIES, AMOUNT_RUNS, REWARD_ON_WIN, REWARD_ON_LOSE)
_, best_fitness = fintess_values
best_fintess_values.append(best_fitness)
print(best_fitness)
if best_fitness > THRESHOLD:
print("Breaking")
break
#? Selection
amount_selections = math.floor((1 - CROSSOVER_RATE) * len(population_propability))
amount_crossover = POPULATIUON_SIZE - amount_selections
new_population = turnament_selection(population_propability, amount_selections)
#? Crossover
new_population = crossover(population_propability, new_population, amount_crossover, GEN_SIZE)
#? Mutation
population = mutation(new_population, MUTATION_RATE, GEN_SIZE)
population_propability, fintess_values = calc_population_fitness(population, AMOUNT_TRIES, AMOUNT_RUNS, REWARD_ON_WIN, REWARD_ON_LOSE)
best_fintess_index, best_fitness = fintess_values
print("\n=== BEST PARAMETERS ===")
gen = population[best_fintess_index]["population"]
parameter_names = ["Alpha: ", "Epsilon: ", "Gamma: "]
parameters = [project_bit(x) for x in np.split(gen, 3)]
for index, name in enumerate(parameter_names):
print(f"{name}{parameters[index]}")
time_amount = time.time() - start_time
print(f"\nTook {time_amount}s")
plt.plot(best_fintess_values)
plt.show()