Search code examples
pythonartificial-intelligencedepth-first-search

How to implement goal states within the dfs algorithm (python)?


I'm trying to use DFS to traverse my graph. My function is dfs(cost_matrix, start_point, goals_array). I am putting the path followed to any ONE of the GOAL states by the DFS algorithm in a list. I can't seem to figure out when to append and pop items from the list during traversal. I know that once the goal state is reached i can just break from the loop. I am using the stack method of DFS iteratively.

def DFS_Traversal(cost, start_point, goals):
num = len(cost)
visited = [0] * num
visited[start_point] = 1
stack = []
stack.append(start_point)
l = [] #used to store the final path
l.append(start_point)

while(len(stack)):
    s = stack.pop()

    if(visited[s] == 0):
        visited[s] = 1
        if s in goals:
            break

        for i in range (1, num): #going across the matrix
            if (cost[s][i] != -1 || cost[s][i] != 0):
                stack.append(i) #adding members to the stack


return l

Solution

  • Taken and modified a bit, to fit the requirement in the question and break when find one of the goals - from here:

    from collections import defaultdict 
      
    # This class represents a directed graph using 
    # adjacency list representation 
    class Graph: 
      
        # Constructor 
        def __init__(self): 
      
            # default dictionary to store graph 
            self.graph = defaultdict(list) 
      
        # function to add an edge to graph 
        def addEdge(self, u, v): 
            self.graph[u].append(v) 
      
        # A function used by DFS 
        def DFSUtil(self, v, visited, goals): 
      
            # Mark the current node as visited  
            # and print it 
            print(" ")
            visited[v] = True
            for goal in goals:
                if v == goal:
                    print(f"found {v} - finish!")
                    return
            print(v, end = ' ') 
      
            # Recur for all the vertices  
            # adjacent to this vertex 
            for i in self.graph[v]: 
                if visited[i] == False: 
                    self.DFSUtil(i, visited, goals) 
      
        # The function to do DFS traversal. It uses 
        # recursive DFSUtil() 
        def DFS(self, v, goals): 
      
            # Mark all the vertices as not visited 
            visited = [False] * (max(self.graph)+1) 
      
            # Call the recursive helper function  
            # to print DFS traversal 
            self.DFSUtil(v, visited, goals) 
      
    # Driver code 
      
    # Create a graph given  
    # in the above diagram 
    g = Graph() 
    g.addEdge(0, 1) 
    g.addEdge(0, 2) 
    g.addEdge(1, 2) 
    g.addEdge(2, 0) 
    g.addEdge(2, 3) 
    g.addEdge(3, 3) 
      
    print("Following is DFS from (starting from vertex 2)") 
    g.DFS(2, [1,4]) 
    

    output:

    Following is DFS from (starting from vertex 2)
     
    2  
    0  
    found 1 - finish!