我想请问一下,现在有三个包含两列节点的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时,你需要根据问题描述更新当前时间段的距离矩阵。最后,你可以调用该函数为每个时间段生成距离矩阵。
人狗大战游戏
#创建一个类(该类的属性会为后面的类继承调用)
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)
(这个小例子重点在掌握面向对象的继承,还有定义函数的方法,以及一些逻辑关系,程序里没有实现让狗攻击人,然后人在攻击狗,完全就是单纯的人打狗。至于函数内定义的狗的攻击力,可以作为是为了学习面相对象的继承。一起加油呀!)