Implement heuristics classes
This commit is contained in:
parent
3784faeaed
commit
a1812aaedf
3 changed files with 63 additions and 38 deletions
|
@ -1,12 +1,30 @@
|
|||
class ReversiHeuristic():
|
||||
def __init__(self, logger, weight = [1, 2, 10, 20]):
|
||||
class HeuristicEngine:
|
||||
def __init__(self, logger, options):
|
||||
self.logger = logger
|
||||
self.weight = weight
|
||||
self.options = options
|
||||
self.logger.info("Heuristic engine {}, options:{}".format(
|
||||
self.__class__.__name__,
|
||||
self.options
|
||||
))
|
||||
|
||||
def get():
|
||||
raise NotImplementedError
|
||||
|
||||
class ScoreHeuristicEngine(HeuristicEngine):
|
||||
def get(board):
|
||||
return board.heuristique()
|
||||
|
||||
|
||||
class WeightHeuristicEngine(HeuristicEngine):
|
||||
|
||||
def get(self, board):
|
||||
size = board.get_board_size()
|
||||
score = get_weight(board)
|
||||
return score
|
||||
|
||||
def get_weight(self, board):
|
||||
score = 0
|
||||
weights = self._get_weight(size)
|
||||
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] == board._nextPlayer:
|
||||
|
@ -14,25 +32,28 @@ class ReversiHeuristic():
|
|||
else:
|
||||
score -= weights[pos_x][pos_y]
|
||||
return score
|
||||
|
||||
def _get_weight(self, size):
|
||||
w = [[ 0 for _ in range(size)] for _ in range(size)]
|
||||
|
||||
def _get_weight_array(self, 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):
|
||||
|
||||
# Elements in the corner
|
||||
if pos_x in [0, size -1] and pos_y in [0,size - 1]:
|
||||
w[pos_x][pos_y] = self.weight[3]
|
||||
w[pos_x][pos_y] = self.weight[2]
|
||||
|
||||
# Elements on the border
|
||||
elif pos_x in [0, size -1] or pos_y in [0, size -1]:
|
||||
w[pos_x][pos_y] = self.weight[2]
|
||||
w[pos_x][pos_y] = self.weight[1]
|
||||
|
||||
# Element the center
|
||||
elif pos_x in range( int(size // 2 - 2), size // 2 + 2) and pos_y in range( size // 2 - 2, size // 2 + 2):
|
||||
w[pos_x][pos_y] = self.weight[1]
|
||||
|
||||
else:
|
||||
elif pos_x in range( center - padding, center + padding) and pos_y in range(center - padding, center + padding):
|
||||
w[pos_x][pos_y] = self.weight[0]
|
||||
return w
|
||||
|
||||
class FullHeuristicEngine(WeightHeuristicEngine):
|
||||
|
||||
def get(self, board):
|
||||
return self.get_weight(board) + board.heuristique()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue