如何加速我的A-star寻路的python循环过程?

时间:2015-07-28 21:48:08

标签: python-2.7 optimization nested-loops a-star

我尝试基于tile-graph(图像栅格数据作为图形)制作A-star Pathfinding程序,其中每个像素值代表成本..这是我到目前为止的A-star函数脚本:

def A_star(h,c,dx,dy,u,s_id,e_id,Op,Cl,Prt,CC,o,ht,w):
    Op.append(s_id) 
    while e_id not in Op : 
        if Op == [ ] :
            break
        candidate = { }
        for i in Op :
            d = {i : CC[i]}
            candidate.update(d)
        o = min(candidate, key=candidate.get)
        Cl.append(o)
        Op.remove(o)
        adjacent_list = adjacent_cell(o,dx,dy )
        for p in adjacent_list :
            if p in Cl:       
                adjacent_list = filter(lambda i: i != p, adjacent_list)    
            elif p not in Op :   
                Op.append(p)
                d = {p : o }
                Prt.update(d)
                d = {p : F(p,o,h,u,w,c,dx,e_id,ht,CC)}
                CC.update(d)
            elif id in Op : 
                f1 = F(p,o,h,u,w,c,dx,e_id,ht,CC) 
                f2 = F(p,Prt[p],h,u,w,c,dx,e_id,ht,CC)
                if f1 < f2 :  
                    d = {p : o }
                    Prt.update(d)
                    d = {id : F(p,o,h,u,w,c,dx,e_id,ht,CC)}
                    CC.update(d)
    return Prt

我的示例代码和输入数据可以在这里下载 https://drive.google.com/open?id=0B2zjTfTukbMvaV9BalU4ZGx4MjQ

如果我使用DEM的小分辨率,25x29(srtm1.tif),这个程序进展顺利。但如果我尝试DEM的大分辨率,例如1228 x 972(dem,asc)。该程序花了很长时间来计算整个细胞。我认为问题在于循环进度,我尝试使用循环进行迭代(第110行,A-star函数)。

 while e_id not in Op : 

是否有任何解决方案可以让我的代码运行得更快? 所有的帮助,建议,评论,解决方案都将非常欣赏..

1 个答案:

答案 0 :(得分:0)

一些优化将是这样的:

def A_star(h,c,dx,dy,u,s_id,e_id,Op,Cl,Prt,CC,o,ht,w):
    Op.append(s_id) 
    continu = e_id not in Op
    while continu : 
        if Op == []:
            break
        candidate = {i:CC[i] for i in Op }  # HERE
        o = min(candidate.values())  # HERE
        Cl.append(o)
        Op.remove(o)
        adjacent_list = adjacent_cell(o,dx,dy )
        for p in adjacent_list :
            if p in Cl:       
                adjacent_list = filter(lambda i: i != p, adjacent_list)    
            elif p not in Op :   
                Op.append(p)
                if p==e_id:
                   continu=False # this will stop while from looping!
                Prt[p]=o  # HERE
                CC[p]=F(p,o,h,u,w,c,dx,e_id,ht,CC)  # HERE
            elif id in Op : 
                f1 = F(p,o,h,u,w,c,dx,e_id,ht,CC) 
                f2 = F(p,Prt[p],h,u,w,c,dx,e_id,ht,CC)
                if f1 < f2 :  
                    Prt[p]=o  # HERE
                    CC[id]= F(p,o,h,u,w,c,dx,e_id,ht,CC)  # HERE
    return Prt

使用dict.update不是用于设置一个项目!请改用dict[key]=value

另一个帮助是检查p == e_id的时间,如果它添加到Opwhile将会停止!