如何在LightGraphs(Julia)中向图形添加自由边?

如何在LightGraphs(Julia)中向图形添加自由边?,graph,julia,lightgraphs,Graph,Julia,Lightgraphs,我在Julia中将边添加到一个简单的加权有向图(来自LightGraphs包的一部分SimpleWeightedDiGraph())。有些圆弧是“自由”(空权重)。但是,指定权重0时,不会将其添加为新边,并且最短路径问题不会将其包含在可能的解决方案中。在Julia中,有没有一种简单的方法可以将“自由”边/弧添加到图形中?这种对SimpleLightedGraphs的修改对我很有用: using LightGraphs, SimpleWeightedGraphs # set the size o

我在Julia中将边添加到一个简单的加权有向图(来自LightGraphs包的一部分SimpleWeightedDiGraph())。有些圆弧是“自由”(空权重)。但是,指定权重0时,不会将其添加为新边,并且最短路径问题不会将其包含在可能的解决方案中。在Julia中,有没有一种简单的方法可以将“自由”边/弧添加到图形中?

这种对SimpleLightedGraphs的修改对我很有用:

using LightGraphs, SimpleWeightedGraphs

# set the size of the graph
g = SimpleWeightedDiGraph(3) 

add_edge!(g, 1, 2, 0.5)
add_edge!(g, 2, 3, 0.8)
add_edge!(g, 1, 3, 2.0)

# find the shortest path from vertex 1 to vertex 3 taking weights into account.
enumerate_paths(dijkstra_shortest_paths(g, 1), 3) # gives [1,2,3]

# reweight the edge from 1 to 3 to be "free"
add_edge!(g, 1, 3, 0.0)

enumerate_paths(dijkstra_shortest_paths(g, 1), 3) # gives [1,3]

请注意,顶点必须位于图形中(根据其大小),才能设置其权重,如文档中所述:
?add_edge

关键问题是零值如何在稀疏矩阵中表示(稀疏矩阵是
SimpleWightEdgraph
s的底层数据存储)。尽管底层零值确实在显式设置后保留:

julia> g = SimpleWeightedGraph(6)
{6, 0} undirected simple Int64 graph with Float64 weights

julia> add_edge!(g, 1, 2, 1.0)
true

julia> add_edge!(g, 1, 3, 1.0)
true

julia> add_edge!(g, 1, 3, 0.0)
true

julia> weights(g)
6×6 SparseMatrixCSC{Float64,Int64} with 4 stored entries:
  [2, 1]  =  1.0
  [3, 1]  =  0.0
  [1, 2]  =  1.0
  [1, 3]  =  0.0
如果必须对边缘执行任何操作,则此操作将失败:

julia> collect(edges(g))
1-element Array{SimpleWeightedGraphs.SimpleWeightedEdge{Int64,Float64},1}:
 Edge 1 => 2 with weight 1.0
对于这个问题没有很好的解决方案。我的建议是使用上面建议的足够小的权重来近似零值


(注:初始
add_edge!(g,1,3,0.0)
不起作用的原因是,在Julia中,将新sparsematrix元素的值设置为零是不可行的。)

谢谢你的回答!显然,如果边缘首先添加了非零权重,然后重新权重为零,它就可以工作。但是,如果我从一开始就尝试添加权重为零的边缘,它就不会考虑。我是否遗漏了什么?有没有直接添加自由边缘的方法?查看源代码,我会说设计of
SimpleWeightedGraphs
没有考虑零权重边,因此使用此技巧是有风险的。例如
边(g)< /代码>将不会返回<>代码> 0代码/代码>边缘列表中的权值边缘。如果您想要这个支持,可能需要一个适当的PR到这个包。我将考虑使用重量等于<代码> 5.0E-324作为一个解决方案(尽管它也是一个黑客攻击)。。除非使用非常小的数字,否则不会因舍入而影响最短路径的结果长度。这将产生意外的副作用,因为将权重设置为0.0会有效删除边缘。请参阅我的回答。