[英]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.