Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 创建一个networkx加权图,并找到权重最小的两个节点之间的路径_Python_Networkx_Graph Theory - Fatal编程技术网

Python 创建一个networkx加权图,并找到权重最小的两个节点之间的路径

Python 创建一个networkx加权图,并找到权重最小的两个节点之间的路径,python,networkx,graph-theory,Python,Networkx,Graph Theory,我有一个涉及图论的问题。为了解决这个问题,我想使用networkx创建一个加权图。目前,我有一个词汇表,其中每个键都是一个节点,每个值都是相关的权重(10到200000左右) 我相信我不需要用网络标准化权重。 目前,我通过添加边创建了一个非加权图: def create_graph(data): edges = create_edges(data) # Create the graph G = nx.Graph() # Add edges G.add_

我有一个涉及图论的问题。为了解决这个问题,我想使用networkx创建一个加权图。目前,我有一个词汇表,其中每个键都是一个节点,每个值都是相关的权重(10到200000左右)

我相信我不需要用网络标准化权重。 目前,我通过添加边创建了一个非加权图:

def create_graph(data):
    edges = create_edges(data)

    # Create the graph
    G = nx.Graph()

    # Add edges
    G.add_edges_from(edges)

    return G
根据我所读的,我可以在边缘添加一个权重。但是,我更希望将权重应用于特定节点,而不是边缘。我该怎么做

想法:我通过添加加权节点来创建图形,然后在节点之间添加边

def create_graph(data, weights):
    nodes = create_nodes(data)
    edges = create_edges(data) # list of tuples

    # Create the graph
    G = nx.Graph()

    # Add edges
    for node in nodes:
        G.add_node(node, weight=weights[node])

    # Add edges
    G.add_edges_from(edges)

    return G
这种方法正确吗?


下一步是找到权重最小的两个节点之间的路径。我找到了这个函数:
networkx.algorithms.shortest\u path.generic.shortest\u path
,我认为这是正确的。但是,它使用边上的权重而不是节点上的权重。有人能给我解释一下这个函数的作用吗?对于networkx,节点上的wieghts和边上的权重之间的区别是什么,以及我如何实现我想要的?谢谢:)

这通常看起来是对的

你可以用。如果您知道路径的源节点和目标节点(请参阅底部的我的注释),则速度会显著加快

要处理边与节点权重的问题,有两个选项。首先请注意,您在路径上的节点总数之后。如果我给每条边一个权重
w(u,v)=w(u)+w(v)
,那么沿着这条边的权重之和是
w(源)+w(目标)+2和(w(v))
,其中节点
v
都是沿途发现的节点。任何具有这些边权重的最小权重的对象都将具有具有节点权重的最小权重

因此,您可以将每个边的权重指定为两个节点的总和

for edge in G.edges():
    G.edges[edge]['weight'] = G.nodes[edge[0]]['weight'] + G.nodes[edge[1]]['weight']
但另一种选择是,输入到
双向_dijkstra
的权重可以是一个将边作为输入的函数。定义自己的函数以给出两个节点权重之和:

def f(edge):
    u,v = edge
    return G.nodes[u]['weight'] + G.nodes[v]['weight']
然后在你的通话中做双向dijkstra(G,source,target,weight=f)

所以我建议的选择是要么给每条边分配一个等于节点权重之和的权重,要么定义一个函数,只为算法遇到的边赋予这些权重。效率方面,我希望找出哪一种算法比编写任何一种算法都好,这需要更多的时间。唯一的性能问题是分配所有权重将占用更多内存。假设内存不是问题,请使用您认为最容易实现和维护的方法



关于双向dijkstra的一些评论:假设你有两个点在距离R的空间中,你想找到它们之间的最短距离。dijkstra算法(默认为最短路径)将探索源点距离D内的每个点。基本上,这就像一个气球在第一个点中心膨胀,直到到达另一个点。这有一个卷(4/3)pir^3。使用双向dijkstra我们将气球以每个气球为中心充气,直到它们接触为止。它们的半径均为R/2。因此体积是(4/3)π(R/2)^3+(4/3)π(R/2)^3,这是原始气球体积的四分之一,因此算法探索了四分之一的空间。由于网络可以具有非常高的有效维度,因此节省的成本通常要大得多。

这通常看起来是正确的

你可以用。如果您知道路径的源节点和目标节点(请参阅底部的我的注释),则速度会显著加快

要处理边与节点权重的问题,有两个选项。首先请注意,您在路径上的节点总数之后。如果我给每条边一个权重
w(u,v)=w(u)+w(v)
,那么沿着这条边的权重之和是
w(源)+w(目标)+2和(w(v))
,其中节点
v
都是沿途发现的节点。任何具有这些边权重的最小权重的对象都将具有具有节点权重的最小权重

因此,您可以将每个边的权重指定为两个节点的总和

for edge in G.edges():
    G.edges[edge]['weight'] = G.nodes[edge[0]]['weight'] + G.nodes[edge[1]]['weight']
但另一种选择是,输入到
双向_dijkstra
的权重可以是一个将边作为输入的函数。定义自己的函数以给出两个节点权重之和:

def f(edge):
    u,v = edge
    return G.nodes[u]['weight'] + G.nodes[v]['weight']
然后在你的通话中做双向dijkstra(G,source,target,weight=f)

所以我建议的选择是要么给每条边分配一个等于节点权重之和的权重,要么定义一个函数,只为算法遇到的边赋予这些权重。效率方面,我希望找出哪一种算法比编写任何一种算法都好,这需要更多的时间。唯一的性能问题是分配所有权重将占用更多内存。假设内存不是问题,请使用您认为最容易实现和维护的方法


关于双向dijkstra的一些评论:假设你有两个点在距离R的空间中,你想找到它们之间的最短距离。dijkstra算法(默认为最短路径)将探索源点距离D内的每个点。基本上,这就像一个气球在第一个点中心膨胀,直到到达另一个点。这有一个卷(4/3)pir^3。使用双向dijkstra我们将气球以每个气球为中心充气,直到它们接触为止。它们的半径均为R/2。因此体积是(4/3)π(R/2)^3+(4/3)π(R/2)^3,这是原始气球体积的四分之一,因此算法探索了四分之一的空间。由于网络可以具有非常高的有效维度,因此节省的成本通常是mu