search.py 40,2 ko
Newer Older
        if BoggleFinder.wordlist is None:
Peter Norvig's avatar
Peter Norvig a validé
            BoggleFinder.wordlist = Wordlist(DataFile("EN-text/wordlist.txt"))
        self.found = {}
        if board:
            self.set_board(board)

    def set_board(self, board=None):
        "Set the board, and find all the words in it."
        if board is None:
            board = random_boggle()
        self.board = board
        self.neighbors = boggle_neighbors(len(board))
        self.found = {}
        for i in range(len(board)):
            lo, hi = self.wordlist.bounds[board[i]]
            self.find(lo, hi, i, [], '')
        return self
    def find(self, lo, hi, i, visited, prefix):
        """Looking in square i, find the words that continue the prefix,
        considering the entries in self.wordlist.words[lo:hi], and not
        revisiting the squares in visited."""
withal's avatar
withal a validé
        if i in visited:
            return
        wordpos, is_word = self.wordlist.lookup(prefix, lo, hi)
        if wordpos is not None:
withal's avatar
withal a validé
            if is_word:
                self.found[prefix] = True
            visited.append(i)
            c = self.board[i]
MircoT's avatar
MircoT a validé
            if c == 'Q':
                c = 'QU'
withal's avatar
withal a validé
            for j in self.neighbors[i]:
                self.find(wordpos, hi, j, visited, prefix)
            visited.pop()

withal's avatar
withal a validé
    def words(self):
MircoT's avatar
MircoT a validé
        return list(self.found.keys())

    scores = [0, 0, 0, 0, 1, 2, 3, 5] + [11] * 100

    def score(self):
        "The total score for the words found, according to the rules."
        return sum([self.scores[len(w)] for w in self.words()])

    def __len__(self):
        "The number of words found."
        return len(self.found)

# _____________________________________________________________________________
peter.norvig's avatar
peter.norvig a validé
def boggle_hill_climbing(board=None, ntimes=100, verbose=True):
    """Solve inverse Boggle by hill-climbing: find a high-scoring board by
    starting with a random one and changing it."""
    finder = BoggleFinder()
    if board is None:
        board = random_boggle()
    best = len(finder.set_board(board))
    for _ in range(ntimes):
        i, oldc = mutate_boggle(board)
        new = len(finder.set_board(board))
        if new > best:
            best = new
MircoT's avatar
MircoT a validé
            if verbose:
                print(best, _, board)
MircoT's avatar
MircoT a validé
            board[i] = oldc  # Change back
peter.norvig's avatar
peter.norvig a validé
    if verbose:
def mutate_boggle(board):
    i = random.randrange(len(board))
    oldc = board[i]
MircoT's avatar
MircoT a validé
    # random.choice(boyan_best)
    board[i] = random.choice(random.choice(cubes16))
# ______________________________________________________________________________
withal's avatar
withal a validé
# Code to compare searchers on various problems.
class InstrumentedProblem(Problem):
    """Delegates to a problem, and keeps statistics."""

withal's avatar
withal a validé
    def __init__(self, problem):
        self.problem = problem
        self.succs = self.goal_tests = self.states = 0
        self.found = None
    def actions(self, state):
        self.succs += 1
        return self.problem.actions(state)

    def result(self, state, action):
        self.states += 1
        return self.problem.result(state, action)
    def goal_test(self, state):
        self.goal_tests += 1
        result = self.problem.goal_test(state)
withal's avatar
withal a validé
        if result:
    def path_cost(self, c, state1, action, state2):
        return self.problem.path_cost(c, state1, action, state2)

    def value(self, state):
        return self.problem.value(state)

withal's avatar
withal a validé
        return getattr(self.problem, attr)

    def __repr__(self):
        return '<%4d/%4d/%4d/%s>' % (self.succs, self.goal_tests,
                                     self.states, str(self.found)[:4])
def compare_searchers(problems, header,
                      searchers=[breadth_first_tree_search,
                                 breadth_first_search,
                                 depth_first_graph_search,
                                 iterative_deepening_search,
                                 recursive_best_first_search]):
    def do(searcher, problem):
        p = InstrumentedProblem(problem)
        searcher(p)
        return p
    table = [[name(s)] + [do(s, p) for p in problems] for s in searchers]
    print_table(table, header)

def compare_graph_searchers():
Peter Norvig's avatar
Peter Norvig a validé
    """Prints a table of search results."""
Surya Teja Cheedella's avatar
Surya Teja Cheedella a validé
    compare_searchers(problems=[GraphProblem('Arad', 'Bucharest', romania_map),
                                GraphProblem('Oradea', 'Neamt', romania_map),
                                GraphProblem('Q', 'WA', australia_map)],
                      header=['Searcher', 'romania_map(Arad, Bucharest)',
                              'romania_map(Oradea, Neamt)', 'australia_map'])
# ______________________________________________________________________________
peter.norvig's avatar
peter.norvig a validé

Peter Norvig's avatar
Peter Norvig a validé