为什么我不断收到未定义的错误?
Why do I keep getting an undefined error?
这是 python 中的一种搜索算法,可在罗马尼亚城市中导航。
class GraphTree:
graph = {
'Oradea': set(['Zerind','Sibiu']),
'Zerind': set(['Arad','Oradea']),
'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']),
'Arad': set(['Timisoara','Zerind','Sibiu']),
'Timisoara': set(['Lugoj']),
'Lugoj': set(['Mehadia']),
'Mehadia': set(['Drobeta']),
'Drobeta': set(['Craiova']),
'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']),
'Craiova': set(['Drobeta','Rimnicu Vilcea']),
'Fagaras': set(['Bucharest','Sibiu']),
'Pitesti': set(['Bucharest','Rimnicu Vilcea']),
'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']),
'Giurgiu': set(['Bucharest']),
'Urziceni': set(['Hirsova','Vaslui','Bucharest']),
'Hirsova': set(['Eforia','Urziceni']),
'Eforia': set(['Hirsova']),
'Vaslui': set(['Iasi','Urziceni']),
'Iasi': set(['Neamt','Vaslui']),
'Neamt': set(['Iasi'])}
def bfs(graph, start, end):
queue = [(start, [start])]
while queue:
(vertex, path) = queue.pop(0)
for next in graph[vertex] - set(path):
if next == end:
yield path + [next]
else:
queue.append((next, path + [next]))
def dfs(graph, start, goal):
queue = []
queue.append([start])
while queue:
path = queue.pop(0)
node = path[-1]
if node == end:
return path
for adjacent in graph.get(node,[]):
new_path = list(path)
new_path.append(adjacent)
queue.append(new_path)
print('bfs')
bfs(graph, 'Oradea', 'Neamt')
print('dfs')
dfs(graph, 'Oradea', 'Neamt')
当我 运行 算法时,我不断收到此错误:
---> 1 class GraphTree:
2
3 graph = {
4 'Oradea': set(['Zerind','Sibiu']),
5 'Zerind': set(['Arad','Oradea']),
另一个地址:
49 bfs(图表,'Oradea','Neamt')
50 打印('dfs')
--> 51 dfs(图表, 'Oradea', 'Neamt')
最后:
39 path = queue.pop(0)
40 node = path[-1]
--> 41 如果节点 == 结束:
42return路径
graph.get(node,[]):
中相邻的 43
NameError: name 'end' is not defined
算法在逻辑上似乎是正确的,条件和声明都可以。
为什么这个搜索算法不起作用?
The algorithm should be able to navigate the map going from one city to the other and returning the path using both breadth first (bfs) and depth first (dfs) searches.
你有
bfs(graph, start, end)
和
dfs(graph, start, goal)
^^^^
您的代码的一些其他注释:
- 您没有打印出搜索结果,但您似乎打算这样做。
- 您将所有内容包装在 class 中,但您没有在代码中执行任何其他实际需要这样做的事情。
考虑到所有这些,这是另一个版本:
graph = {
'Oradea': set(['Zerind','Sibiu']),
'Zerind': set(['Arad','Oradea']),
'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']),
'Arad': set(['Timisoara','Zerind','Sibiu']),
'Timisoara': set(['Lugoj']),
'Lugoj': set(['Mehadia']),
'Mehadia': set(['Drobeta']),
'Drobeta': set(['Craiova']),
'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']),
'Craiova': set(['Drobeta','Rimnicu Vilcea']),
'Fagaras': set(['Bucharest','Sibiu']),
'Pitesti': set(['Bucharest','Rimnicu Vilcea']),
'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']),
'Giurgiu': set(['Bucharest']),
'Urziceni': set(['Hirsova','Vaslui','Bucharest']),
'Hirsova': set(['Eforia','Urziceni']),
'Eforia': set(['Hirsova']),
'Vaslui': set(['Iasi','Urziceni']),
'Iasi': set(['Neamt','Vaslui']),
'Neamt': set(['Iasi'])}
def bfs(graph, start, end):
queue = [(start, [start])]
while queue:
(vertex, path) = queue.pop(0)
for next in graph[vertex] - set(path):
if next == end:
yield path + [next]
else:
queue.append((next, path + [next]))
def dfs(graph, start, end):
queue = []
queue.append([start])
while queue:
path = queue.pop(0)
node = path[-1]
if node == end:
return path
for adjacent in graph.get(node,[]):
new_path = list(path)
new_path.append(adjacent)
queue.append(new_path)
print('bfs')
print(list(bfs(graph, 'Oradea', 'Neamt')))
print('dfs')
print(dfs(graph, 'Oradea', 'Neamt'))
当我运行这个时,输出是:
bfs
[['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt']]
dfs
['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt']
这是 python 中的一种搜索算法,可在罗马尼亚城市中导航。
class GraphTree:
graph = {
'Oradea': set(['Zerind','Sibiu']),
'Zerind': set(['Arad','Oradea']),
'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']),
'Arad': set(['Timisoara','Zerind','Sibiu']),
'Timisoara': set(['Lugoj']),
'Lugoj': set(['Mehadia']),
'Mehadia': set(['Drobeta']),
'Drobeta': set(['Craiova']),
'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']),
'Craiova': set(['Drobeta','Rimnicu Vilcea']),
'Fagaras': set(['Bucharest','Sibiu']),
'Pitesti': set(['Bucharest','Rimnicu Vilcea']),
'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']),
'Giurgiu': set(['Bucharest']),
'Urziceni': set(['Hirsova','Vaslui','Bucharest']),
'Hirsova': set(['Eforia','Urziceni']),
'Eforia': set(['Hirsova']),
'Vaslui': set(['Iasi','Urziceni']),
'Iasi': set(['Neamt','Vaslui']),
'Neamt': set(['Iasi'])}
def bfs(graph, start, end):
queue = [(start, [start])]
while queue:
(vertex, path) = queue.pop(0)
for next in graph[vertex] - set(path):
if next == end:
yield path + [next]
else:
queue.append((next, path + [next]))
def dfs(graph, start, goal):
queue = []
queue.append([start])
while queue:
path = queue.pop(0)
node = path[-1]
if node == end:
return path
for adjacent in graph.get(node,[]):
new_path = list(path)
new_path.append(adjacent)
queue.append(new_path)
print('bfs')
bfs(graph, 'Oradea', 'Neamt')
print('dfs')
dfs(graph, 'Oradea', 'Neamt')
当我 运行 算法时,我不断收到此错误:
---> 1 class GraphTree:
2
3 graph = {
4 'Oradea': set(['Zerind','Sibiu']),
5 'Zerind': set(['Arad','Oradea']),
另一个地址: 49 bfs(图表,'Oradea','Neamt') 50 打印('dfs') --> 51 dfs(图表, 'Oradea', 'Neamt')
最后:
39 path = queue.pop(0)
40 node = path[-1]
--> 41 如果节点 == 结束: 42return路径 graph.get(node,[]):
中相邻的 43NameError: name 'end' is not defined
算法在逻辑上似乎是正确的,条件和声明都可以。 为什么这个搜索算法不起作用?
The algorithm should be able to navigate the map going from one city to the other and returning the path using both breadth first (bfs) and depth first (dfs) searches.
你有
bfs(graph, start, end)
和
dfs(graph, start, goal)
^^^^
您的代码的一些其他注释:
- 您没有打印出搜索结果,但您似乎打算这样做。
- 您将所有内容包装在 class 中,但您没有在代码中执行任何其他实际需要这样做的事情。
考虑到所有这些,这是另一个版本:
graph = {
'Oradea': set(['Zerind','Sibiu']),
'Zerind': set(['Arad','Oradea']),
'Sibiu': set(['Arad','Rimnicu Vilcea','Fagaras','Oradea']),
'Arad': set(['Timisoara','Zerind','Sibiu']),
'Timisoara': set(['Lugoj']),
'Lugoj': set(['Mehadia']),
'Mehadia': set(['Drobeta']),
'Drobeta': set(['Craiova']),
'Rimnicu Vilcea': set(['Craiova','Pitesti','Sibiu']),
'Craiova': set(['Drobeta','Rimnicu Vilcea']),
'Fagaras': set(['Bucharest','Sibiu']),
'Pitesti': set(['Bucharest','Rimnicu Vilcea']),
'Bucharest': set(['Giurgiu','Urziceni','Pitesti','Fagaras']),
'Giurgiu': set(['Bucharest']),
'Urziceni': set(['Hirsova','Vaslui','Bucharest']),
'Hirsova': set(['Eforia','Urziceni']),
'Eforia': set(['Hirsova']),
'Vaslui': set(['Iasi','Urziceni']),
'Iasi': set(['Neamt','Vaslui']),
'Neamt': set(['Iasi'])}
def bfs(graph, start, end):
queue = [(start, [start])]
while queue:
(vertex, path) = queue.pop(0)
for next in graph[vertex] - set(path):
if next == end:
yield path + [next]
else:
queue.append((next, path + [next]))
def dfs(graph, start, end):
queue = []
queue.append([start])
while queue:
path = queue.pop(0)
node = path[-1]
if node == end:
return path
for adjacent in graph.get(node,[]):
new_path = list(path)
new_path.append(adjacent)
queue.append(new_path)
print('bfs')
print(list(bfs(graph, 'Oradea', 'Neamt')))
print('dfs')
print(dfs(graph, 'Oradea', 'Neamt'))
当我运行这个时,输出是:
bfs
[['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Sibiu', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Sibiu', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Pitesti', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt'], ['Oradea', 'Zerind', 'Arad', 'Timisoara', 'Lugoj', 'Mehadia', 'Drobeta', 'Craiova', 'Rimnicu Vilcea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt']]
dfs
['Oradea', 'Sibiu', 'Fagaras', 'Bucharest', 'Urziceni', 'Vaslui', 'Iasi', 'Neamt']