Алгоритм Negamax с альфа-бета и поиском в режиме ожидания с командами (4 игрока)

#python #alpha-beta-pruning #negamax

#python #альфа-бета-обрезка #negamax

Вопрос:

Эй, я пытаюсь реализовать negamax с альфа-бета-версией и поиском в режиме ожидания с 4 игроками, но это немного по-другому. Например, допустим 0 = Red , 1 = Blue , 2 = Yellow , и 3 = Green , и красный и зеленый находятся в одной команде, что означает, что 2 хода будут максимизирующими, а 2 хода будут минимизирующими. Вот моя реализация, основанная на вики.

 def search(self, position, alpha, beta, depth, root=True):
    self.nodes  = 1
    best_move = []
    if position in self.history and not root: return 0 # prevent a three-fold repetition moves when the engine is winning.
    bestscore = -999999
    if depth == 0 or position.is_final: return self.quiesce(position, alpha, beta)
    for move in position.moves():
        if position.turn in (0, 2): score = -self.search(position.move(move), -beta, -alpha, depth - 1, False)
        else: score = self.search(position.move(move), alpha, beta, depth - 1, False)
        if score >= beta: return score # fail-soft beta-cutoff
        if score > bestscore:
            bestscore = score
            if root: best_move = move
            if score > alpha: alpha = score
    if not root: return bestscore
    else: return best_move

def quiesce(self, position, alpha, beta):
    if position.is_final: return position.score   position.value() # this position is final so just return the evaluation.
    stand_pat = position.score   position.value()
    if stand_pat >= beta: return beta
    if alpha < stand_pat: alpha = stand_pat
    for move in position.moves():
        if move[2] != 1: continue # continue through the moves until we encounter another capture.
        if position.turn in (0, 2): score = -self.quiesce(position.move(move), -beta, -alpha)
        else: score = self.quiesce(position.move(move), alpha, beta)
        if score >= beta: return beta
        if score > alpha: alpha = score
    return alpha
  

Похоже, это работает неправильно, я подумал, что если следующий игрок, который будет двигаться, будет в моей команде, нам не следует переключать альфа и бета и просто не менять значение. Любые предложения по поводу того, что я делаю неправильно.

Комментарии:

1. Я полагаю, это для шахмат? Было бы неплохо немного больше контекста — почему мы имеем дело с командами?

2. Потому что chess.com имеет шахматы для 4 игроков, и это было бы непросто для меня, так как я могу создать обычный шахматный движок на Python.

3. Хорошо, итак, как именно работают шахматы для 4 игроков? Пожалуйста, опишите проблему, которую вы решаете здесь. Что именно не работает? Я вижу [нет проблемного контекста или ожидаемого результата] [дамп кода, вырванный из контекста] [не работает], поэтому я уверен, что вам нужно будет предоставить больше информации людям, которые хотят помочь.

4. Я не понимаю разницы для ki. Это похоже на игру с двумя игроками, но генератор ходов дает ki только ходы игрока, который находится на ходу. В самом ki нечего менять.

5. Извините за поздний ответ, я на работе. Я добавлю более подробную информацию об ошибке и исправлю вопрос, когда вернусь домой.