深入搜索解决难题

时间:2016-03-24 04:54:28

标签: python python-3.x linked-list depth-first-search

假设已经定义了代码puzzle.extensions(self),它将返回一个拼图可用解决方案的列表,但不确定它是否已解决。此外,还定义了puzzle.is_solved(self),它将确定此解决方案是否已解决。这是我需要编写的代码,我也做了一些不正确的工作。

def depth_first_solve(puzzle):
    """
    Return a path from PuzzleNode(puzzle) to a PuzzleNode containing
    a solution, with each child containing an extension of the puzzle
    in its parent.  Return None if this is not possible.

    @type puzzle: Puzzle
    @rtype: PuzzleNode
    """
    stack = [puzzle]
    while stack:
        k = stack.pop()
        for puzzle1 in puzzle.extensions():
            if not puzzle1.is_solved():
                stack+=[k,puzzle1]
            if puzzle1.is_solved():
                p = stack.pop()
                end_node = PuzzleNode(k,None, p)
                k = stack.pop()
                last_node = PuzzleNode(p,end_node,k)
                while stack:
                    k = p
                    p = stack.pop()
                    cur_node = PuzzleNode(k, last_node, p)
                    last_node = cur_node
                return cur_node

def __init__(self, puzzle=None, children=None, parent=None):
    """
    Create a new puzzle node self with configuration puzzle.

    @type self: PuzzleNode
    @type puzzle: Puzzle | None
    @type children: list[PuzzleNode]
    @type parent: PuzzleNode | None
    @rtype: None
    """
    self.puzzle, self.parent = puzzle, parent
    if children is None:
        self.children = []
    else:
        self.children = children[:]

好吧,我在拼图中运行这些模块,它总是在等待结果而没有任何反应,所以有人能告诉我哪里错了吗?

1 个答案:

答案 0 :(得分:0)

我认为此代码存在大量问题。首先,您始终在puzzle.extensions()上进行迭代,而不是在您刚刚从堆栈中弹出的extensions节点的k上进行迭代。我怀疑这就是你获得无限循环的原因,因为相同的节点不断被反复推入堆栈(并被其余代码忽略)。

我不确定您为什么要将k添加回堆栈stack+=[k,puzzle1]。我非常确定你只想要stack.append(puzzle1),除非你正在尝试一些我不理解的非常微妙的东西。