我尝试基于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 :
是否有任何解决方案可以让我的代码运行得更快? 所有的帮助,建议,评论,解决方案都将非常欣赏..
答案 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
的时间,如果它添加到Op
,while
将会停止!