DEPARTMENT OF COMPUTING

search.py [download]





def bfs(s0, model):
    
    Q = fifo_queue()
    Q.push(s0)

    while(len(Q) > 0): # frontier not empty
        s = Q.pop()
        if model.GOAL_TEST(s):
            return sequence_to_reach(s)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            Q.push(s1)
    return False





def sequence_to_reach_r(n):
    if n.parent is None:
        return []
    else:
        return sequence_to_reach_r(n.parent) + [n.action]

def sequence_to_reach(n):
    action_sequence = []
    while n.parent is not None:
        action_sequence.append(n.action)
        n = n.parent
    return action_sequence[::-1]

def bfs(s0, model):
    
    Q = fifo_queue()
    # state, action, parent, depth
    Q.push(Node(s0, None, None, 0))

    while(len(Q) > 0): # frontier not empty
        n = Q.pop()
        if model.GOAL_TEST(n.state):
            return sequence_to_reach(n)
        for a in model.ACTIONS(n.state):
            s1 = model.RESULT(n.state, a)
            Q.push(Node(s1, a, n, 1+n.depth))
    return False














def dfs(s0, model):
    
    Q = lifo_queue()
    Q.push(s0)

    while(len(Q) > 0): # frontier not empty
        s = Q.pop()
        if model.GOAL_TEST(s):
            return sequence_to_reach(s)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            Q.push(s1)
    return False















        
        
    

def uniform_cost_search(s0, model):
    # (state, parent, action, depth, cost)
    n0 = (s0, None, None, 0, 0.0)
    
    Q = priority_queue() # min-heap on cost
    Q.push(n0)

    while(len(Q) > 0): # frontier not empty
        n = Q.pop() # pops the node with the least cost
        (s, p, a, d, c) = n
        if model.GOAL_TEST(s):
            return sequence_to_reach(n)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            n1 = (s1, n, a, d+1, c+model.STEP_COST(s, a, s1))
            Q.push(n1)
    return False


def greedy_search(s0, model):
    # (state, parent, action, depth, cost, heuristic)
    n0 = (s0, None, None, 0, 0.0, model.HEURISTIC(s0))
    
    Q = priority_queue() # min-heap on heuristic
    Q.push(n0)

    while(len(Q) > 0): # frontier not empty
        n = Q.pop() # pops the node with the least heuristic
        (s, p, a, d, c, h) = n
        if model.GOAL_TEST(s):
            return sequence_to_reach(n)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            n1 = (s1, n, a, d+1, c+model.STEP_COST(s, a, s1), model.HEURISTIC(s1))
            Q.push(n1)
    return False



def astar_search(s0, model):
    # (state, parent, action, depth, cost, heuristic)
    n0 = (s0, None, None, 0, 0.0, model.HEURISTIC(s0))
    
    Q = priority_queue() # min-heap on cost+heuristic
    Q.push(n0)

    while(len(Q) > 0): # frontier not empty
        n = Q.pop() # pops the node with the least heuristic
        (s, p, a, d, c, h) = n
        if model.GOAL_TEST(s):
            return sequence_to_reach(n)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            n1 = (s1, n, a, d+1, c+model.STEP_COST(s, a, s1), model.HEURISTIC(s1))
            Q.push(n1)
    return False






def astar_graph_search(s0, model):
    # (state, parent, action, depth, cost, heuristic)
    n0 = (s0, None, None, 0, 0.0, model.HEURISTIC(s0))
    closed_list = empty_store()
    
    Q = priority_queue() # min-heap on cost+heuristic
    Q.push(n0)
    closed_list.add(s0)

    while(len(Q) > 0): # frontier not empty
        n = Q.pop() # pops the node with the least heuristic
        (s, p, a, d, c, h) = n
        if model.GOAL_TEST(s):
            return sequence_to_reach(n)
        for a in model.ACTIONS(s):
            s1 = model.RESULT(s, a)
            if s1 not in closed_list:
                n1 = (s1, n, a, d+1, c+model.STEP_COST(s, a, s1), model.HEURISTIC(s1))
                Q.push(n1)
                closed_list.add(s1)
    return False





Last Updated 09/12/2024