示例#1
0
    def _expansion_evaluation(self, leaf_id, win_index):
        leaf_state = utils.get_state_pt(leaf_id, self.board_size,
                                        self.inplanes)
        self.model.eval()
        with torch.no_grad():
            state_input = torch.tensor([leaf_state]).to(device).float()
            policy, value = self.model(state_input)
            policy = policy.cpu().numpy()[0]
            value = value.cpu().numpy()[0]

        if win_index == 0:
            # expansion
            actions = utils.legal_actions(leaf_id, self.board_size)
            prior_prob = np.zeros(self.board_size**2)

            # re-nomalization
            for action_index in actions:
                prior_prob[action_index] = policy[action_index]

            prior_prob /= prior_prob.sum()

            if self.noise:
                # root node noise
                if leaf_id == self.root_id:
                    noise_probs = np.random.dirichlet(self.alpha *
                                                      np.ones(len(actions)))

            for i, action_index in enumerate(actions):
                child_id = leaf_id + (action_index, )

                prior_p = prior_prob[action_index]

                if self.noise:
                    if leaf_id == self.root_id:
                        prior_p = 0.75 * prior_p + 0.25 * noise_probs[i]

                self.tree[child_id] = {
                    'child': [],
                    'n': 0.,
                    'w': 0.,
                    'q': 0.,
                    'p': prior_p
                }

                self.tree[leaf_id]['child'].append(action_index)
            # return value
            reward = False
            return value, reward
        else:
            # terminal node
            # return reward
            reward = 1.
            value = False
            return value, reward
示例#2
0
    def _expansion_evaluation(self, leaf_id, win_index):
        # 최근 몇턴간의 one hot 인코딩된 흑돌의 위치와 one hot 인코딩된 백돌의 위치, 그리고 색깔 정보
        leaf_state = utils.get_state_pt(leaf_id, self.board_size,
                                        self.inplanes)
        self.model.eval()  # 드롭아웃 및 배치 정규화를 평가 모드로 설정
        with torch.no_grad():  # Tensor로 부터의 기록 추적과 메모리 사용 방지
            state_input = torch.tensor([
                leaf_state
            ]).to(device).float()  # 지정한 디바이스에 새로운 Tensor 인스턴스 생성
            policy, value = self.model(state_input)  # 모델에 Tensor 적용
            policy = policy.cpu().numpy()[0]  # policy : 승리가능성이 높을수록 높게 책정된다
            value = value.cpu().numpy()[
                0]  # value : (-1 ~ 1) 마지막 턴 플레이어의 승리 가능성이 높으면 낮은 값을 반환

        if win_index == 0:  # 승패가 결정되지 않은 경우
            # expansion
            actions = utils.legal_actions(
                leaf_id, self.board_size)  # 잎 노드의 보드 상황에서 모든 가능한 착수 위치
            prior_prob = np.zeros(
                self.board_size**2)  # policy의 정규화 값이 저장될 array

            # re-nomalization
            for action_index in actions:
                prior_prob[action_index] = policy[action_index]

            prior_prob /= prior_prob.sum()

            if self.noise:  # 노이즈 생성
                # root node noise
                if leaf_id == self.root_id:
                    noise_probs = np.random.dirichlet(self.alpha *
                                                      np.ones(len(actions)))

            # 잎 노드에서 착수 가능한 위치에 해당하는 자식 노드 생성
            for i, action_index in enumerate(actions):
                child_id = leaf_id + (action_index, )

                prior_p = prior_prob[action_index]

                if self.noise:
                    if leaf_id == self.root_id:
                        prior_p = 0.75 * prior_p + 0.25 * noise_probs[i]

                # 트리에 자식 노드 추가
                self.tree[child_id] = {
                    'child': [],
                    'n': 0.,
                    'w': 0.,
                    'q': 0.,
                    'p': prior_p
                }

                self.tree[leaf_id]['child'].append(
                    action_index)  # 잎 노드의 child 밸류 수정
            # return value
            reward = False
            return value, reward
        else:  # 게임의 승패가 결정됐을 때
            # terminal node
            # return reward
            reward = 1.
            value = False
            return value, reward