- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想从节点“a”和节点“o”获取所有 LCA 节点。
在这个有向图中,节点"l"和节点"m"是LCA节点。
下面是代码。
import networkx as nx
def calc_length(Graph, node1, node2, elem):
length1 = nx.shortest_path_length(Graph, node1, elem)
length2 = nx.shortest_path_length(Graph, node1, elem)
length_sum = length1 + length2
return length_sum
G = nx.DiGraph() #Directed graph
G.add_nodes_from(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"])
edges = [("a","b"),("b","c"),("b","d"),("a","e"),("a","h"),("e","f"),("e","g"),("e","i"),("h","l"),("h","m"),("g","j"),("o","p"),("o","n"),("n","m"),("n","l"),("n","k"),("p","j"),]
G.add_edges_from([(e[0], e[1]) for e in edges])
preds_1 = nx.bfs_predecessors(G, "a")
preds_2 = nx.bfs_predecessors(G, "o")
common_preds = set([n for n in preds_1]).intersection(set([n for n in preds_2]))
common_preds = list(common_preds)
dic ={}
for elem in common_preds:
length_sum = calc_length(G, "a", "o", elem)
dic[elem] = length_sum
min_num = min(dic.values())
for k, v in sorted(dic.items(), key=lambda x:x[1]):
if v != min_num:
break
else:
print k, v
我想要更快的执行速度。
如果您有比前面提到的更好的方法来解决问题,请告诉我。
我会很感激你的帮助。
最佳答案
这里有几个问题,我已经在评论中指出了其中的一些问题。部分问题在于命名法令人困惑:最低共同祖先(as defined on wikipedia 并且大概在一般计算机科学中)真的应该命名为最低共同后代,以符合 networkx(以及任何理智的网络科学家)使用的命名法据我所知)。因此,您的广度优先搜索应该真正跟随后代,而不是前辈。下面实现这样的 LCA 搜索:
import numpy as np
import matplotlib.pyplot as plt; plt.ion()
import networkx as nx
def find_lowest_common_ancestor(graph, a, b):
"""
Find the lowest common ancestor in the directed, acyclic graph of node a and b.
The LCA is defined as on
@reference:
https://en.wikipedia.org/wiki/Lowest_common_ancestor
Notes:
------
This definition is the opposite of the term as it is used e.g. in biology!
Arguments:
----------
graph: networkx.DiGraph instance
directed, acyclic, graph
a, b:
node IDs
Returns:
--------
lca: [node 1, ..., node n]
list of lowest common ancestor nodes (can be more than one)
"""
assert nx.is_directed_acyclic_graph(graph), "Graph has to be acyclic and directed."
# get ancestors of both (intersection)
common_ancestors = list(nx.descendants(graph, a) & nx.descendants(graph, b))
# get sum of path lengths
sum_of_path_lengths = np.zeros((len(common_ancestors)))
for ii, c in enumerate(common_ancestors):
sum_of_path_lengths[ii] = nx.shortest_path_length(graph, a, c) \
+ nx.shortest_path_length(graph, b, c)
# print common_ancestors
# print sum_of_path_lengths
# return minima
minima, = np.where(sum_of_path_lengths == np.min(sum_of_path_lengths))
return [common_ancestors[ii] for ii in minima]
def test():
nodes = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p"]
edges = [("a","b"),
("b","c"),
("b","d"),
("a","e"),
("a","h"),
("e","f"),
("e","g"),
("e","i"),
("h","l"),
("h","m"),
("g","j"),
("o","p"),
("o","n"),
("n","m"),
("n","l"),
("n","k"),
("p","j"),]
G = nx.DiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
# plot
pos = nx.spring_layout(G)
nx.draw(G, pos)
nx.draw_networkx_labels(G, pos, labels=dict([(c, c) for c in 'abcdefghijklmnop']))
plt.show()
a,b = 'a','o'
lca = find_lowest_common_ancestor(G, a, b)
print "Lowest common ancestor(s) for {} and {}: {}".format(a, b, lca)
return
if __name__ == "__main__":
test()
关于python - NetworkX 的所有最低共同祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39946894/
我正在尝试对网络上的投票动态进行建模,并希望能够在 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 或
我是一名优秀的程序员,十分优秀!