Python:我的深度限制搜索算法不起作用

时间:2018-08-29 06:09:21

标签: python depth-first-search

Python的新手。

我已经实现了深度限制搜索算法,以查找从SG的路线。其中S是起始位置,G是目的地。

R代表道路,X代表我们无法穿越的障碍物。
ADJ是一个字典,其中包含来自给定位置的相邻路径。

因此,对于S来说,邻居是2和6。2和6代表邻居道路。我没有包含X,因为X是一个障碍。但是,如果构成对角线的方向之一包含X,则不能对角线移动。
Black Box represents an obstacle X while the white boxes are non-obstacles

问题在于,当我在下面的算法中运行代码时,找不到路由并永远卡住,直到超过深度限制为止。
有一条从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()

1 个答案:

答案 0 :(得分:2)

问题在于您不检查已访问的节点。例如,您从节点“ S”开始,然后到达其邻居,则应将其标记为已访问,并在追加到“打开”列表中时进行检查,以免再次尝试进入该节点。如果不这样做,您的代码将陷入无限循环,因为您将继续在两个节点之间跳转。

此外,您在ADJ中创建了一个问题,尤其是在“ 22”中。我尝试对您的代码进行最小的更改(将已删除的部分保留为注释),尽管还有其他一些地方可以改进。更正的代码:

add_image_size( 'cust-thumb', 400, 300, true );

此外,您可以编写一个函数轻松计算给定迷宫的<div class="container-fluid p-5"> <div class="row"> <?php while($catquery->have_posts()) : $catquery->the_post(); ?> <div class="col-md-3 col-sm-4 col-12 text-center pb-4 col"> <a href="<?php the_permalink() ?>" rel="bookmark"> <?php the_post_thumbnail('cust-thumb'); ?> <h5 class="pt-2"><?php the_title(); ?></h5></a> </div> <?php endwhile; ?> </div> </div> ,而不是对其进行硬编码。