为含50个随机笛卡尔坐标节点的完全图分配欧氏距离边权
生成带欧氏距离权重的50节点完全图
你已经搭好了50节点完全图的基础框架,我来帮你把欧氏距离作为边权重的部分补全。先把你已有的代码整理下(顺手补了import random,不然运行会报错哦):
import random n = 50 V = range(n) # 这里可以直接写成V = range(n),不用先初始化空列表 random.seed() # 用字典存储每个节点的笛卡尔坐标 pos = {i: (random.randint(0, 500), random.randint(0, 500)) for i in V}
接下来要给完全图的每条边分配欧氏距离权重,完全图里每两个不同节点间都有一条边,我们可以用字典来存储边的权重(键为节点对,值为对应距离),下面给你两种实现方式:
方式一:直观循环计算
用嵌套循环遍历所有节点对,借助math.hypot快速计算平面两点的欧氏距离:
import math # 存储边权重的字典,只存储(i,j)且i<j的情况,避免重复计算 edge_weights = {} for i in V: for j in V: if i < j: # 保证每对节点只计算一次 x1, y1 = pos[i] x2, y2 = pos[j] # 计算欧氏距离 distance = math.hypot(x2 - x1, y2 - y1) edge_weights[(i, j)] = distance
方式二:简洁推导式写法
如果喜欢更紧凑的代码,用字典推导式一行搞定:
import math edge_weights = { (i, j): math.hypot(pos[j][0] - pos[i][0], pos[j][1] - pos[i][1]) for i in V for j in V if i < j }
另外,你之前写的points和positions列表其实不用循环生成,直接用字典的方法就能快速获取:
points = list(pos.values()) # 所有节点的坐标列表 positions = list(pos.keys()) # 所有节点的索引列表
这样整个完全图的节点坐标和边权重就都搞定啦~
内容的提问来源于stack exchange,提问作者ccc
相关产品推荐
相关产品推荐

