Rework Heuristics

This commit is contained in:
Yorick Barbanneau 2023-12-17 22:16:43 +01:00
parent 437f05c8b2
commit 9a4febaaf4

View file

@ -17,28 +17,41 @@ class ScoreHeuristicEngine(HeuristicEngine):
class WeightHeuristicEngine(HeuristicEngine):
def __init__(self, logger, options):
super().__init__(logger, options)
self.weights = self._get_weight_array()
self.logger.debug("{}".format(self.show_weights()))
def get(self, board, player):
score = self.get_weight(board, player)
return score
def get_weight(self, board, player):
score = 0
size = board.get_board_size()
weights = self._get_weight_array(size)
for pos_x in range(size):
for pos_y in range(size):
if board._board[pos_x][pos_y] == player:
score += weights[pos_x][pos_y]
else:
score -= weights[pos_x][pos_y]
size = self.options['size']
w = [[ 0 for _ in range(size)] for _ in range(size)]
for pos_x in range(self.options['size']):
for pos_y in range(self.options['size']):
p = board._board[pos_x][pos_y]
if p == player:
score += self.weights[pos_x][pos_y]
w[pos_x][pos_y] = self.weights[pos_x][pos_y]
elif p != player and p != board._EMPTY:
score -= self.weights[pos_x][pos_y]
w[pos_x][pos_y] = -self.weights[pos_x][pos_y]
return score
def _get_weight_array(self, size):
def _get_weight_array(self):
size = self.options['size']
w = [[ 0 for _ in range(size)] for _ in range(size)]
padding = size // 5
center = size // 2
for pos_y in range(size):
for pos_x in range(size):
full_range = range(self.options['size'])
center_range = range(center - padding, center + padding)
for pos_y in full_range:
for pos_x in full_range:
# Elements in the corner
if pos_x in [0, size -1] and pos_y in [0,size - 1]:
@ -49,10 +62,35 @@ class WeightHeuristicEngine(HeuristicEngine):
w[pos_x][pos_y] = self.options['weight'][1]
# Element the center
elif pos_x in range( center - padding, center + padding) and pos_y in range(center - padding, center + padding):
elif pos_x in center_range and pos_y in center_range:
w[pos_x][pos_y] = self.options['weight'][0]
return w
def show_weights(self):
display = "\n |"
for x in range(self.options['size']):
display += "{:^3}|".format(x)
display += "\n"
for x in range(self.options['size']):
display += "{:^3}|".format(str(x))
for y in range(self.options['size']):
display += "{:^3}|".format(self.weights[x][y])
display += "\n"
return display
@staticmethod
def show_weight_score(weights, size):
display = "\n |"
for x in range(size):
display += "{:^3}|".format(x)
display += "\n"
for x in range(size):
display += "{:^3}|".format(str(x))
for y in range(size):
display += "{:^3}|".format(weights[x][y])
display += "\n"
return display
class FullHeuristicEngine(WeightHeuristicEngine):
def get(self, board, player):