簡體   English   中英

如何在 dfs 算法(python)中實現目標狀態?

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

我正在嘗試使用 DFS 來遍歷我的圖形。 我的函數是dfs(cost_matrix, start_point, goals_array) 我將 DFS 算法遵循的任何一個目標狀態的路徑放在一個列表中。 我似乎無法弄清楚在遍歷過程中何時從列表中附加和彈出項目。 我知道一旦達到目標狀態,我就可以脫離循環。 我正在迭代地使用 DFS 的堆棧方法。

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

采取並修改了一下,以適應問題中的要求並在找到目標之一時中斷 - 從這里開始

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]) 

輸出:

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')

這就是 dfs 的工作原理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM