简易地图---python数据结构

大二数据结构课程设计,老师要求做一个地图,能添加或删除地点和路径,能够输出最短路径(这里我用的是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:\pythonProject\Map_Sys\vexdata.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:\pythonProject\Map_Sys\Mapdata.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

简易地图---python数据结构_第1张图片简易地图---python数据结构_第2张图片

 同样,要运行本程序需要在同文件下创建一个vexdata.xlsx文件和Mapdata.xlsx文件,同时这里面需要数据

1.vexdata.xlsx需要邻接矩阵的数据,如下为参考。

这个里面的数据随便输入就好,你就算只输入0和1都可以,两个节点之间的距离最主要是靠计算节点的坐标(这里不懂可以看看connect_peak这个函数),我之所以会出现这些数字是因为计算坐标后的矩阵最后会保存到xlsx文件里面。

简易地图---python数据结构_第3张图片

2.Mapdata.xlsx需要每个点的坐标,如下为参考。

这个地方还是需要好好考虑一下坐标点位。

简易地图---python数据结构_第4张图片

如果还有什么问题可以评论区提出来,本人基本上可以隔天回复

你可能感兴趣的:(python,数据结构,矩阵)