Пример #1
0
def heuristic(letters):
    """
    Input: 2D tuple or 2D list of letters
    Output: sum of frequencies plus number of meaningful words
    """
    score = 0

    for i in range(0, 3):
        # accumulate by rows
        score += ai_io.get_frequency(letters[i][0], letters[i][1])
        score += ai_io.get_frequency(letters[i][1], letters[i][2])
        if ai_io.has_meaning(letters[i][0], letters[i][1], letters[i][2]):
            # row i has meaning
            score += 1

        # accumulate by cols
        score += ai_io.get_frequency(letters[0][i], letters[1][i])
        score += ai_io.get_frequency(letters[1][i], letters[2][i])
        if ai_io.has_meaning(letters[0][i], letters[1][i], letters[2][i]):
            # column i has meaning
            score += 1

    #accumulate by diagonals
    score += ai_io.get_frequency(letters[0][0], letters[1][1])
    score += ai_io.get_frequency(letters[1][1], letters[2][2])
    if ai_io.has_meaning(letters[0][0], letters[1][1], letters[2][2]):
        # diagonal left - right has meaning
        score += 1
    score += ai_io.get_frequency(letters[0][2], letters[1][1])
    score += ai_io.get_frequency(letters[1][1], letters[2][0])
    if ai_io.has_meaning(letters[0][2], letters[1][1], letters[2][0]):
        # diagonal right - left has meaning
        score += 1

    return score
Пример #2
0
def heuristic(letters):
    """
    Input: 2D tuple or 2D list of letters
    Output: sum of frequencies plus number of meaningful words
    """
    score = 0

    for i in range(0,3):
        # accumulate by rows
        score += ai_io.get_frequency(letters[i][0], letters[i][1])
        score += ai_io.get_frequency(letters[i][1], letters[i][2])
        if ai_io.has_meaning(letters[i][0], letters[i][1], letters[i][2]):
            # row i has meaning
            score += 1

        # accumulate by cols
        score += ai_io.get_frequency(letters[0][i], letters[1][i])
        score += ai_io.get_frequency(letters[1][i], letters[2][i])
        if ai_io.has_meaning(letters[0][i], letters[1][i], letters[2][i]):
            # column i has meaning
            score += 1

    #accumulate by diagonals
    score += ai_io.get_frequency(letters[0][0], letters[1][1])
    score += ai_io.get_frequency(letters[1][1], letters[2][2])
    if ai_io.has_meaning(letters[0][0], letters[1][1], letters[2][2]):
        # diagonal left - right has meaning
        score += 1
    score += ai_io.get_frequency(letters[0][2], letters[1][1])
    score += ai_io.get_frequency(letters[1][1], letters[2][0])
    if ai_io.has_meaning(letters[0][2], letters[1][1], letters[2][0]):
        # diagonal right - left has meaning
        score += 1

    return score
Пример #3
0
def check_all(letters):
    """
    Input: 1D tuple or 1D list of letters
    Output: True of all words have meanings, False otherwise
    """
    flag = True
    letters_cp = to_two_d(letters)
    for i in range(0,3):
        # check row i and col i
        if (not ai_io.has_meaning(letters_cp[i][0], letters_cp[i][1], letters_cp[i][2]) or
            not ai_io.has_meaning(letters_cp[0][i], letters_cp[1][i], letters_cp[2][i])):
            flag = False
            break
    # check diagons
    if (not ai_io.has_meaning(letters_cp[0][0], letters_cp[1][1], letters_cp[2][2]) or
        not ai_io.has_meaning(letters_cp[0][2], letters_cp[1][1], letters_cp[2][0])):
        flag = False
    return flag
Пример #4
0
    def heuristic(self, state, index):
        """
        Input:
            'state': the current state that need to evaluate heuristic value
            'index': the index of input in 'self.inputs'
        Output:
            The heuristic value of state
        """
        score = 0

        if len(state) == 3:
            # check the first row
            if not ai_io.has_meaning(state[0], state[1], state[2]):
                # the first row has no meaning
                return 0
        elif len(state) == 6:
            # check the second row
            if not ai_io.has_meaning(state[3], state[4], state[5]):
                # the second row has no meaning
                return 0
        elif len(state) == 7:
            # check the first column and the right-left diagonal
            if (not ai_io.has_meaning(state[0], state[3], state[6])
                    or not ai_io.has_meaning(state[2], state[4], state[6])):
                # first column and the right-left diagonal have no meanings
                return 0
        elif len(state) == 8:
            # check the second column
            if not ai_io.has_meaning(state[1], state[4], state[7]):
                # the second column has no meaning
                return 0
        elif len(state) == 9:
            # check the third column, the third row and the left-right diagonal
            if (not ai_io.has_meaning(state[2], state[5], state[8])
                    or not ai_io.has_meaning(state[0], state[4], state[8])
                    or not ai_io.has_meaning(state[6], state[7], state[8])):
                # the third column, the third row and the left-right diagonal have no meanings
                return 0

        # START: Accumulate the frequency of each pair of letters in 'state'
        for i in range(1, len(state)):
            for j in AlgorithmPart2.PREVIOUS[i]:
                try:
                    # state[i] is the current letter
                    # state[j] is one of the letters that precedes state[i]
                    freq = self.freq_dicts[index][state[j] + state[i]]
                except Exception:
                    continue
                else:
                    score += freq
        # END
        return score
Пример #5
0
    def heuristic(self, state, index):
        """
        Input:
            'state': the current state that need to evaluate heuristic value
            'index': the index of input in 'self.inputs'
        Output:
            The heuristic value of state
        """
        score = 0

        if len(state) == 3:
            # check the first row
            if not ai_io.has_meaning(state[0], state[1], state[2]):
                # the first row has no meaning
                return 0
        elif len(state) == 6:
            # check the second row
            if not ai_io.has_meaning(state[3], state[4], state[5]):
                # the second row has no meaning
                return 0
        elif len(state) == 7:
            # check the first column and the right-left diagonal
            if (not ai_io.has_meaning(state[0], state[3], state[6])
                or not ai_io.has_meaning(state[2], state[4], state[6])):
                # first column and the right-left diagonal have no meanings
                return 0
        elif len(state) == 8:
            # check the second column
            if not ai_io.has_meaning(state[1], state[4], state[7]):
                # the second column has no meaning
                return 0
        elif len(state) == 9:
            # check the third column, the third row and the left-right diagonal
            if (not ai_io.has_meaning(state[2], state[5], state[8])
                or not ai_io.has_meaning(state[0], state[4], state[8])
                or not ai_io.has_meaning(state[6], state[7], state[8])):
                # the third column, the third row and the left-right diagonal have no meanings
                return 0

        # START: Accumulate the frequency of each pair of letters in 'state'
        for i in range(1, len(state)):
            for j in AlgorithmPart2.PREVIOUS[i]:
                try:
                    # state[i] is the current letter
                    # state[j] is one of the letters that precedes state[i]
                    freq = self.freq_dicts[index][state[j] + state[i]]
                except Exception:
                    continue
                else:
                    score += freq
        # END
        return score
Пример #6
0
def check_all(letters):
    """
    Input: 1D tuple or 1D list of letters
    Output: True of all words have meanings, False otherwise
    """
    flag = True
    letters_cp = to_two_d(letters)
    for i in range(0, 3):
        # check row i and col i
        if (not ai_io.has_meaning(letters_cp[i][0], letters_cp[i][1],
                                  letters_cp[i][2])
                or not ai_io.has_meaning(letters_cp[0][i], letters_cp[1][i],
                                         letters_cp[2][i])):
            flag = False
            break
    # check diagons
    if (not ai_io.has_meaning(letters_cp[0][0], letters_cp[1][1],
                              letters_cp[2][2])
            or not ai_io.has_meaning(letters_cp[0][2], letters_cp[1][1],
                                     letters_cp[2][0])):
        flag = False
    return flag
Пример #7
0
    def heuristic(self, state, index):
        score = 0

        # START: Find a list of remaining letters (letters that are not in 'state')
        letters_left = self.inputs[index][:]
        for letter in state:
            letters_left.remove(letter)
        # END

        len_state = len(state)

        if len_state == 2:
            for letter in letters_left:
                if ai_io.has_meaning(state[0], state[1], letter):
                    score += 0.001
        elif len_state == 3:
            # check the first row
            if not ai_io.has_meaning(state[0], state[1], state[2]):
                return 0
            else:
                score += 0.001
#                for letter in letters_left:
#                    now_score = score
#                    for j in AlgorithmPart3.PREVIOUS[len_state]:
#                        try:
#                            score += self.freq_dicts[index][state[j] + letter] / 10
#                        except Exception:
#                            score = now_score  # reset score
#                            break
#                if score == 0.001:
                    # there is no letter in letters_left that can go in the next position
#                    return 0
        elif len_state == 4:
            score += 0.001
#            for letter in letters_left:
#                now_score = score
#                for j in AlgorithmPart3.PREVIOUS[len_state]:
#                    try:
#                        score += self.freq_dicts[index][state[j] + letter] / 10
#                    except Exception:
#                        score = now_score  # reset score
#                        break
#            if score == 0.001:
                # there is no letter in letters_left that can go in the next position
#                return 0
        elif len_state == 5:
            for letter in letters_left:
                if ai_io.has_meaning(state[3], state[4], letter):
                    score += 0.001
        elif len_state == 6:
            # check the second row
            if not ai_io.has_meaning(state[3], state[4], state[5]):
                return 0
            else:
                for letter in letters_left:
                    if ai_io.has_meaning(state[0], state[3], letter):
                        score += 0.002
        elif len_state == 7:
            # check the first column and the right-left diagonal
            if (not ai_io.has_meaning(state[0], state[3], state[6])
                or not ai_io.has_meaning(state[2], state[4], state[6])):
                return 0
            else:
                for letter in letters_left:
                    if ai_io.has_meaning(state[1], state[4], letter):
                        score += 0.004
        elif len_state == 8:
            # check the second column
            if not ai_io.has_meaning(state[1], state[4], state[7]):
                return 0
            else:
                for letter in letters_left:
                    if (ai_io.has_meaning(state[2], state[5], letter)
                        and ai_io.has_meaning(state[0], state[4], letter)
                        and ai_io.has_meaning(state[6], state[7], letter)):
                        score += 10
        elif len(state) == 9:
            # check the third column, the third row and the left-right diagonal
            if (not ai_io.has_meaning(state[2], state[5], state[8])
                or not ai_io.has_meaning(state[0], state[4], state[8])
                or not ai_io.has_meaning(state[6], state[7], state[8])):
                return 0
            else:
                score += 10

        return score
Пример #8
0
    def heuristic(self, state, index):
        """
        Input:
            'state': the current state that need to evaluate heuristic value
            'index': the index of input in 'self.inputs'
        Output:
            The heuristic value of state
        """
        score = 0

        # START: Find a list of remaining letters (letters that are not in 'state')
        letters_left = self.inputs[index][:]
        for letter in state:
            letters_left.remove(letter)
        # END

        len_state = len(state)
        weight = 1.0/30.0  # the value is chosen from experience

        if len_state == 2:
            # START: add score for each letter left which makes the first row has meaning
            for letter in letters_left:
                if ai_io.has_meaning(state[0], state[1], letter):
                    score += 0.001
            # END

        elif len_state == 3 or len_state == 4:
            # check the first row
            if len_state == 3 and not ai_io.has_meaning(state[0], state[1], state[2]):
                # the first row has no meaning
                return 0
            else:
                score += 0.002  # score of the first row
                for letter in letters_left:
                    now_score = score  # the score before add 'letter' to 'state'
                    for j in AlgorithmPart3.PREVIOUS[len_state]:
                        try:
                            score += self.freq_dicts[index][state[j] + letter] * weight
                        except Exception:
                            # this 'letter' does not have a frequency with one of the previous letters
                            score = now_score  # reset score
                            break

        elif len_state == 5:
            # START: add score for each letter left which makes the second row has meaning
            for letter in letters_left:
                if ai_io.has_meaning(state[3], state[4], letter):
                    now_score = score  # the score before add 'letter' to 'state'
                    score += 0.001
                    for j in AlgorithmPart3.PREVIOUS[len_state]:
                        try:
                            score += self.freq_dicts[index][state[j] + letter] * weight
                        except Exception:
                            score = now_score  # reset score
                            break
            # END

        elif len_state == 6:
            # check the second row
            if not ai_io.has_meaning(state[3], state[4], state[5]):
                # the second row has no meaning
                return 0
            else:
                # START: add score for each letter left which makes
                # the first column and the right-left diagonal has meaning
                for letter in letters_left:
                    if (ai_io.has_meaning(state[0], state[3], letter)
                        and ai_io.has_meaning(state[2], state[4], letter)):
                        score += 0.002
                # END

        elif len_state == 7:
            # check the first column and the right-left diagonal
            if (not ai_io.has_meaning(state[0], state[3], state[6])
                or not ai_io.has_meaning(state[2], state[4], state[6])):
                # first column and the right-left diagonal have no meanings
                return 0
            else:
                # START: add score for each letter left which makes the second column has meaning
                for letter in letters_left:
                    if ai_io.has_meaning(state[1], state[4], letter):
                            score += 0.004
                # END
                return score

        elif len_state == 8:
            # check the second column
            if not ai_io.has_meaning(state[1], state[4], state[7]):
                # the second column has no meaning
                return 0
            else:
                # START: add score for 1 letter left which makes
                # the third column, the third row and the left-right diagonal has meaning
                if (ai_io.has_meaning(state[2], state[5], letters_left[0])
                    and ai_io.has_meaning(state[0], state[4], letters_left[0])
                    and ai_io.has_meaning(state[6], state[7], letters_left[0])):
                    # this is the result
                    return 10
                else:
                    return 0
                # END

        if score == 0:
            # there is no future for this state
            return 0

        # START: Accumulate the frequency of each pair of letters in 'state'
        for i in range(1, len_state):
            for j in AlgorithmPart3.PREVIOUS[i]:
                try:
                    # state[i] is the current letter
                    # state[j] is one of the letters that precedes state[i]
                    freq = self.freq_dicts[index][state[j] + state[i]] * weight
                except Exception:
                    return 0
                else:
                    score += freq
        # END
        return score
Пример #9
0
    def heuristic(self, state, index):
        """
        Input:
            'state': the current state that need to evaluate heuristic value
            'index': the index of input in 'self.inputs'
        Output:
            The heuristic value of state
        """
        score = 0

        # START: Find a list of remaining letters (letters that are not in 'state')
        letters_left = self.inputs[index][:]
        for letter in state:
            letters_left.remove(letter)
        # END

        len_state = len(state)
        weight = 1.0/30.0

        if len_state == 2:
            # START: add score for each letter left which makes the first row has meaning
            for letter in letters_left:
                if ai_io.has_meaning(state[0], state[1], letter):
                    score += 0.001
            # END

        elif len_state == 3 or len_state == 4:
            # check the first row
            if len_state == 3 and not ai_io.has_meaning(state[0], state[1], state[2]):
                # the first row has no meaning
                return 0
            else:
                score += 0.002  # score of the first row
                for letter in letters_left:
                    now_score = score  # the score before add 'letter' to 'state'
                    for j in AlgorithmPart3.PREVIOUS[len_state]:
                        try:
                            score += self.freq_dicts[index][state[j] + letter] * weight
                        except Exception:
                            # this 'letter' does not have a frequency with one of the previous letters
                            score = now_score  # reset score
                            break

        elif len_state == 5:
            # START: add score for each letter left which makes the second row has meaning
            for letter in letters_left:
                if ai_io.has_meaning(state[3], state[4], letter):
                    now_score = score  # the score before add 'letter' to 'state'
                    score += 0.001
                    for j in AlgorithmPart3.PREVIOUS[len_state]:
                        try:
                            score += self.freq_dicts[index][state[j] + letter] * weight
                        except Exception:
                            score = now_score  # reset score
                            break
            # END

        elif len_state == 6:
            # check the second row
            if not ai_io.has_meaning(state[3], state[4], state[5]):
                # the second row has no meaning
                return 0
            else:
                # START: add score for each letter left which makes
                # the first column and the right-left diagonal has meaning
                for letter in letters_left:
                    if (ai_io.has_meaning(state[0], state[3], letter)
                        and ai_io.has_meaning(state[2], state[4], letter)):
                        score += 0.002
                # END

        elif len_state == 7:
            # check the first column and the right-left diagonal
            if (not ai_io.has_meaning(state[0], state[3], state[6])
                or not ai_io.has_meaning(state[2], state[4], state[6])):
                # first column and the right-left diagonal have no meanings
                return 0
            else:
                # START: add score for each letter left which makes the second column has meaning
                for letter in letters_left:
                    if ai_io.has_meaning(state[1], state[4], letter):
                            score += 0.004
                # END
                return score

        elif len_state == 8:
            # check the second column
            if not ai_io.has_meaning(state[1], state[4], state[7]):
                # the second column has no meaning
                return 0
            else:
                # START: add score for 1 letter left which makes
                # the third column, the third row and the left-right diagonal has meaning
                if (ai_io.has_meaning(state[2], state[5], letters_left[0])
                    and ai_io.has_meaning(state[0], state[4], letters_left[0])
                    and ai_io.has_meaning(state[6], state[7], letters_left[0])):
                    # this is the result
                    return 10
                else:
                    return 0
                # END

        if score == 0:
            # there is no future for this state
            return 0

        # START: Accumulate the frequency of each pair of letters in 'state'
        for i in range(1, len_state):
            for j in AlgorithmPart3.PREVIOUS[i]:
                try:
                    # state[i] is the current letter
                    # state[j] is one of the letters that precedes state[i]
                    freq = self.freq_dicts[index][state[j] + state[i]] * weight
                except Exception:
                    return 0
                else:
                    score += freq
        # END
        return score