def look_best_future(board, pf, times=0): if times == 0: max_prize_1 = [] possb = [game.up_possible(board),game.down_possible(board),game.left_possible(board),game.right_possible(board)] for i in range(4): if possb[i] == 1: y = copy.deepcopy(board) y = action(y,i) max_prize_1.append(get_prize(y, pf)) else: max_prize_1.append(0) return max_prize_1 else: max_prize = 0 move = -1 possb = [game.up_possible(board),game.down_possible(board),game.left_possible(board),game.right_possible(board)] for i in range(4): if possb[i] == 1: y = copy.deepcopy(board) y = action(y,i) y = populate_all_possible(y) max_prize_2 = 0 for j in y: prize = look_best_future(j, pf, times-1) prize = max(prize) if prize > max_prize_2: max_prize_2 = prize if max_prize_2 >= max_prize: max_prize = max_prize_2 move = i return move
def eval_genomes(genomes, config): for genome_id, genome in genomes: net = neat.nn.recurrent.RecurrentNetwork.create(genome, config) x = game.start_game() possb = [game.up_possible(x),game.down_possible(x),game.left_possible(x),game.right_possible(x)] y = [0 for i in range(16)] y = game.matrix_to_vector(x) death = 1 death_flag = 0 while possb != [0,0,0,0]: output = net.activate(format_input(x)) x = action(output, x) if game.matrix_to_vector(x) == y: if death_flag == 0: death = -3 death_flag = 1 else: death += 1 else: # print("not equal! \n") # print(game.matrix_to_vector(x), y) death = 1 death_flag = 0 y = game.matrix_to_vector(x) if death == 0: break scr = game.score(x) genome.fitness = scr possb = [game.up_possible(x),game.down_possible(x),game.left_possible(x),game.right_possible(x)]
def eval_fitness(genomes, config): for idx, g in genomes: cppn = neat.nn.FeedForwardNetwork.create(g, config) network = ESNetwork(substrate, cppn, params) net = network.create_phenotype_network() fitnesses = [] for i in range(trials): x = game.start_game() possb = [ game.up_possible(x), game.down_possible(x), game.left_possible(x), game.right_possible(x) ] scr = 0 y = [0 for z in range(16)] y = game.matrix_to_vector(x) death = 1 death_flag = 0 net.reset() for j in range(max_steps): for k in range(network.activations): o = net.activate(format_input(x)) x = action(np.argmax(o), x) if game.matrix_to_vector(x) == y: if death_flag == 0: death = -3 death_flag = 1 else: death += 1 else: death = 1 death_flag = 0 y = game.matrix_to_vector(x) if death == 0: break scr = game.score(x) possb = [ game.up_possible(x), game.down_possible(x), game.left_possible(x), game.right_possible(x) ] if possb == [0, 0, 0, 0]: break fitnesses.append(scr) g.fitness = np.array(fitnesses).mean()
def run(pf): x = game.start_game() prev_x = copy.deepcopy(x) possb = [game.up_possible(x),game.down_possible(x),game.left_possible(x),game.right_possible(x)] while possb != [0,0,0,0]: temp = copy.deepcopy(x) move = look_avg_future(temp, pf, 0) move = move.index(max(move)) if(possb[move]==1): x = action(x,move) x = game.populate(x) # game.print_board(x) # print("maxtile: ",game.maxtile(x)) if prev_x == x: print("breaking ###################################################################################################################################################") break else: prev_x = x # game.print_board(x) # print(possb) possb = [game.up_possible(x),game.down_possible(x),game.left_possible(x),game.right_possible(x)] print("maxtile: ", game.maxtile(x)) return game.score(x)
def look_avg_future(board, pf, times=0): if times == 0: max_prize_1 = [] possb = [game.up_possible(board),game.down_possible(board),game.left_possible(board),game.right_possible(board)] for i in range(4): if possb[i] == 1: y = copy.deepcopy(board) y = action(y,i) max_prize_1.append(get_prize(y, pf)) else: max_prize_1.append(-100000000) return max_prize_1 else: max_prize = 0 move = -1 possb = [game.up_possible(board),game.down_possible(board),game.left_possible(board),game.right_possible(board)] for i in range(4): if possb[i] == 1: y = copy.deepcopy(board) y = action(y,i) y2 = populate_all_possible2(y) y4 = populate_all_possible4(y) prizes = [] for j in y2: prize = look_avg_future(j, pf, times-1) prize = max(prize) prizes.append(prize) for j in y4: prize = look_avg_future(j, pf, times-1) prize = max(prize)/10 prizes.append(prize) avg_prize = sum(prizes)/len(prizes) if avg_prize >= max_prize: max_prize = avg_prize move = i return move