简体   繁体   中英

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

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!
# Using a Python dictionary to act as an adjacency list
graph = {
    'A' : ['B','C'],
    'B' : ['D', 'E'],
    'C' : ['F'],
    'D' : [],
    'E' : ['F'],
    'F' : []
}

visited = set() # Set to keep track of visited nodes.

def dfs(visited, graph, node):
    if node not in visited:
        print (node)
        visited.add(node)
        for neighbour in graph[node]:
            dfs(visited, graph, neighbour)

# Driver Code
dfs(visited, graph, 'A')

this is how dfs works

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM