*星型寻路可视化速度非常慢/python

*星型寻路可视化速度非常慢/python,python,pygame,a-star,Python,Pygame,A Star,我尝试使用python和pygame实现最短路径查找算法。算法和可视化似乎是可行的。但是,当我将开始节点和结束节点彼此远离时,查找路径所需的时间呈指数增长。查找长度为5或6个节点的路径需要数小时。我认为问题在于astar函数中的一个循环,但我不知道是哪个循环,也不知道如何解决它。我在网上搜索了这个问题,但没有找到任何解决办法。代码如下: 导入pygame 类多维数据集(): 行数=30 w=840 定义初始化(self,pos=None,color=None): self.pos=pos sel

我尝试使用python和pygame实现最短路径查找算法。算法和可视化似乎是可行的。但是,当我将开始节点和结束节点彼此远离时,查找路径所需的时间呈指数增长。查找长度为5或6个节点的路径需要数小时。我认为问题在于astar函数中的一个循环,但我不知道是哪个循环,也不知道如何解决它。我在网上搜索了这个问题,但没有找到任何解决办法。代码如下:

导入pygame
类多维数据集():
行数=30
w=840
定义初始化(self,pos=None,color=None):
self.pos=pos
self.color=颜色
self.neights=[]
def绘图(自、表面):
dis=self.w//self.rows
i=自身位置[0]
j=自身位置[1]
pygame.draw.rect(surface,self.color,(i*dis+1,j*dis+1,dis-2,dis-2))
类节点(多维数据集):
定义初始化(self,pos=None,color=None,parent=None):
super()。\uuuuu init\uuuuu(位置,颜色)
self.parent=parent
self.g=0
self.h=0
self.f=self.g+self.h
定义(自身、其他):
返回self.pos==其他.pos
//这是astar函数
def astar(开始、结束):
全局行、路径、obs_列表、开始_节点、结束_节点、窗口、关闭_列表、蓝色、子项、红色、绿色、灰色
计数器=0
绿色=(0255,0)
红色=(255,0,0)
蓝色=(0,0255)
灰色=(170170)
开始\节点=节点(开始,红色)
结束\节点=节点(结束,红色)
开始节点。g=开始节点。h=开始节点。f=0
end_node.g=end_node.h=end_node.f=0
打开列表=[]
已关闭的_列表=[]
打开\u列表。追加(开始\u节点)
而len(开放列表)>0:
#获取当前节点
当前\u节点=打开\u列表[0]
当前指数=0
对于索引,枚举中的项(打开列表):
如果.f项<当前节点.f:
当前节点=项目
当前索引=索引
#弹出当前关闭打开列表,添加到关闭列表
打开\u列表.pop(当前\u索引)
关闭\u列表。追加(当前\u节点)
可视化(窗口、打开列表)
如果当前_node.pos==结束_node.pos:
路径=[]
当前=当前节点
虽然当前值不是“无”:
append路径(current.pos)
current=current.parent
返回路径[:-1]#返回反向路径
儿童=[]
对于[(0,-1),(0,1),(-1,0),(1,0),(-1,-1),(-1,1),(1,1)]中的新位置:
节点位置=(当前节点位置[0]+新位置[0],当前节点位置[1]+新位置[1])
#检查邻居是否不是障碍物
如果obs\U列表中的节点位置:
#打印(“不可能”)
持续
#检查邻居是否不在封闭列表中
#创建一个新节点
新建节点=节点(节点位置,绿色,当前节点)
#新节点是前一个节点的子节点。将子节点添加到列表中
附加(新的_节点)
#印刷品(儿童)
#环游儿童
对于儿童中的儿童:
对于已关闭\u列表中的已关闭\u子项:
如果子项==关闭的子项:
持续
child.g=当前_节点.g+10
child.h=((child.pos[0]-end_node.pos[0])**2+((child.pos[1]-end_node.pos[1])**2)
child.f=child.g+child.h
对于“打开”列表中的“打开”节点:
如果child==open_node和child.g>open_node.g:
持续
#形象化(窗口、儿童)
#将子项添加到打开列表中
打开\u列表。追加(子项)
def绘图网格(w、行、窗口):
行之间的大小\u=w//行
x=0
y=0
对于范围内的l(行):
x=x+尺寸
y=y+尺寸
pygame.draw.line(窗口,(255255255),(x,0),(x,w))
pygame.draw.line(窗口,(255255),(0,y),(w,y))
def可视化(表面,列表):
全球红、蓝、绿、灰、计数器
对于枚举中的i,c(列表):
c、 绘制(曲面)
pygame.display.update()
def显示路径(曲面):
全局路径
对于路径中的i:
节点\路径=立方体(i,颜色=(0,0255))
节点\路径绘制(曲面)
pygame.display.update()
对于(路径)中的c:
节点p=立方体(c,颜色=(35,180,89))
节点绘制(曲面)
def初始图纸(表面):
表面填充((0,0,0))
绘制网格(840,30,表面)
开始节点。绘制(曲面)
结束节点绘制(曲面)
pygame.display.update()
def鼠标按(x):
全局行、窗口、obs、开始节点、结束节点、obs列表
t=x[0]
w=x[1]
g1=t/(840//行)
g2=w/(840//行)
obs=立方体((g1,g2),(125,125,125))
如果obs.pos==start\u node.pos:
obs.color=(255,0,0)
obs.draw(窗口)
pygame.display.update()
elif obs.pos==end_node.pos:
obs.color=(255,0,0)
obs.draw(窗口)
pygame.display.update()
其他:
如果obs.pos不在obs\U列表中:
obs_列表追加(obs.pos)
obs.draw(窗口)
pygame.display.update()
def main():
全局开始节点、结束节点、行、窗口、计数器、obs\U列表、开始、结束
宽度=840
行数=30
window=pygame.display.set_模式((宽度,宽度))
开始=(12,24)
结束=(12,26)
obs_列表=[]
开始\节点=节点(开始,颜色=(255,0,0))
结束\节点=节点(结束,颜色=(255,0,0))
开始节点绘制(窗口)
结束节点绘制(窗口)
绘制初始(窗口)
循环=真
while循环:
ev=pygame.event.get()
电动汽车中的活动:
如果event.type==pygame.QUIT:
pygame.quit()
如果pygame.mouse.get_按下()[0]:
尝试:
pos=pygame.mo
        for new_position in ...:
            # create a new node
            new_node = node(node_position, green, current_node)
            ...
            children.append(new_node)
            #     print(children)
            # loop through children
            for child in children:
                ...
                open_list.append(child)