Advertisement

课设:无人驾驶车辆管理系统(基于pyqt5开发,最短路径算法)

阅读量:

一、效果演示

可实现动态移动

有源代码zip文件上传资源了,但是不知道怎么添文件链接,感兴趣的可以私信我,免费的

首先车辆有两种类型“绿”和“橙色”

二、python的迪杰克斯拉算法展示,适用于单源寻找最短路径,可以根据一个字符找到其他点的最短路径,其中rode_name是按循序排好的字符串列表,rode是对应的邻接矩阵。

复制代码
     def go_to(self,point: str):

    
     """用此方法可以返回节点名字为point与其它节点的最短距离,最短路径
    
     返回两个数 使用示例:  length,way=rode.go_to("d")
    
     length为字典,格式 {名字:最短路径长度}
    
     way为字典,格式{名字:起点->中间节点->终点}
    
     """
    
     # S[]中1表示节点在已找到最短路径中,0表示不在最短路径中
    
     # 初始化S[]
    
     S = []
    
     for x in self.rode_name:
    
         if x != point:
    
             S.append(0)
    
         else:
    
             S.append(1)
    
     dist = deepcopy(self.rode[self.rode_name.index(point)])
    
     # 路径长度l初始化,如果不是0则它的前面的节点为point,是的话赋值"0"
    
     path = []
    
     for x in self.rode[self.rode_name.index(point)]:
    
         if x != 0 and x < Maxnum:
    
             path.append(self.rode_name.index(point))
    
         else:
    
             path.append(-1)
    
     path_length = {}
    
     # 循环n-1次
    
     for i in range(len(S) - 1):
    
         min_ = Maxnum
    
         # 选取不在图中的最短的u
    
         for j in range(len(S)):
    
             if S[j] == 0 and dist[j] < min_:
    
                 u = j
    
                 min_ = dist[j]
    
         S[u] = 1  # 添加顶点u
    
         # 修改最短路经
    
         for j in range(len(S)):
    
             if S[j] == 0:
    
                 k = dist[u] + self.rode[u][j]
    
                 if self.rode[u][j] < Maxnum and k < dist[j]:
    
                     dist[j] = k
    
                     path[j] = u
    
     path_length,path_ = self.Dispath(dist, path, S,self.rode_name.index(point))
    
     #补充自身节点
    
     path_length[point]=0
    
     path_[point]=f"{point}"
    
     return path_length,path_
    
     def Dispath(self,dist: list,path: list, S, v: int) :
    
     """go_to的补充"""
    
     path_length = {}
    
     path_={}
    
     result=""
    
     for i in range(len(self.rode_name)):
    
         path_length[self.rode_name[i]] = dist[i]
    
     # 输出单源的最短路径详细信息
    
     apath = []
    
     for i in range(len(S)):
    
         if S[i] == 1 and i != v:
    
             #print(f"从顶点{self.rode_name[v]}到顶点{self.rode_name[i]}的路径长度为{dist[i]}")
    
             d = 0
    
             apath.append(self.rode_name[i])  # 终点为i
    
             k = path[i]
    
             if k == -1:
    
                 path_[self.rode_name[i]]="无路径"
    
             else:
    
                 while (k != v):
    
                     d += 1
    
                     apath.append(self.rode_name[k])
    
                     k = path[k]
    
                 d += 1
    
                 apath.append(self.rode_name[k])  # 添加起点
    
                 result=f"{apath[d]}->"
    
                 for j in sorted(range(d), reverse=True):
    
                     result+=f"{apath[j]}->"
    
                 path_[self.rode_name[i]] = result[:-2]
    
         apath = []
    
     return path_length,path_

三、邻接矩阵的生成算法

文件格式
5b7d3ac164f242fa9e86eb2395befe7e.png

对应算法

复制代码
     def input(self,filename):

    
     #根据文件生成Rode
    
     self.rode=[]
    
     with open(filename,"r",encoding="utf-8") as f:
    
         self.rode_name=f.readline().strip().split(",")
    
         lines=f.readlines()
    
         i=-1
    
         for line in lines:
    
             line_ls=line.strip().split(",")
    
             rode = {}
    
             for str_ in line_ls:
    
                 k,v=str_.split(":")
    
                 rode[k]=float(v)
    
             node=[Maxnum for x in range(len(self.rode_name))]
    
             i+=1
    
             node[i]=0
    
             for k,v in rode.items():
    
                 node[self.rode_name.index(k)]=v
    
             self.rode.append(node)

三、类结构图
a7ed037a79344abb9a496fbcdfedd00a.png

四、遇到的问题和解决方案

高分辨率电脑显示的问题

复制代码
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#解决高分辨率的问题

打包中遇到的坑

主要是路径问题,需要将引用的路径换成当前工作目录加文件名

全部评论 (0)

还没有任何评论哟~