微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python中广度优先算法的问题

如何解决Python中广度优先算法的问题

[已编辑] 我正在尝试使用广度优先算法解决 Python 中的问题。我创建了一个 Class 来从给定的节点生成子节点(我知道这可以正常工作,因为我已经测试过用另一个求解器代码调用这个生成器)。所以,我的问题一定出在这短短的几行代码中:

def bfs(self,node):
        queue=[]
        visited_nodes=[]
        memory_use = len(visited_nodes)

        queue.append(node)
        is_solution=False

        while not is_solution:
            if len(queue)==0:
                print('Unsolvable board!')
                is_solution=True
            
            else:
                s=queue.pop(0)
                visited_nodes.append(s)
                
                if s.isWinningState():
                    is_solution=True
                    print('Winning state achieved.')
                    self.showPath(s)
                     print('Max memory usage: ',memory_use)
                else:
                    children = s.generateChildren()#deque with all possible states/nodes
                    if len(children) > 0:
                        for child in children:
                            if child not in visited_nodes:
                                queue.append(child) 

尽管没有返回正确的访问节点数,但它需要大约 1 秒的时间来解决

使用第一个代码,它会永远运行(我在 15 分钟后杀死了终端)。有人可以帮我弄清楚这里出了什么问题吗?

谢谢

解决方法

当您遍历子节点时,不应将子节点附加到visited_nodes。

之前,您应该将节点附加到队列中 从队列中弹出后,将节点附加到visited_nodes

def bfs(self,node):
        queue=[]
        visited_nodes=[]
        memory_use = len(visited_nodes)

        queue.append(node)

        while queue:
            s=queue.pop(0)
            visited_nodes.append(s)

            if self.finalStateAchieved:
                return
            if s.isWinningState():
                print('Winning state achieved.')
                self.showPath(s)
                self.finalStateAchieved = True
                print('Max memory usage: ',memory_use)
            else:
                children = s.generateChildren()#list with all possible states/nodes
                if len(children) > 0:
                    for child in children:
                        if child not in visited_nodes:
                            queue.append(child) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。