에이전트 자체 구현을 시작하기 전에 사용할 환경을 숙지하고 그 위에 사용자 지정 래퍼를 만들어 훈련 중에 에이전트와 상호 작용할 수 있도록 해야 했습니다.
kaggle_environments 라이브러리의 체스 환경을 사용했습니다.
from kaggle_environments import make env = make("chess", debug=True)
또한 체스 게임을 구문 분석하고 검증하는 데 도움이 되는 경량 Python 라이브러리인 Chessnut을 사용했습니다.
from Chessnut import Game initial_fen = env.state[0]['observation']['board'] game=Game(env.state[0]['observation']['board'])
보드의 모든 말과 현재 활동 중인 플레이어를 간결하게 표현하는 방법을 제공합니다. 하지만 입력을 신경망에 공급할 계획이었기 때문에 상태 표현을 수정해야 했습니다.
보드에는 12가지 유형의 조각이 있으므로 각 유형의 상태를 보드에 표현하기 위해 8x8 그리드의 12채널을 만들었습니다.
class EnvCust: def __init__(self): self.env = make("chess", debug=True) self.game=Game(env.state[0]['observation']['board']) print(self.env.state[0]['observation']['board']) self.action_space=game.get_moves(); self.obs_space=(self.env.state[0]['observation']['board']) def get_action(self): return Game(self.env.state[0]['observation']['board']).get_moves(); def get_obs_space(self): return fen_to_board(self.env.state[0]['observation']['board']) def step(self,action): reward=0 g=Game(self.env.state[0]['observation']['board']); if(g.board.get_piece(Game.xy2i(action[2:4]))=='q'): reward=7 elif g.board.get_piece(Game.xy2i(action[2:4]))=='n' or g.board.get_piece(Game.xy2i(action[2:4]))=='b' or g.board.get_piece(Game.xy2i(action[2:4]))=='r': reward=4 elif g.board.get_piece(Game.xy2i(action[2:4]))=='P': reward=2 g=Game(self.env.state[0]['observation']['board']); g.apply_move(action) done=False if(g.status==2): done=True reward=10 elif g.status == 1: done = True reward = -5 self.env.step([action,'None']) self.action_space=list(self.get_action()) if(self.action_space==[]): done=True else: self.env.step(['None',random.choice(self.action_space)]) g=Game(self.env.state[0]['observation']['board']); if g.status==2: reward=-10 done=True self.action_space=list(self.get_action()) return self.env.state[0]['observation']['board'],reward,done
이 래퍼의 요점은 에이전트에 대한 보상 정책과 훈련 중 환경과 상호 작용하는 데 사용되는 단계 함수를 제공하는 것이었습니다.
체스넛은 현재 보드 상태에서 가능한 합법적인 수와 같은 정보를 얻는 데 유용하고 게임 중에 체크메이트를 인식하는 데도 유용했습니다.
장군과 적의 말을 빼앗는 데에는 긍정적인 점수를 주고, 게임에서 지면 부정적인 점수를 주는 보상 정책을 만들려고 노력했습니다.
Replay Buffer는 훈련 기간 동안 Q-Network의 출력(state,action,reward,next state)을 저장하기 위해 사용되며 나중에 Target Network의 역전파를 위해 무작위로 사용됩니다
Chessnut은 'a2a3'과 같은 UCI 형식으로 법적 조치를 반환하지만 신경망과 상호작용하기 위해 기본 패턴을 사용하여 각 조치를 고유한 인덱스로 변환했습니다. 총 64개의 사각형이 있으므로 각 동작마다 고유 인덱스를 64*64개로 두기로 했습니다.
64*64 동작이 모두 합법적인 것은 아니지만 체스넛을 사용하면 합법성을 처리할 수 있었고 패턴도 충분히 간단했습니다.
from kaggle_environments import make env = make("chess", debug=True)
이 신경망은 컨볼루션 레이어를 사용하여 12개 채널 입력을 받아들이고 유효한 작업 인덱스를 사용하여 보상 출력 예측을 필터링합니다.
from Chessnut import Game initial_fen = env.state[0]['observation']['board'] game=Game(env.state[0]['observation']['board'])
이것은 분명히 실제로 잘 수행될 가능성이 전혀 없는 매우 기본적인 모델이었지만(그리고 그렇지 않았습니다) DQN이 어떻게 더 잘 작동하는지 이해하는 데 도움이 되었습니다.
위 내용은 DQN을 사용하여 체스 에이전트 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!