Я бы хотел реализовать искусственный интеллект для игры в шашки. Я не должен понимать принцип отсечения альфа-бета, потому что ничего не работает !!
Мне бы хотелось, чтобы алгоритм останавливался в определенное время (5 или 10 секунд). Но я думаю, что с моим алгоритмом это никогда не останавливается. Кроме того, алгоритм никогда не режет ветку.
EDIT:
У меня есть эти ошибки:
File "player.py", line 61, in min_value
v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
File "player.py", line 44, in max_value
v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
File "player.py", line 61, in min_value
[...]
File "player.py", line 61, in min_value
v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
File "player.py", line 44, in max_value
v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
File "player.py", line 61, in min_value
TypeError: unorderable types: NoneType() < float()
Если бы кто-то мог четко объяснить процесс реализации, я был бы очень благодарен.
Вот что я написал с python:
Функция «оценка» дает значение относительно положения фигуры на доске.
def calc_move(self, pBoard, pDue):
score =0
validMoves = pBoard.find_possible_moves(CELL_OWN)
for move in validMoves:
pBoard.do_move(move)
score_move = self.max_value(pBoard, move, pDue, -float('inf'), float('inf'))
if score_move > score:
score = score_move
best_move = move
return best_move
def max_value(self, pBoard, move, pDue, alpha, beta):
if pDue - time.time() < 0.5 or move.is_EOG():
return self.evaluation(move, CELL_OWN)
v = -float('inf')
validMoves = pBoard.find_possible_moves(CELL_OWN)
for single_move in validMoves:
pBoard.do_move(single_move)
v = max(v, self.min_value(pBoard, single_move, pDue, alpha, beta))
if v >= beta:
return v
alpha = max(alpha, v)
return v
def min_value(self, pBoard, move, pDue, alpha, beta):
if pDue - time.time() < 0.5 or move.is_EOG():
return self.evaluation(move, CELL_OTHER)
v = float('inf')
validMoves = pBoard.find_possible_moves(CELL_OTHER)
for single_move in validMoves:
pBoard.do_move(single_move)
v = min(v, self.max_value(pBoard, single_move, pDue, alpha, beta))
if v <= alpha:
return v
beta = min(beta, v)
return v
Спасибо за вашу помощь.