- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
经过深入研究并基于this , this还有很多建议我实现 k 最短路径算法,以便在大型无向循环加权图中找到第一、第二、第三……第 k 条最短路径。大约2000个节点。
Wikipedia 上的伪代码这是:
function YenKSP(Graph, source, sink, K):
//Determine the shortest path from the source to the sink.
A[0] = Dijkstra(Graph, source, sink);
// Initialize the heap to store the potential kth shortest path.
B = [];
for k from 1 to K:
// The spur node ranges from the first node to the next to last node in the shortest path.
for i from 0 to size(A[i]) − 1:
// Spur node is retrieved from the previous k-shortest path, k − 1.
spurNode = A[k-1].node(i);
// The sequence of nodes from the source to the spur node of the previous k-shortest path.
rootPath = A[k-1].nodes(0, i);
for each path p in A:
if rootPath == p.nodes(0, i):
// Remove the links that are part of the previous shortest paths which share the same root path.
remove p.edge(i, i) from Graph;
// Calculate the spur path from the spur node to the sink.
spurPath = Dijkstra(Graph, spurNode, sink);
// Entire path is made up of the root path and spur path.
totalPath = rootPath + spurPath;
// Add the potential k-shortest path to the heap.
B.append(totalPath);
// Add back the edges that were removed from the graph.
restore edges to Graph;
// Sort the potential k-shortest paths by cost.
B.sort();
// Add the lowest cost path becomes the k-shortest path.
A[k] = B[0];
return A;
主要问题是我还不能为此编写正确的 python 脚本(删除边并将它们正确地放回原位)所以我像往常一样依赖 Igraph 只能走到这一步:
def yenksp(graph,source,sink, k):
global distance
"""Determine the shortest path from the source to the sink."""
a = graph.get_shortest_paths(source, sink, weights=distance, mode=ALL, output="vpath")[0]
b = [] #Initialize the heap to store the potential kth shortest path
#for xk in range(1,k):
for xk in range(1,k+1):
#for i in range(0,len(a)-1):
for i in range(0,len(a)):
if i != len(a[:-1])-1:
spurnode = a[i]
rootpath = a[0:i]
#I should remove edges part of the previous shortest paths, but...:
for p in a:
if rootpath == p:
graph.delete_edges(i)
spurpath = graph.get_shortest_paths(spurnode, sink, weights=distance, mode=ALL, output="vpath")[0]
totalpath = rootpath + spurpath
b.append(totalpath)
# should restore the edges
# graph.add_edges([(0,i)]) <- this is definitely not correct.
graph.add_edges(i)
b.sort()
a[k] = b[0]
return a
这是一个非常糟糕的尝试,它只返回一个列表中的一个列表
我不太确定我在做什么,我已经对这个问题感到非常绝望,在过去的几天里,我对此的看法发生了 180 度的转变,甚至一次。我只是一个尽力而为的菜鸟。请帮忙。也可以建议 Networkx 实现。
附言很可能没有其他可行的方法来解决这个问题,因为我们已经在这里进行了研究。我已经收到了很多建议,我欠社区很多。 DFS 或 BFS 不会工作。图很大。
编辑:我一直在更正 python 脚本。简而言之,这个问题的目的是正确的脚本。
最佳答案
Github 上有 Yen 的 KSP 的 python 实现,YenKSP .充分感谢作者,此处给出了算法的核心:
def ksp_yen(graph, node_start, node_end, max_k=2):
distances, previous = dijkstra(graph, node_start)
A = [{'cost': distances[node_end],
'path': path(previous, node_start, node_end)}]
B = []
if not A[0]['path']: return A
for k in range(1, max_k):
for i in range(0, len(A[-1]['path']) - 1):
node_spur = A[-1]['path'][i]
path_root = A[-1]['path'][:i+1]
edges_removed = []
for path_k in A:
curr_path = path_k['path']
if len(curr_path) > i and path_root == curr_path[:i+1]:
cost = graph.remove_edge(curr_path[i], curr_path[i+1])
if cost == -1:
continue
edges_removed.append([curr_path[i], curr_path[i+1], cost])
path_spur = dijkstra(graph, node_spur, node_end)
if path_spur['path']:
path_total = path_root[:-1] + path_spur['path']
dist_total = distances[node_spur] + path_spur['cost']
potential_k = {'cost': dist_total, 'path': path_total}
if not (potential_k in B):
B.append(potential_k)
for edge in edges_removed:
graph.add_edge(edge[0], edge[1], edge[2])
if len(B):
B = sorted(B, key=itemgetter('cost'))
A.append(B[0])
B.pop(0)
else:
break
return A
关于python - Igraph/networkx 中的 k 最短路径实现(Yen 算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15878204/
我有一个 N x 2 的整数表,称为 games[ , ]。节点/边表转换为图形: net edges g ecount(g) 7 > degree(g, 103, mode="out") 4
我开始评估 igraph 库及其功能。 我需要计算 igraph_de_bruijn() 函数生成的图的哈密顿路径。 igraph 库中是否有任何现成的功能?我不想从头开始实现它。 C中的一个例子将是
我正在尝试像这样深度复制我的 igraph 对象: copy.deepcopy(graph) 其中 graph 是 igraph 对象,一个只有几个顶点的完整图。但是我得到这个错误: Fi
我有一个需要过滤的大图。过滤(子图)后,我最终得到一个子图列表。我需要再次将所有这些子图组合成一个图。我不知道如何组合大列表(近百万个子图) > require(igraph) > graph V(
我有一个简单的问题,函数 community.to.membership 在 igraph 1.0 中是否被弃用了?我可以找到 membership 函数,但它不包括选项 merges、steps 等
我正在使用 R 中的 igraph。我知道我们可以用选定的顶点创建一个子图,但如果这些节点没有直接连接,那么新子图中将不会有边。如果有其他节点(不是顶点列表的一部分)间接连接这两个节点,有没有办法制作
我正在使用 R 中的 igraph。我知道我们可以用选定的顶点创建一个子图,但如果这些节点没有直接连接,那么新子图中将不会有边。如果有其他节点(不是顶点列表的一部分)间接连接这两个节点,有没有办法制作
是否有与此 igraph 等效的 R function在 Python igraph 中? graph_from_data_frame(d, directed = TRUE, vertices = N
a=g.vs(Name_eq="A") b=g.vs(Name_eq="B") 我想在 a 和 b 之间添加一条边,我该怎么做? 最佳答案 好的,我们这里好像有两个问题。一个在问题标题中:“如果我们有
我有一个大型无向加权图,其中包含约 375,000 个节点和约 3,400,000 个边,表示为邻接表(字典的字典)。 例如 A --> (B,2), (C,4) B --> (A,2) C -->
igraph here 中对可用的社区检测算法进行了很好的比较。 .但是,在可以应用于加权边的算法中使用权重存在一些歧义。 通常,边缘权重将被定向,以便更高的权重表明将节点保持在一起(例如友谊的强度)
我在 igraph 中使用了 fastgreedy 算法在加权无向图中进行社区检测。后来我想看看模块化性,不同的方法我得到了不同的值,我想知道为什么。我提供了一个简短的示例,它演示了我的问题: lib
我正在使用 igraph g <- graph_from_adjacency_matrix(adj2, mode = "directed") plot.igraph(g, vertex.size =
我想知道如果 igraph-R 包中没有实现基于模块化聚类的算法,由 Newman 于 2004 年发布:“Fast algorithm for detection community structu
我有一个类似的问题:Reading adjacency lists with isolated nodes using igraph 我想绘制一些没有关系的节点。但是由于某种原因,上面线程中提到的解决
我有一个交互网络,我使用以下代码制作邻接矩阵,随后计算网络节点之间的相异性,然后将它们聚类以形成模块: ADJ1=abs(adjacent-mat)^6 dissADJ1% as.dist %
我想使用 igraph 来探索一些网络数据。我的数据具有以下结构: a <- c(13, 32, NA, NA) b <- c(32, NA, NA, NA) c <- c(34, 13, 32, N
我使用 igraph graph_from_data_frame 函数从数据框构建了一个图。我的前两列代表边缘列表,我还有另一列名为“权重”。还有其他几个属性列。 然后我尝试使用 cluster_fa
我的问题如下: 考虑一个具有 10000 个节点和 4800 条边的无向图。 给定这个图和这个图的一个节点(例如,节点 1),我需要 igraph (R) 中的一个命令来获取这个节点 1 和图中最远节
我已指导 igraph 并想获取所有周期。 girth 函数有效,但只返回最小的周期。 R 中有没有办法在长度大于 3 的图中获取所有循环(没有顶点指向自身和循环) 最佳答案 它不是 igraph 中
我是一名优秀的程序员,十分优秀!