Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 根据节点之间的欧几里德距离指定边权重_Python 3.x_Networkx - Fatal编程技术网

Python 3.x 根据节点之间的欧几里德距离指定边权重

Python 3.x 根据节点之间的欧几里德距离指定边权重,python-3.x,networkx,Python 3.x,Networkx,我正在创建一个包含50个随机创建的节点的完整图形。每个节点定义为笛卡尔坐标,如下所示: n = 50 V = [] V=range(n) random.seed() pos = {i:(random.randint(0,500),random.randint(0,500)) for i in V} 我需要指定每个节点之间的欧几里德距离,因为边权重对应于这对节点 我已经定义了两个节点之间的欧几里德距离,如下所示: points = [] positions = [] for i in pos

我正在创建一个包含50个随机创建的节点的完整图形。每个节点定义为笛卡尔坐标,如下所示:

n = 50
V = []
V=range(n)

random.seed()

pos = {i:(random.randint(0,500),random.randint(0,500)) for i in V}
我需要指定每个节点之间的欧几里德距离,因为边权重对应于这对节点

我已经定义了两个节点之间的欧几里德距离,如下所示:

points = []
positions = []
for i in pos:
    points.append(pos[i])
    positions.append(i)
    positions.append(pos[i])

def distance(points, i, j):
    dx = points[i][0] - points[j][0]
    dy = points[i][1] - points[j][1]
    return math.sqrt(dx*dx + dy*dy)
for u in V:
    for v in V:
        weights = distance(points, u,v)

G = nx.complete_graph(n)
for e in G.edges():
   weights[e] = distance(points, e[0],e[1])
我尝试将欧几里德距离指定为它们的权重,如下所示:

points = []
positions = []
for i in pos:
    points.append(pos[i])
    positions.append(i)
    positions.append(pos[i])

def distance(points, i, j):
    dx = points[i][0] - points[j][0]
    dy = points[i][1] - points[j][1]
    return math.sqrt(dx*dx + dy*dy)
for u in V:
    for v in V:
        weights = distance(points, u,v)

G = nx.complete_graph(n)
for e in G.edges():
   weights[e] = distance(points, e[0],e[1])
但这将返回以下错误

    weights[e] = distance(points, e[0],e[1])

TypeError: 'float' object does not support item assignment

有人能给我一个建议吗

你的问题是

for u in V:
    for v in V:
        weights = distance(points, u,v)
权重
是一个浮点值(比较的最后一对的距离)

现在你知道了

for e in G.edges():
    weights[e] = distance(points, e[0],e[1])
您将浮点
权重
e
th项指定为某物。不允许

我想你想要的是

for u,v in G.edges():
    G[u][v]['distance'] = distance(points, u, v)

请注意,与其定义
,不如将节点设为笛卡尔坐标的元组。参见

除了Joel提到的内容之外,下面是有效的代码

import random
import networkx as nx
import math
import itertools    
import matplotlib.pyplot as plt
n = 50
V = []
V=range(n)

random.seed()

pos = {i:(random.randint(0,500),random.randint(0,500)) for i in V}
points = []
positions = []
for i in pos:
    points.append(pos[i])
    positions.append(i)
    positions.append(pos[i])

def distance(points, i, j):
    dx = points[i][0] - points[j][0]
    dy = points[i][1] - points[j][1]
    return math.sqrt(dx*dx + dy*dy)

G=nx.empty_graph(n)

for u in V:
    for v in V:
        wt = distance(points, u,v)
        G.add_edge(u,v,weight = wt)

nx.draw(G,pos)
edges,weights = zip(*nx.get_edge_attributes(G,'weight').items())
nx.draw(G, pos, node_color='k', edgelist=edges, edge_color=weights, width=1, edge_cmap=plt.cm.Reds)