Open drizzt00s opened 3 years ago
bro take this import tensorflow as tf import numpy as np import cv2 import neat import pickle import retro import os
game_name = input("Enter the game name: ") level_name = input("Enter the level name: ")
env = retro.make(game_name, level_name)
def preprocess_frame(frame):
frame = cv2.resize(frame, (int(frame.shape[1]/8), int(frame.shape[0]/8)))
# Convert the frame to grayscale
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Reshape the frame
frame = np.reshape(frame, (frame.shape[0], frame.shape[1], 1))
return frame
def check_stuck(action_history, action_count_threshold):
action_counts = np.unique(action_history, return_counts=True)[1]
if action_counts.size == 0:
return False
elif action_counts.max() >= action_count_threshold:
return True
else:
return False
def eval_genomes(genomes, config): for genome_id, genome in genomes: ob = env.reset() ac = env.action_space.sample()
inx, iny, inc = env.observation_space.shape
inx = int(inx/8)
iny = int(iny/8)
net = neat.nn.recurrent.RecurrentNetwork.create(genome, config)
current_max_fitness = 0
fitness_current = 0
frame = 0
counter = 0
xpos = 0
xpos_max = 0
action_history = []
done = False
while not done:
env.render()
frame += 1
ob = preprocess_frame(ob)
imgarray = np.ndarray.flatten(ob)
nnOutput = net.activate(imgarray.astype(np.float32))
ob, rew, done, info = env.step(nnOutput)
fitness_current += rew
# Penalize the fitness score if the AI is stuck in a particular position
if check_stuck(action_history, 30):
fitness_current -= 10
action_history.append(np.argmax(nnOutput))
if fitness_current > current_max_fitness:
current_max_fitness = fitness_current
counter = 0
else:
counter += 1
if counter == 250:
done = True
if done:
done = True
print(genome_id, fitness_current)
genome.fitness = fitness_current
# Save the progress of the AI every 10 generations
if genome_id % 100 == 0:
with open(f'neat-checkpoint-{genome_id}.pkl', 'wb') as output:
pickle.dump((p, stats, genome), output, 1)
print(frame)
if os.path.exists('neat-checkpoint'): p = neat.Checkpointer.restore_checkpoint('neat-checkpoint') else: config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet, neat.DefaultStagnation, 'config-feedforward') p = neat.Population(config)
p.add_reporter(neat.StdOutReporter(True)) stats = neat.StatisticsReporter() p.add_reporter(stats) p.add_reporter(neat.Checkpointer(10, filename_prefix='neat-checkpoint-'))
winner = p.run(eval_genomes)
p.add_reporter(neat.StdOutReporter(True)) stats = neat.StatisticsReporter() p.add_reporter(stats) p.add_reporter(neat.Checkpointer(10, filename_prefix='neat-checkpoint-'))
winner = p.run(eval_genomes)
with open('winner.pkl', 'wb') as output: pickle.dump(winner, output, 1)
cv2.destroyAllWindows()
Issue summary
[Put a detailed description of the issue here.]
System information