Networking 网络X:考虑网络度量中节点的权重,如介数中心性

Networking 网络X:考虑网络度量中节点的权重,如介数中心性,networking,jupyter-notebook,networkx,network-analysis,Networking,Jupyter Notebook,Networkx,Network Analysis,我最近开始使用NetworkX,出现以下问题 我有一个加权图: 节点具有不同的大小,因为它们表示在办公室工作的人数 办公室之间通过加权边相互连接,加权边表示办公室之间的距离(从一个部门到另一个部门需要多长时间) 我想知道,在哪个办公室(哪个点了点头)放复印机。为了做到这一点,我想使用中间性中心性和接近性中心性的网络度量 问题: 应用这些指标并不困难。然而,它们只考虑边缘的重量(距离),而不考虑办公室工作人员的数量。当然,这一点应该考虑在内,否则影印机将被放置在一个离其他办公室很近的办公室中,

我最近开始使用NetworkX,出现以下问题

我有一个加权图:

  • 节点具有不同的大小,因为它们表示在办公室工作的人数
  • 办公室之间通过加权边相互连接,加权边表示办公室之间的距离(从一个部门到另一个部门需要多长时间)
我想知道,在哪个办公室(哪个点了点头)放复印机。为了做到这一点,我想使用中间性中心性和接近性中心性的网络度量

问题: 应用这些指标并不困难。然而,它们只考虑边缘的重量(距离),而不考虑办公室工作人员的数量。当然,这一点应该考虑在内,否则影印机将被放置在一个离其他办公室很近的办公室中,并且在许多最短的路径上,但所有人的总距离将太远

作为解决方案,我想将office节点细分为代表员工的节点。因此,在同一个办公室工作的人与权重为零的边链接(基本上是堆叠的),而每个员工也与其他办公室的员工链接。基于这个新的图表,我现在可以计算出指标

但是,我不确定这在数学上是否正确,以及我现在如何将员工网络指标转换回办公室网络指标

谢谢你的帮助

请在下面找到一个带有代码的示例:

在这里,您可以看到括号中有5个具有不同权重的节点

将networkx导入为nx
#生成具有5个节点的示例图
G=nx.Graph()
G.add_nodes_from([11,21,31,41,51])
#办公图
G.增加边缘(11,21,重量=3)
G.增加边缘(21,31,重量=2)
G.增加边缘(31,51,重量=4)
G.增加边缘(21,41,重量=1)
G.增加边缘(41,51,重量=5)
nx.绘制网络x(G)
#计算加权贴近度中心度,
CCW=nx.接近度\中心度(G,u=None,距离=,权重',wf\u=True)
特定常规武器
#将节点划分为权重为1的子节点
G.add_节点(22)
G.add_节点(23)
G.add_节点(24)
G.add_节点(32)
G.add_节点(52)
#添加各自的边
G.增加边缘(22,23,重量=0)
G.增加边缘(22,24,重量=0)
G.增加边缘(23,24,重量=0)
G.增加边缘(31,32,重量=0)
G.增加边缘(51,52,重量=0)
G.增加边缘(21,22,重量=3)
G.增加边缘(21,23,重量=3)
G.增加边缘(21,24,重量=3)
G.增加边缘(21,31,重量=2)
G.增加边缘(22,31,重量=2)
G.增加边缘(23,31,重量=2)
G.增加边缘(24,31,重量=2)
G.增加边缘(21,32,重量=2)
G.增加边缘(22,32,重量=2)
G.增加边缘(23,32,重量=2)
G.增加边缘(24,32,重量=2)
G.增加边缘(31,51,重量=4)
G.增加边缘(32,51,重量=4)
G.增加边缘(31,52,重量=4)
G.增加边缘(32,52,重量=4)
G.增加边缘(21,41,重量=1)
G.增加边缘(41,51,重量=5)
G.增加边缘(41,52,重量=5)
nx.绘制网络x(G)
#计算加权贴近度中心度,
CCW_new=nx.贴近度_中心度(G,u=None,distance='weight',wf_improved=True)

CCW1_new
正如我在上面的评论中所说的,在我看来,您希望最小化到复印机的总距离。鉴于该图的性质,我倾向于使用简单、暴力的解决方案。我的做法如下:

import networkx as nx

from itertools import combinations

#Generate example graph with 5 nodes
G = nx.Graph()
G.add_nodes_from([11,21,31,41,51])

#Office-graph
G.add_edge(11,21, weight=3)
G.add_edge(21,31, weight=2)
G.add_edge(31,51, weight=4)
G.add_edge(21,41, weight=1)
G.add_edge(41,51, weight=5)

# let's make sure we know the correct answer by assigning one office 99% of the workforce
office_to_people = {11: 5, 21: 2, 31: 1000, 41:0, 51:10}

node_to_cost = {ii : 0 for ii in G.nodes}
for source, target in combinations(list(G.nodes), 2):
    path_length = nx.shortest_path_length(G, source, target, weight='weight')
    node_to_cost[source] += office_to_people[target] * path_length
    node_to_cost[target] += office_to_people[source] * path_length

office, minimum_cost = sorted(node_to_cost.items(), key=lambda x: x[1])[0]
print(f"{office}")
# 31 

如果你想考虑非统一的影印机使用,那么这个方法可以很容易地扩展到这一点,只要简单地计算每个办公室的影印机总使用量,并将
office\u-to-u-people
替换为等效的
office\u-to-to-u-total\u-use

,假设图表的大小适中,我不会费心去破解接近中心度度量。相反,我会强行提出一个解决方案,使总行程最小化(假设影印机使用量相等)。顺便说一下,我喜欢你的用户名。