m0_73593839 2023-04-16 20:00 采纳率: 100%
浏览 24
已结题

python表示网络的距离矩阵

我想请问一下,现在有三个包含两列节点的csv数据集:其中第一个是属于0-10分钟之内的节点与节点的联系。第二个是0-20分钟之内的节点与节点间的互动(包含0-10的节点相连),第三个是0-30之间的互动(包含0-10和10-20,也就是包含0-20)。
我想用python输出三个数据集的距离矩阵,第一个距离矩阵要求节点间如果相连的距离为1.第二个数据集要求节点之间如果在0-10分钟相连的,但是在10-20内没有联系,距离加1(在原来的基础上加1,比如0-10内节点a-b相连距离为1,但是在10-20没有a-b相连,则a-b的距离就为2),在0-10内没有相连的但是在10-20内新相连的距离也是为1(也就是在每个时间段内新出现的为1)。
同理,第三个距离矩阵要求节点之间如果在0-20分钟相连的,但是在20-30内没有联系,距离加1(在原来的基础上加1),如果在0-20没有相连的,但是在0-30内相连的,距离减1(0-20a-b距离为2(表示在这个时间段没有联系,但是在0-10有联系),0-30又有联系了距离=2-1=1)
现在我想的第一个距离矩阵这样:8_女子学院-10.csv'代表0-10内的联系。
问题:1.请问这个0-10内代码有问题吗?我觉得输出的距离矩阵不是很对
2.请问第二个和第三个时间段的距离矩阵该怎么修改呢?

edges = []
n = 239 #不同节点数
with open('./PT NODEXIN.csv',"rt", encoding="utf-8") as csvfile:
    reader = csv.DictReader(csvfile)
    nodelist = [row['node'] for row in reader]
max_value = max([int(i) for i in nodelist])
#print('最大节点编号:%d'%(max_value))

mymatrix1= np.zeros([max_value,max_value], dtype = int, order = 'C')#初始化邻接矩阵,无边为0   二行第一列表示节点编号2到节点编号1是否有边


with open('./8_女子学院-10.csv','r') as f: 
    data = f.readlines() 
    for line in data:
        #print line
        line = list(line.replace('\r','').replace('\n','').replace('\t','').split(','))
        mymatrix1[int(line[0])-1][int(line[1])-1] = 1;#邻接矩阵有边为1
        edges.append({int(line[0]),int(line[1])})
# 根据邻接矩阵生成距离矩阵
distance_matrix = np.zeros((n, n), dtype=int)
for i in range(n):
    for j in range(i+1, n):
        if mymatrix1[i][j] == 1:
            distance_matrix[i][j] = 1
            distance_matrix[j][i] = 1
print(distance_matrix)

  • 写回答

2条回答 默认 最新

  • 努力の小熊 全国大学生物联网技术与应用大赛获奖者 2023-04-16 20:38
    关注

    本人结合ChatGPT4.0的回答如下:
    问题1:请问这个0-10内代码有问题吗?我觉得输出的距离矩阵不是很对。

    代码中读取csv文件的部分和生成邻接矩阵部分是正确的。但是,在生成距离矩阵的部分,仅考虑了直接相连的节点。为了得到完整的距离矩阵,你需要使用Floyd-Warshall算法计算所有节点对之间的最短距离。修改代码如下:

    import numpy as np
    import csv
    
    def floyd_warshall(matrix):
        n = len(matrix)
        distance_matrix = np.array(matrix)
        for k in range(n):
            for i in range(n):
                for j in range(n):
                    distance_matrix[i][j] = min(distance_matrix[i][j], distance_matrix[i][k] + distance_matrix[k][j])
        return distance_matrix
    
    edges = []
    n = 239 #不同节点数
    
    # ... 其他代码不变 ...
    
    # 使用Floyd-Warshall算法计算完整的距离矩阵
    # 将邻接矩阵中的0替换为一个大的数(除对角线以外的0)
    mymatrix1[mymatrix1 == 0] = 1e6
    np.fill_diagonal(mymatrix1, 0)
    distance_matrix = floyd_warshall(mymatrix1)
    
    print(distance_matrix)
    

    问题2:请问第二个和第三个时间段的距离矩阵该怎么修改呢?

    根据问题描述,你需要为每个时间段分别计算一个距离矩阵,然后结合前一个时间段的距离矩阵来更新当前时间段的距离。你可以将代码封装成一个函数,然后为每个时间段调用该函数。这里我为你提供一个简化的函数框架,你可以在此基础上进行修改:

    def get_distance_matrix(filename, prev_distance_matrix=None):
        # 读取CSV文件,生成邻接矩阵,然后计算距离矩阵
        # 如果prev_distance_matrix不为None,根据问题描述更新当前时间段的距离矩阵
        # 返回当前时间段的距离矩阵
    
    distance_matrix_10 = get_distance_matrix('./8_女子学院-10.csv')
    distance_matrix_20 = get_distance_matrix('./8_女子学院-20.csv', prev_distance_matrix=distance_matrix_10)
    distance_matrix_30 = get_distance_matrix('./8_女子学院-30.csv', prev_distance_matrix=distance_matrix_20)
    

    函数get_distance_matrix需要读取CSV文件,生成邻接矩阵,然后计算距离矩阵。当prev_distance_matrix参数不为None时,你需要根据问题描述更新当前时间段的距离矩阵。最后,你可以调用该函数为每个时间段生成距离矩阵。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题