Python 利用堆栈实现深度受限路径查找

Python 利用堆栈实现深度受限路径查找,python,search,depth-first-search,Python,Search,Depth First Search,嘿,就像标题所说的,我试图在Python3中实现一个深度有限的搜索,该搜索返回给定图形的路径、起始顶点和目标顶点。我正在为如何强制执行搜索限制而挣扎。到目前为止,我已经: def dfs(g, v, goal, limit=-1): SENTINEL = object() visitedStack = [v] path = "" while visitedStack: currentVertex = visitedStack.pop()

嘿,就像标题所说的,我试图在Python3中实现一个深度有限的搜索,该搜索返回给定图形的路径、起始顶点和目标顶点。我正在为如何强制执行搜索限制而挣扎。到目前为止,我已经:

def dfs(g, v, goal, limit=-1):

    SENTINEL = object()    
    visitedStack = [v]
    path = ""

    while visitedStack:
        currentVertex = visitedStack.pop()    

        if g.getVertex(currentVertex) != None:
            if g.getVertex(currentVertex).visited == False:
                path += currentVertex + ' -> '

                g.getVertex(currentVertex).hasBeenVisited()

                if currentVertex == goal: 
                    return path[:-3]

                elif currentVertex == SENTINEL:
                    limit += 1

                elif limit != 0:
                    limit -= 1
                    visitedStack.append(SENTINEL)
                    visitedStack.extend(g.getVertex(currentVertex).getConnections()) 

     return "Depth limit was reached"

编辑:我更改了一些代码以检查访问的顶点。在我编辑后,返回的搜索有时无法正常工作。例如,我将深度限制设置为3,但返回的路径为4或5。其他时候,我会将限制设置为7,并返回“已达到限制”。注意:最小路径为3

当搜索深入时,将哨兵推到堆栈上并降低限制。当您从堆栈中弹出哨兵时,将增加级别

def dfs_limit(g, start, goal, limit=-1):
    '''
    Perform depth first search of graph g.
    if limit >= 0, that is the maximum depth of the search.
    '''
    SENTINEL = object()
    visitedStack = [start]
    path = []

    while visitedStack:
        currentVertex = visitedStack.pop()

        if currentVertex == goal: 
            path.append(currentVertex)
            return ' -> '.join(path)

        elif currentVertex == SENTINEL:
            #finished this level; go back up one level
            limit += 1
            path.pop()

        elif limit != 0:
            # go one level deeper, push sentinel
            limit -= 1
            path.append(currentVertex)
            visitedStack.append(SENTINEL)
            visitedStack.extend(g.getVertex(currentVertex).getConnections())

如果图中有循环或多个路由,您还需要跟踪访问了哪些节点,这样您就不会重复工作或陷入无休止的循环。

非常感谢!不过,我遇到了一些问题,我在帖子中做了一些编辑。你可以将所有未访问的节点添加到路径中,但从不删除节点。当搜索深入一层时,当前节点应添加到路径的末尾,但当搜索返回到一层时,当前节点将被删除。我修改了我的解决方案以跟踪路径。