Exemplo n.º 1
0
def select_action_by_rule(state):
    valid_hands = get_complete_hand(str(
        state.curr_cards)) if state.prev_hand.size() == 0 else get_beat_hand(
            str(state.prev_hand), str(state.curr_cards))
    valid_hands = valid_hands.split(" ")
    valid_hands = [
        CardSet.parse_from("")
        if valid_hand == "x" else CardSet.parse_from(valid_hand)
        for valid_hand in valid_hands
    ]

    # sorted by split card length
    left_cards = [
        CardSet.diff(state.curr_cards, valid_hand)
        for valid_hand in valid_hands
    ]
    split_lens = [
        0 if left_card.size() == 0 else len(
            get_simple_hand(str(left_card)).split(" "))
        for left_card in left_cards
    ]

    hands_with_lens = list(zip(valid_hands, split_lens))
    min_split_len = min(hands_with_lens, key=lambda tpl: tpl[1])
    min_split_len_hands = [
        hand_with_len[0] for hand_with_len in hands_with_lens
        if hand_with_len[1] == min_split_len[1]
    ]

    if len(min_split_len_hands) == 1:
        return min_split_len_hands[0]

    # sorted by left card length
    left_len = [(hand, 0 if CardSet.diff(state.curr_cards, hand).size() == 0
                 else len(str(CardSet.diff(state.curr_cards, hand))))
                for hand in min_split_len_hands]
    min_left_len = min(left_len, key=lambda tpl: tpl[1])
    min_left_len_hands = [
        hand for hand, length in left_len if length == min_left_len[1]
    ]

    if len(min_left_len_hands) == 1:
        return min_left_len_hands[0]

    # sorted by hand rank
    card_hands = [
        CardHand.parse_from('' if str(hand) == 'x' else str(hand))
        for hand in min_left_len_hands
    ]
    sorted_by_rank = sorted(card_hands, key=cmp_to_key(card_hand_compare))
    return sorted_by_rank[0].card_set
Exemplo n.º 2
0
    def expand(self):
        if self.state.curr_cards.size() == 0 or self.state.next_cards.size(
        ) == 0:
            return False

        valid_hands = get_complete_hand(str(
            self.state.curr_cards)) if self.state.prev_hand.size(
            ) == 0 else get_beat_hand(str(self.state.prev_hand),
                                      str(self.state.curr_cards))
        valid_hands = [
            CardSet.parse_from("")
            if valid_hand == "x" else CardSet.parse_from(valid_hand)
            for valid_hand in valid_hands.split(" ")
        ]

        next_states = [
            MCTSState(1 - self.state.player, self.state.next_cards,
                      CardSet.diff(self.state.curr_cards, valid_hand),
                      valid_hand, False if valid_hand.nonempty() else True)
            for valid_hand in valid_hands
        ]

        self.children = [
            MCTSNode(self, next_state) for next_state in next_states
        ]

        pn_scores = self._get_pn_scores()
        vn_scores = self._get_vn_scores()
        for child, pn_score, vn_score in zip(self.children, pn_scores,
                                             vn_scores):
            child.P = pn_score
            child.V = vn_score

        return True
Exemplo n.º 3
0
    def rollout(state):
        # valid_hand = select_action_by_rule(state)
        valid_hand = select_action_by_policy(state)
        # print "%s: %s" % ("dz" if state.player == 1 else "nm", str(valid_hand))

        left_cards = CardSet.diff(state.curr_cards, valid_hand)
        if left_cards.size() == 0:
            # print "%s win" % ("dz" if state.player == 1 else "nm")
            return 1.0 if state.player == 1 else -1.0

        next_state = MCTSState(1 - state.player, state.next_cards, left_cards,
                               valid_hand,
                               False if state.prev_hand.nonempty() else True)

        return MCTSNode.rollout(next_state)