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)

本人结合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时,你需要根据问题描述更新当前时间段的距离矩阵。最后,你可以调用该函数为每个时间段生成距离矩阵。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7472443
  • 除此之外, 这篇博客: python小白自学基础知识(二)附加(人狗大战游戏)中的 根据函数和面向对象(类)的知识,概括为一个总的例子(该例子我在其他的文章中见过),作为上课的内容,老师要求实现人狗大战游戏代码编写,内容中包含:人初始化的金钱额度,金钱用于买枪,枪对狗的伤害,以及狗的血量,最后是人在多少次把狗打死(其中没有涉及到人打狗的同时,狗也在咬人,但是却定义了狗对人的伤害,有兴趣的朋友可以继续把游戏做下去) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 人狗大战游戏

    #创建一个类(该类的属性会为后面的类继承调用)
    class lable:
        def __init__(self, name, aggr, hp):  #类属性
            self.name = name
            self.aggr = aggr
            self.hp = hp
    
    class dog(lable):  #创建狗的类,并且继承lable(父类)的属性
        def __init__(self, name, aggr, hp, kind):
            lable.__init__(self, name, aggr, hp)
            self.kind = kind
    	#定义狗的攻击方法
        def attack(self, person):
        	#人的血等于人当前的血量减去狗的攻击力
            person.hp -= self.aggr
    
    class person(lable): #创建人的类,同样继承lable(父类)的属性
        def __init__(self, name, aggr, hp, sex):
            lable.__init__(self, name, aggr, hp)
            self.sex = sex
            #初始化人的钱为0
            self.money = 0
    	#定义人的攻击方法,参数对象是狗
        def person_attack(self, dog):
        	#狗的血量等于狗当前的血量减去人的攻击力
            dog.hp -= self.aggr
    	#定义人买枪的方法
        def person_gun(self, gun):  
            if self.money >= gun.g_price:
            	#如果钱够就买枪
                self.money -= gun.g_price
                self.gun = gun
                #枪的攻击力赋值与人的攻击力
                self.aggr = gun.g_aggr
            else:
                print('余额不足,请充值金额打狗!')
    
    class gun:  #创建gun枪的类
    	#类属性 记录子弹数量,初始化为0
        num_bullet = 0
        def __init__(self, name, aggr, zds, price):
            self.g_name = name
            self.g_aggr = aggr
            self.g_zds = zds
            self.g_price = price
     	def hand_w(self,dog):
     	#定义人开枪的方法
     		while self.g_zds > 0:#保证子弹数一直是正数
     			if dog.hp > 0:
     				#人用枪打狗,伤害为枪伤害的二倍
     				dog.hp -= self.g_aggr * 2
         			self.g_zds -= 1
                    gun.num_bullet += 1
                    print('正在使用武器攻击(伤害为{}的二倍)!'.format(self.g_aggr))
                    print('当前{}的血条为{}'.format(dog.name,dog.hp))
                else:  # 防止程序陷入死循环
                    break
    #创建实例对象
    zangao = dog('zangao', 100, 200, '咬人')
    tom = person('tom', 50, 10, '打狗')
    m4a1 = gun('m4-a1', 20, 3, 500)
    tom.money += 1000
    #假想藏獒不攻击人类,只有人类用枪打狗的过程
    # 构造一个循环体,当[zangao]的hp<=0时,退出循环
    # 固定子弹数量
    bullet_full = m4a1.g_zds
    while zangao.hp > 0:
        # 使用gun攻击
        # 判断tom是否还有钱购买枪攻击zangao,如果没有终止循环
        while tom.money >= m4a1.g_price:
            # 购买武器
            tom.person_gun(m4a1)
            # 我们需要重置一下子弹的数量
            m4a1.g_zds = 3
            # 使用武器攻击(hand_w方法自带判断,这里不用加判断了)
            m4a1.hand_w(zangao)
            
    #输出消耗打狗的总子弹数
    print('使用子弹数量为[%d]' % gun.num_bullet)
    

    (这个小例子重点在掌握面向对象的继承,还有定义函数的方法,以及一些逻辑关系,程序里没有实现让狗攻击人,然后人在攻击狗,完全就是单纯的人打狗。至于函数内定义的狗的攻击力,可以作为是为了学习面相对象的继承。一起加油呀!)