大二数据结构课程设计,老师要求做一个地图,能添加或删除地点和路径,能够输出最短路径(这里我用的是dijkstra),然后还能输出任意两点之间全部路径(这里我用的是递归),后面老师提要求还做了一个简易的可视化,因为一直在网上找不到参考,所以我做完之后留给后来人。
代码有点乱凑合着看下,提供一下思路。
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rc("font",family='YouYuan')
class Map():
def __init__(self, n=0):
'''
这里创建邻接矩阵
'''
self.n = n
self.edges = []
self.peak = []
self.name = 0
self.information = []
self.path = 0
def load_edges(self):
'''这里噢,有个大坑用loc'''
print("Loading data from excel...", end="")
vex_data = pd.read_excel(r'D:pythonProjectMap_Sysvexdata.xlsx', index_col=0)
for i in range(len(vex_data)):
for j in range(len(vex_data)):
if vex_data.loc[i,j] == 0:
vex_data.loc[i,j] = float('inf')
k = vex_data.values.tolist()
for a in k:
self.edges.append(a)
map_data = pd.read_excel(r'D:pythonProjectMap_SysMapdata.xlsx',index_col=0)
for i in map_data.values.tolist():
self.information.append(i)
self.peak = list(map_data.index)
self.n = len(self.peak)
print(self.peak)
print(self.information)
def Add_v(self,name,coordinate,reation):
'''
这里使用了解包,第一次使用解包,解包是将前一个和前面的变量来对应,后面与后一个对应
'''
self.n = len(self.edges)
self.edges.append(reation)
for i in range(self.n):
a = int(reation[i])
if a == 0:
a = float('inf')
self.edges[i].append(a)
self.n += 1
self.information.append(coordinate)
self.peak.append(name)
print(self.edges)
def Add_road(self,first,end,data):
'''添加路径'''
i = self.peak.index(first)
j = self.peak.index(end)
self.edges[i][j] = data
self.edges[j][i] = data
def del_v(self, place):
'''这里是删除节点'''
node1 = self.peak.index(place)
self.edges.pop(node1)
for i in range(self.n-1):
self.edges[i].pop(node1)
self.n = self.n - 1
self.information.pop(node1)
self.peak.pop(node1)
print(self.information)
print(self.edges)
print(self.peak)
def del_road(self,first,end):
'''删除路径'''
self.edges[first][end] = float('inf')
self.edges[end][first] = float('inf')
def connect_peak(self):
print(self.n)
for i in range(self.n):
for j in range(self.n):
if self.edges[i][j] != 0 and i != j and self.edges[i][j] != float('inf'):
weight = self.information[i][0]-self.information[j][0]
highter = self.information[i][1] - self.information[j][1]
distance = round((weight**2+highter**2)**0.5,2)
self.edges[i][j] = self.edges[j][i] = distance
else:
self.edges[i][j] == float('inf')
print(self.edges)
def display_edges(self):
'''这里展示邻接矩阵'''
print(self.n)
a = self.edges
for i in range(len(self.edges)):
for j in range(len(self.edges)):
if a[i][j] == 0:
a[i][j] = float('inf')
df = pd.DataFrame(a,index=self.peak,columns=self.peak)
print(df)
def dijkstra(self,begin,end):
self.n = len(self.edges)
S = [0]*self.n #存已经遍历过的节点
dist = [-1]*self.n #与其余点间最短距离,注意这里的距离是说初始点与该点的距离,而是不是上一个与下一个的距离
rear_road = [-1]*self.n #后置节点
for i in range(self.n):
dist[i] = self.edges[begin][i]
if self.edges[begin][i] < float('inf') :
rear_road[i] = begin
else:
rear_road[i] = -1
S[begin] = 1
u = -1#这个就是个工具变量 ,让它变成接下来有值的后置节点
for i in range(self.n-1):
mindis = float('inf')
for j in range(self.n):
#这里最主要是要判断顶点有没有被遍历过,然后是不是与出发点有路径
if S[j] == 0 and dist[j]j 是否大于 begin-->u+u-->j,如果要是小于的话就应该替换了
if self.edges[u][j]
一个遗憾,没有用mysql,一直用pandas将数据存储在xlsx
同样,要运行本程序需要在同文件下创建一个vexdata.xlsx文件和Mapdata.xlsx文件,同时这里面需要数据
1.vexdata.xlsx需要邻接矩阵的数据,如下为参考
2.Mapdata.xlsx需要每个点的坐标,如下为参考
如果还有什么问题可以评论区提出来,本人基本上可以隔天回复



