안녕하세요!체스 네가 맥스 기능
체스 엔진에 대해 네가 막스 검색 알고리즘을 쓰려고하는데, 제대로 작동하지 않는 것 같습니다. 예를 들어 wikipedias pseudocode를 사용하고 있지만 어떻게 든 예상 결과가 나오지 않습니다. 내가 2의 플라이와 함께 그것을 실행하면, 그것은하지 않아야하지만, 내 보드 데이터 구조를 변경합니다. 플라이 2로 실행이 끝난 후, 모든 흰색 (또는 검은 색은 플레이어가 어떤 기능을 호출하는지에 달려 있습니다.) 폰은 시작 위치에서 2 칸 앞으로 이동합니다.
내 make와 unmake 이동 함수는 최대 5-ply까지 검색하는 비 재귀 함수를 사용하여 완벽하게 작동합니다. 그런 다음 완벽하게 작동했습니다. 내 negamax 구현에 문제가있을 것입니다.
도움 주셔서 감사합니다.
def negaMax(self, board, rules, ply, player):
""" Implements a minimax algorithm. """
if ply == 0:
return self.positionEvaluation()
self.max_eval = float('-infinity')
self.move_list = board.generateMoves(rules, player)
for self.move in self.move_list:
board.makeMove(self.move, player)
self.eval = -self.negaMax(board, rules, ply - 1, board.getOtherPlayer(player))
board.unmakeMove(self.move, player)
if self.eval > self.max_eval:
self.max_eval = self.eval
return self.max_eval
재귀 알고리즘을 사용할 때는 객체 변수 (또는 정적 변수)를 사용하지 않는 것이 좋습니다. 나는 그가 로컬 변수만을 사용하도록 알고리즘을 변환하려고 시도하고 디버깅하려고 시도했다. 나는 최소한 디버깅이 더 쉬울 것이라고 확신 할 수 있습니다. – amit
이유를 설명해 주시겠습니까? – geekkid
예. 객체 변수는 모든 재귀 적 호출에 공통적입니다. 사람이 그것을 바꿀 때 - 모두 봅니다. 코드를 훨씬 더 복잡하게 만드는 결과를 낳기는 커녕, 로컬 변수만을 사용하는 재귀 코드는 매우 자체적으로 포함되어 있으며 디버깅하기가 훨씬 쉽고 이해하기 쉽습니다. – amit