backgammon/bot.py

78 lines
2.4 KiB
Python

from cup import Cup
import tensorflow as tf
from network import Network
import numpy as np
from board import Board
import subprocess
import random
import sys
class Bot:
def __init__(self, sym, config = None):
self.config = config
self.cup = Cup()
self.sym = sym
self.graph = tf.Graph()
with self.graph.as_default():
self.session = tf.Session()
self.network = Network(self.session, config)
self.network.restore_model()
def roll(self):
print("{} rolled: ".format(self.sym))
roll = self.cup.roll()
# print(roll)
return roll
def switch(self,cur):
return -1 if cur == 1 else 1
def restore_model(self):
with self.graph.as_default():
self.network.restore_model()
def get_session(self):
return self.session
def get_sym(self):
return self.sym
def get_network(self):
return self.network
def make_random_move(self, board, sym, roll):
legal_moves = Board.calculate_legal_states(board, sym, roll)
return random.choice(list(legal_moves))
# TODO: Test this, the score results should be deterministic
def make_pubeval_move(self, board, sym, roll):
legal_moves = Board.calculate_legal_states(tuple(board), sym, roll)
moves_and_scores = []
for board in legal_moves:
call_argument = ["./pubeval/pubeval"]
for x in Board.board_features_to_pubeval(board, sym):
call_argument.append(str(x))
data = subprocess.check_output(call_argument)
moves_and_scores.append([board, float(bytes.decode(data))])
scores = [ x[1] for x in moves_and_scores ]
best_move_pair = moves_and_scores[np.array(scores).argmax()]
return best_move_pair
def make_move(self, board, sym, roll):
# print(Board.pretty(board))
legal_moves = Board.calculate_legal_states(board, sym, roll)
moves_and_scores = [ (move, self.network.eval_state(np.array(move).reshape(1,26))) for move in legal_moves ]
scores = [ x[1] for x in moves_and_scores ]
best_move_pair = moves_and_scores[np.array(scores).argmax()]
#print("Found the best state, being:", np.array(move_scores).argmax())
return best_move_pair