1

术语注释:“顶点”=“节点”,“顶点/节点标签”=“索引”

LightGraphsJulia 在生成诱导子图时会更改节点索引。

例如,如果一个图有节点[1, 2, 3, 4],它LightGraphs.induced_subgraph由节点诱导的[3,4]将是一个新图,其中节点[3,4]被重新标记为[1,2]

在最先进的图算法中,使用递归子图,修改节点集并在递归层上下传递。为了让这些算法正确跟踪节点身份(标签),子图不能更改索引。

例如,在 Python 中进行子图会networkx保留节点标签。

可以MetaGraphs通过添加节点属性来使用,:id该属性通过子图保留,但是您必须编写大量额外的代码来在节点索引和节点之间进行转换:id

当涉及到子图和保留节点身份时,是否没有一个“正常工作”的 Julia 包?

4

1 回答 1

2

我想借此机会在这里澄清一些术语:LightGraphs 本身并不规定图形类型。它是算法和接口规范的集合。您看到的限制是针对 SimpleGraphs,它是 LightGraphs 包附带的一种图形类型,是 和 的默认Graph类型DiGraph

这很重要的原因是(或至少应该)很容易创建一个完全符合您想要的图形类型并且可以利用现有的 LightGraphs 基础设施。您(理论上)需要做的就是实现src/interface.jl. 如果你正确地实现它们,所有的 LightGraphs 算法都应该只是工作(tm)(尽管它们可能不是高性能的;这取决于你选择的数据结构和你做出的接口决定)。

所以 - 我的建议是编写你想要的图形结构,并实现十几个接口函数,看看哪些有效,哪些无效。如果存在与您的接口实现中断的现有算法,请提交错误报告,我们会看到问题出在哪里。

于 2019-12-08T04:47:43.517 回答