Альфа-бета обрезка с шашками - PullRequest
0 голосов
/ 14 сентября 2011

Я бы хотел реализовать искусственный интеллект для игры в шашки. Я не должен понимать принцип отсечения альфа-бета, потому что ничего не работает !!
Мне бы хотелось, чтобы алгоритм останавливался в определенное время (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

Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 14 сентября 2011

File "player.py", line 61, in min_value и TypeError: unorderable types: NoneType() < float() - важные подсказки.Вы должны учитывать, что фактические сообщения об ошибках важнее, чем что-либо еще, что вы сказали о проблемах, с которыми вы столкнулись.

Поскольку вы не читали сообщение об ошибке, вы оставили нам угадать, какая строкастрока 61.

Существуют некоторые сравнения (т. е. min(), if v <= alpha) в этой функции, которые кажутся актуальными.

В сообщении об ошибке указывается, что v равно None,

Поскольку v может происходить из значения return self.evaluation(move, CELL_OWN), похоже, self.evaluation возвращает None.Это часто происходит из-за отсутствия return или return без выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...