简单介绍一下我想生成的具体数据集内容:
- 数据集由10张图组成。
- 每张图都有30个节点,且每个节点都有唯一的序号表示。
- 在边方面,1-10节点按顺序相连并形成闭环(11-20相连, 21-30相连)。
- 每个节点的属性(针对我的问题)有位置信息和速度信息。
首先随机生成节点的位置信息和速度信息:
import numpy as np
import dgl
# 生成节点的速度矩阵, 并按照一定方式将速度取负
def speed_inital(speed_size, num_graph, n):
speed = np.random.randint(70, 80, size=speed_size)
# 将节点在X轴和Y轴方向的速度控制在70-80之间,
for j in range(num_graph):
for i in range(n):
weights_Vx = np.random.randint(-1, 1)
# 随机将节点在X轴和Y轴方向的速度取负
if weights_Vx < 0:
speed[j, i, 0] = speed[j, i, 0] * -1
weights_Vy = np.random.randint(-1, 1)
if weights_Vy < 0:
speed[j, i, 1] = speed[j, i, 1] * -1
return speed
num_graph = 10 # 定义数据集中图的数量
n = 30 # 定义图的节点数量为30
#设计节点的位置和速度的集合形状, 单位分别为
location_size = [num_graph, n, 2] m和m/s
speed_size = [num_graph, n, 2]
# 使用numpy随机生成节点的特征
location = np.random.randint(0, 6000, size=location_size) # 随机生成无人机的二维坐标, 范围是[0, 6000), 单位是米
speed = speed_inital(speed_size, num_graph, n)
然后生成OrderedGraph实例,再将节点,节点特征和边添加进去
# 得到OrderedGraph类型、节点图, 其中包含了边和各个节点的特征
# nx_graph包含了节点, 边和节点的属性, 可以通过nx_graph[0].nodes[0]['feat']来查看第一张图中第一个节点的属性
nx_graph, locaiton_dict = graph_draw(num_graph, n, location, speed)
def graph_draw(num_graph, n, location, speed)
:
nodes = list(range(n))
# 设计边
edges = []
for i in range(9):
edges.append((i, i + 1))
edges.append((9, 0))
for i in range(10, 19):
edges.append((i, i + 1))
edges.append((19, 10))
for i in range(20, 29):
edges.append((i, i + 1))
edges.append((29, 20))
# 创建包含OrderedGraph实例的集合, 后面往该集合中添加图
nx_graph_set = []
location_dict = dict()
for j in range(num_graph):
location_nodes = np.array(location[j]) # 将location转换为numpy数组,方便后面的操作
location_dict[j] = dict(zip(nodes, location_nodes)) # 获取节点和坐标之间的映射关系, 用字典表示, 键为节点序号, 键值为节点的坐标
nlabels = dict(zip(nodes, nodes)) # 标签字典, 构建节点与标识点之间的关系
# 创建OrderedGraph实例
nx_graph = nx.OrderedGraph()
# # 向实例中添加节点以及节点的属性
for i in range(n):
nx_graph.add_node(i, feat = (location[j][i][0], location[j][i][1], speed[j][i][0], speed[j][i][1]))
nx_graph.add_edges_from(edges) # 向实例中添加边
nx_graph_set.append(nx_graph) # 将单张图添加到图的集合中
return nx_graph_set, location_dict
最后将得到的OrderedGraph图转换成dgl图
# 将nx_graph图转换成dgl格式
def turn_GraphTo_dgl(nx_graph, num_graph):
graph_dgl = []
# nx_graph是列表, 因为其含有多张图, 所以不能一次性通过from_networkx将图片全部转为dgl图
for i in range(num_graph):
graph_dgl_single = dgl.from_networkx(nx_graph=nx_graph[i], node_attrs=['feat'])
graph_dgl.append(graph_dgl_single)
return graph_dgl
graph_dgl = turn_GraphTo_dgl(nx_graph, num_graph)
最终得到符合要求的dgl类型数据集,至于数据集的标签,我还没有得到,不过可以通过上面加入节点特征的方式把标签加进去,例如下面代码:
nx_graph.add_node(i, feat = (location[j][i][0], location[j][i][1], speed[j][i][0], speed[j][i][1]), labels = labels[i]) # 表示第j张图中第i个节点的标签为labels[i]