- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 networkx(用于处理图形的 python 库)。我基本上有具有各种边缘的节点,但想看看如果它使用连接最紧密的节点,路径会是什么样子。
我可以使用这个命令来查看连接数:
len(G.edges(CurrentNode))
我可以获得边的数量,但我不确定如何将其应用到列表中作为路径。例如,我可以将此数字添加为属性,但我认为在查找路径时不会考虑属性,并且因为我是在边连接后添加的,所以我无法将权重添加到边本身。另一个问题是分数越高,我越希望遵循路径,但对于边,我认为它遵循最低权重的边。
我想知道其他人采用什么方法来根据节点的某些特征找到路径?如果有人知道如何为 networkx 执行此操作,那就太好了!但我认为 networkx 有很多特性,所以如果我能得到理论或一般方法,我相信我能找到一种在 python 中实现它的方法。
更新:对不起,我可能解释错了。我知道我可以向节点添加属性,但我不确定如何根据这些属性做出路径决策。所以在我的例子中,基于某些条件,我在节点之间添加边。每组节点代表不同的一天(day1data.., day2data.., day3data..),因此仅当某些规则匹配时,我才将第 1 天的几个节点连接到第 2 天的节点。一旦我连接了边缘,我希望在选择路径时更多地考虑这些边缘。所以我为当天的每个节点添加了一个属性“权重”,它基本上是连接该节点的边的总数。我的问题是,权重属性没有用于任何路径决策,因为它是我自己创建并标记的属性(我可以创建一个名为'abc'='hello world'的标签,它将将该属性应用于节点).在创建路径时如何考虑这个权重(边缘已经创建,所以我认为我不能返回并重新创建它们)?
最佳答案
您当然可以在 NetworkX 中为边添加权重。事实上,您可以为边缘设置任意数据,因为它基本上是一个 dict
。
In [30]: import networkx as nx
In [31]: G = nx.Graph()
In [32]: G.add_edge(1, 2, weight=3, type="green")
In [33]: G[1][2]
Out[33]: {'type': 'green', 'weight': 3}
In [34]: G[1][2]["weight"]
Out[34]: 3
此外,您可以在添加边(或节点)后更改它们的参数。
In [35]: G[1][2]["weight"] = 5
In [36]: del G[1][2]["type"]
In [37]: G[1][2]["color"] = "green"
In [38]: G[1][2]
Out[38]: {'color': 'green', 'weight': 5}
您当然可以根据权重(或权重参数中指定的任何其他属性)计算路径。
In [39]: G.add_edge(1, 3, weight=1)
In [40]: G.add_edge(2, 3, weight=2)
In [41]: G.edges()
Out[41]: [(1, 2), (1, 3), (2, 3)]
In [42]: nx.shortest_path(G, source=1, target=2, weight="weight")
Out[42]: [1, 3, 2]
对于您的情况,确定边缘权重可能很棘手。请记住,加权最短路径通常使用 Djikstra's Algorithm 计算得出。它有利于较小的重量。它还需要正权重。一种可能的解决方案是将 1/max(k_i,k_j)
的权重分配给边 (i,j)
,其中 k_i
, k_j
是节点i
和j
的度数。
计算转移概率上的最短路径的正确方法是转换边权重以表示意外:即概率的负对数。这导致权重为正,然后任何给定的最短路径都被解释为最小化意外。由于 Dijkstra 算法对权重求和,因此它在对数空间中这样做,这意味着它实际上是在乘以概率。为了恢复观察任何给定最短路径的联合概率,您只需取负意外的指数。
关于python - 是否可以在图论中为节点添加权重/概率(使用 networkx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840936/
我正在尝试对网络上的投票动态进行建模,并希望能够在 NetworkX 中创建一个图表,在其中我可以在节点上迭代投票过程,让它们的颜色变化对应于它们的投票“标签”。 我已设法获得此代码以查看每个节点的属
我无法计算简单 NetworkX 加权图的中心性。 这是正常的还是我做错了什么? 我使用简单的 add_edge(c[0],c[1],weight = my_values) 添加边,其中c[0],c[
我想在函数调用 d(n) 之前比较 networkx.Graph 对象 n 的状态(有副作用)之后与国家合作。 有一些可变的对象节点属性,例如 n.node[0]['attribute'],我想对其进
我正在使用 NetworkX 生成一些噪声数据的图表。我想通过删除虚假分支来“清理”图表,并希望避免重新发明轮子。 例如,链接的图片显示了一组示例图形,作为由灰线连接的彩色节点。我想修剪白框指示的节点
我目前正在尝试制定一种算法来在图中查找派系,幸运的是我从 Networkx 找到了一个函数的文档,该函数就是这样做的。不幸的是,变量名有点简洁,我很难理解代码的每一部分的作用。 这里是 find_cl
我正在尝试使用 NetworkX 在两个节点之间添加平行边,但由于以下错误而失败。我究竟做错了什么? import networkx as nx import graphviz g1 = nx.Mul
我希望将 Pajek 数据集转换为 networkx Graph()。数据集来自哥斯达黎加Family Ties 。我正在使用非常方便的 networkx.read_pajek(pathname) 函
我在networkx中有一个巨大的图,我想从每个节点获取深度为2的所有子图。有没有一种好的方法可以使用networkx中的内置函数来做到这一点? 最佳答案 正如我在评论中所说,networkx.ego
我希望将 Pajek 数据集转换为 networkx Graph()。数据集来自哥斯达黎加Family Ties 。我正在使用非常方便的 networkx.read_pajek(pathname) 函
我在使用以下代码时遇到问题。边连接节点。但是是否有可能有一个定向网络,如果一个“人”跟随一个“人”,但它只是一种方式,在边缘有箭头或方向。 plt.figure(figsize=(12, 12)) #
我正在 Windows 机器上使用 Python 3,尽管付出了很多努力,但仍未能安装 pygraphviz。单独讨论。 我有networkx和graphviz模块...是否有一个范例可以在netwo
我正在使用《Python 自然语言处理》一书(“www.nltk.org/book”)自学 Python 和 NLTK。 我在 NetworkX 上被困在第 4 章第 4 部分第 8 部分。当我尝试运
下面是我的代码: import networkx as nx for i in range(2): G = nx.DiGraph() if i==0: G.add_ed
我正在使用 deap 符号回归示例问题中的这段代码,图形显示正常,但我希望节点扩展为圆角矩形以适合文本 自动 . (我不想只是通过反复试验来指定节点大小)。我该怎么做? # show tree imp
我正在尝试使用 networkx 读取 gml 文件(很简单吧?),除非我尝试读取文件时出现错误“networkx.exception.NetworkXError: cannot tokenize u
如何按厚度在networkx中绘制N> 1000个节点的加权网络?如果我有一个源、目标节点和每个边的权重的 .csv 列表,我正在考虑使用该方法: for i in range(N) G.add_ed
我希望 networkx 在我的定向中找到绝对最长的路径, 无环图。 我知道 Bellman-Ford,所以我否定了我的图长度。问题: networkx 的 bellman_ford() 需要一个源节
我在图中有一个节点,它充当一种“临时连接器”节点。我想删除该节点并更新图中的边,以便其所有直接前辈都指向其直接后继者。 在 networkx 中是否有内置功能可以做到这一点,还是我需要推出自己的解决方
我有两张彩色图表。我想确定它们是否同构,条件是同构必须保留顶点颜色。 networkx 中是否有算法可以做到这一点? 这些图是无向且简单的。 最佳答案 检查documentation对于is_isom
我有一组起点-终点坐标,我想计算它们之间的最短路径。 我的起点-终点坐标有时位于一条长直线道路的中间。但是,OSMnx/networkx 计算的最短路径不会考虑中间边到最近节点的路径。 OSMnx 或
我是一名优秀的程序员,十分优秀!