62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
from tugo.rl import experience
|
|
from tugo.game_logic import scoring
|
|
from tugo.game_logic import goboard_fast as goboard
|
|
from tugo.game_logic.gotypes import Player
|
|
|
|
from collections import namedtuple
|
|
|
|
|
|
class GameRecord(namedtuple('GameRecord', 'moves winner margin')):
|
|
pass
|
|
|
|
|
|
def simulate_game(black_player, white_player):
|
|
moves = []
|
|
game = goboard.GameState.new_game(19)
|
|
agents = {
|
|
Player.black: black_player,
|
|
Player.white: white_player,
|
|
}
|
|
while not game.is_over():
|
|
next_move = agents[game.next_player].select_move(game)
|
|
moves.append(next_move)
|
|
game = game.apply_move(next_move)
|
|
|
|
game_result = scoring.compute_game_result(game)
|
|
# print(game_result)
|
|
|
|
return GameRecord(
|
|
moves=moves,
|
|
winner=game_result.winner,
|
|
margin=game_result.winning_margin,
|
|
)
|
|
|
|
|
|
def experience_simulation(num_games, agent1, agent2, progress_callback=None):
|
|
collectors = [experience.ExperienceCollector() for _ in range(2)]
|
|
agents = [agent1, agent2]
|
|
|
|
color1 = Player.black
|
|
for i in range(num_games):
|
|
for collector, agent in zip(collectors, agents):
|
|
collector.begin_episode()
|
|
agent.set_collector(collector)
|
|
|
|
if color1 == Player.black:
|
|
black_player, white_player = agent1, agent2
|
|
else:
|
|
white_player, black_player = agent2, agent1
|
|
game_record = simulate_game(black_player, white_player)
|
|
|
|
winner_reward = 1 if game_record.winner == color1 else -1
|
|
for collector in collectors:
|
|
collector.complete_episode(reward=winner_reward)
|
|
winner_reward *= -1
|
|
|
|
color1 = color1.other
|
|
|
|
if progress_callback:
|
|
progress_callback()
|
|
|
|
return experience.combine_experience(collectors)
|