使用堆栈实现深度受限的路径查找

用户名

嘿,就像标题所说的那样,我正在尝试在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())

如果图中存在循环或多条路线,则还需要跟踪访问过哪些节点,以免重复工作或陷入无休止的循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

深度受限搜索的路径查找(Unity / C#〜)

来自分类Dev

使用堆栈查找加权图的最短路径

来自分类Dev

使用数组实现堆栈

来自分类Dev

使用 neo4j 和/或 python 查找节点的路径(深度)步骤

来自分类Dev

使用函数调用实现堆栈

来自分类Dev

使用链表实现堆栈损坏

来自分类Dev

使用 o(1) 实现堆栈

来自分类Dev

如何使用Keras实现深度双向LSTM?

来自分类Dev

MongoDb:使用$ lookup查找深度嵌套的对象

来自分类Dev

使用调用堆栈在C中实现堆栈数据结构?

来自分类Dev

如何使用react navgation深度链接到嵌套堆栈?

来自分类Dev

使用n深度包装器类型堆栈获取架构

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用2个堆栈实现队列

来自分类Dev

在Java中使用数组实现堆栈

来自分类Dev

使用数组,计数和索引实现堆栈

来自分类Dev

如何使用std :: vector实现堆栈?

来自分类Dev

使用堆栈实现优先级队列

来自分类Dev

使用2个队列实现堆栈

来自分类Dev

在Java中使用数组实现堆栈

来自分类Dev

在我的实现中使用堆栈是否正确?

来自分类Dev

打印调用堆栈的深度

来自分类Dev

调用堆栈的深度

来自分类Dev

使用算法A *查找路径

来自分类Dev

使用HTML查找图像路径

来自分类Dev

实现类型化的受限属性

来自分类Dev

使用JPA(固定深度)实现分层数据结构

来自分类Dev

如何使用非递归方法实现深度优先搜索图

来自分类Dev

使用JPA(固定深度)实现分层数据结构