#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. Извините за поздний ответ, я на работе. Я добавлю более подробную информацию об ошибке и исправлю вопрос, когда вернусь домой.