栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简易地图---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: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需要每个点的坐标,如下为参考

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

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931919.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号