Python:我的深度限制搜索算法获胜';行不通
Python新手 我已经实现了一个深度有限的搜索算法来查找从Python:我的深度限制搜索算法获胜';行不通,python,depth-first-search,Python,Depth First Search,Python新手 我已经实现了一个深度有限的搜索算法来查找从S到G的路径。其中S是起始位置,G是目的地 R代表道路,X代表我们无法通过的障碍。 ADJ是包含来自给定位置的相邻路径的字典 因此,对于S,相邻的是2和6。2和6表示相邻道路。我没有包括X,因为X是一个障碍。但是,如果构成对角线的一个方向包含X,则不能沿对角线移动。 问题是,当我运行下面的代码时,我的算法找不到路由,并且会永远被卡住,直到它超过深度限制。 有一条从S到G的路线,但我的算法没有找到它。 如何解决此错误? 谢谢 这是我的密
S
到G
的路径。其中S是起始位置,G是目的地
R代表道路,X代表我们无法通过的障碍。ADJ是包含来自给定位置的相邻路径的字典 因此,对于S,相邻的是2和6。2和6表示相邻道路。我没有包括X,因为X是一个障碍。但是,如果构成对角线的一个方向包含X,则不能沿对角线移动。
问题是,当我运行下面的代码时,我的算法找不到路由,并且会永远被卡住,直到它超过深度限制。
有一条从S到G的路线,但我的算法没有找到它。
如何解决此错误? 谢谢
这是我的密码:
ADJ = {}
""""
SRRXG
RXRXR
RRRXR
XRXRR
RRRRX
"""
ADJ['S'] = ['2', '6']
ADJ['2'] = ['S', '3']
ADJ['3'] = ['2','8']
ADJ['G'] = ['10']
ADJ['6'] = ['S', '11']
ADJ['8'] = ['3', '13']
ADJ['10'] = ['G', '15']
ADJ['11'] = ['6', '12']
ADJ['12'] = ['11', '13', '17']
ADJ['13'] = ['8', '12']
ADJ['15'] = ['10', '20']
ADJ['17'] = ['12','22']
ADJ['19'] = ['20', '24']
ADJ['20'] = ['15','19']
ADJ['21'] = ['22']
ADJ['22'] = ['17','21','23']
ADJ['23'] = ['22', '24']
ADJ['24'] = ['19','23']
print (ADJ)
def dls(start, goal):
depth = 0
limit = 200
OPEN=[]
CLOSED=[]
OPEN.append(start)
while OPEN != []: # Step 2
if depth<=limit:
current = OPEN.pop()
if current == goal:
CLOSED.append(current)
print("Goal Node Found")
print(CLOSED)
return True
else:
CLOSED.append(current)
lst = successors(current)
for i in lst:
OPEN.append(i)
depth +=1
else:
print("Not found within depth limit")
return False
return False
def successors(city):
return ADJ[city]
def test():
start = 'S'
goal = 'G'
print("Starting a dls from " + start)
print(dls(start, goal))
if __name__ == "__main__":
test()
ADJ={}
""""
SRRXG
RXR
RRRXR
XRRR
RRX
"""
形容词['S']=['2','6']
形容词['2']=['S',3']
形容词['3']=['2','8']
形容词['G']=['10']
形容词['6']=['S','11']
形容词['8']=['3','13']
形容词['10']=['G','15']
形容词['11']=['6','12']
形容词['12']=['11','13','17']
形容词['13']=['8','12']
形容词['15']=['10','20']
形容词['17']=['12','22']
形容词['19']=['20','24']
形容词['20']=['15','19']
形容词['21']=['22']
形容词['22']=['17','21','23']
形容词['23']=['22','24']
形容词['24']=['19','23']
印刷品
def dls(开始、目标):
深度=0
限额=200
开放=[]
关闭=[]
OPEN.append(开始)
打开时!=[]:#步骤2
如果深度,问题在于您没有对已访问的节点进行检查“然后去它的邻居那里,你应该将它标记为已访问,并在添加到打开列表的同时进行检查,这样你就不会再次尝试访问它。”。如果您不这样做,您的代码将陷入无限循环,因为您将继续在两个节点之间跳跃
此外,您创建的ADJ中存在一些问题,特别是在'22'中。我试图对代码进行最小的更改(将删除的部分保留为注释),尽管还有其他一些地方可以改进。更正代码:
ADJ = {}
""""
SRRXG
RXRXR
RRRXR
XRXRR
RRRRX
"""
ADJ['S'] = ['2', '6']
ADJ['2'] = ['S', '3']
ADJ['3'] = ['2','8']
ADJ['G'] = ['10']
ADJ['6'] = ['S', '11']
ADJ['8'] = ['3', '13']
ADJ['10'] = ['G', '15']
ADJ['11'] = ['6', '12']
ADJ['12'] = ['11', '13', '17']
ADJ['13'] = ['8', '12']
ADJ['15'] = ['10', '20']
ADJ['17'] = ['12','22']
ADJ['19'] = ['20', '24']
ADJ['20'] = ['15','19']
ADJ['21'] = ['22']
ADJ['22'] = ['17','21','23']
ADJ['23'] = ['22', '24']
ADJ['24'] = ['19','23']
print (ADJ)
# keep track of visited nodes
visited = {str(i) : False for i in range(1,26)}
visited['S'] = False
visited['G'] = False
def dls(start, goal):
depth = 0
limit = 200
OPEN=[]
CLOSED=[]
OPEN.append(start)
visited["S"] = True
while OPEN != []: # Step 2
if depth<=limit:
current = OPEN.pop()
# visited[current] = False
if current == goal:
# CLOSED.append(current)
print("Goal Node Found")
# print(CLOSED)
return True
else:
# CLOSED.append(current)
lst = successors(current)
for i in lst:
# try to visit a node in future, if not already been to it
if(not(visited[i])):
OPEN.append(i)
visited[i] = True
depth +=1
else:
print("Not found within depth limit")
return False
return False
ADJ={}
""""
SRRXG
RXR
RRRXR
XRRR
RRX
"""
形容词['S']=['2','6']
形容词['2']=['S',3']
形容词['3']=['2','8']
形容词['G']=['10']
形容词['6']=['S','11']
形容词['8']=['3','13']
形容词['10']=['G','15']
形容词['11']=['6','12']
形容词['12']=['11','13','17']
形容词['13']=['8','12']
形容词['15']=['10','20']
形容词['17']=['12','22']
形容词['19']=['20','24']
形容词['20']=['15','19']
形容词['21']=['22']
形容词['22']=['17','21','23']
形容词['23']=['22','24']
形容词['24']=['19','23']
印刷品
#跟踪访问的节点
visited={str(i):范围(1,26)内的i为False}
已访问['S']=False
已访问['G']=False
def dls(开始、目标):
深度=0
限额=200
开放=[]
关闭=[]
OPEN.append(开始)
已访问[“S”]=真
打开时!=[]:#步骤2
如果深度是一件事,我认为你增加深度太过急切了。注意,在一般情况下,你处理议程中相同深度的多个连续节点,但你在每个节点之后增加深度。我知道,我删除了深度限制,它仍然会被Stuckall1
(无论网格中的哪个正方形)不是邻接列表中的键,并且您也缺少从22
到23
的基本路径。我已经做了更改,但它仍然会出现问题。在添加后续项之前,您应该检查它们是否在已关闭
(这是该变量存在的理由)。