Я использовал библиотеку python NEAT для этой программы. Змея может видеть в 8 направлениях, в каждом направлении она ищет, есть ли там еда или стена, или сама себя и расстояние. Всего получается (8x3) 24 входа. Однако программа не показывает никаких улучшений, а только кажется, что со временем становится только хуже. максимальный результат в архиве - 2, это только в 3-м или 4-м поколении, вот и все.
Вот файл конфигурации
[NEAT]
fitness_criterion = max
fitness_threshold = 100000000000000000000000000000
pop_size = 1000
reset_on_extinction = True
[DefaultGenome]
# node activation options
activation_default = sigmoid
activation_mutate_rate = 0.05
activation_options = sigmoid gauss
# node aggregation options
aggregation_default = random
aggregation_mutate_rate = 0.05
aggregation_options = sum product min max mean median maxabs
# node bias options
bias_init_mean = 0.05
bias_init_stdev = 1.0
bias_max_value = 30.0
bias_min_value = -30.0
bias_mutate_power = 0.1
bias_mutate_rate = 0.02
bias_replace_rate = 0.1
# genome compatibility options
compatibility_disjoint_coefficient = 1.0
compatibility_weight_coefficient = 0.5
# connection add/remove rates
conn_add_prob = 0.5
conn_delete_prob = 0.1
# connection enable options
enabled_default = True
enabled_mutate_rate = 0.2
feed_forward = True
#initial_connection = unconnected
initial_connection = partial_nodirect 0.5
# node add/remove rates
node_add_prob = 0.5
node_delete_prob = 0.5
# network parameters
num_hidden = 0
num_inputs = 24
num_outputs = 4
# node response options
response_init_mean = 1.0
response_init_stdev = 0.05
response_max_value = 30.0
response_min_value = -30.0
response_mutate_power = 0.1
response_mutate_rate = 0.05
response_replace_rate = 0.1
# connection weight options
weight_init_mean = 0.1
weight_init_stdev = 1.0
weight_max_value = 30
weight_min_value = -30
weight_mutate_power = 0.5
weight_mutate_rate = 0.05
weight_replace_rate = 0.1
[DefaultSpeciesSet]
compatibility_threshold = 2.5
[DefaultStagnation]
species_fitness_func = max
max_stagnation = 50
species_elitism = 0
[DefaultReproduction]
elitism = 1
survival_threshold = 0.3
и вот как я рассчитываю фитнес:
if snake.score < 2:
ge[x].fitness = math.floor(snake.life_time * snake.life_time) * math.pow(2, snake.score)
else:
ge[x].fitness = math.floor(snake.life_time * snake.life_time)
ge[x].fitness *= math.pow(2, 10)
ge[x].fitness *= (snake.score - 1)
может ли кто-нибудь сказать мне, какие изменения мне нужно внести, чтобы он работал?