【问题标题】:C++ Boost graph library: Isomorphism with edge propertyC++ Boost 图形库:具有边属性的同构
【发布时间】:2020-11-21 07:25:57
【问题描述】:

boost图形库有一个同构函数和一个非常小的例子:

https://www.boost.org/doc/libs/1_68_0/libs/graph/example/isomorphism.cpp

我需要找到两个图之间具有最小扩展的同构,即每条线都有两个属性,可以用整数值表示。我想这相当于一个重量。

我终其一生都无法理解属性图的作用或如何将它们结合起来。有人可以给我指出一个相关的例子,以便我了解它是如何工作的吗?

【问题讨论】:

  • 我不确定 boost graph 可以处理这个问题。它适用于未标记的图(至少是您尝试使用的函数),而您的图似乎已标记(由两个整数)。
  • 如果你展示了你拥有的代码,那么展示一些东西会容易得多。 R.n.我们甚至必须想出图形模型、样本数据等。
  • 不幸的是,我无法生成这样一个封闭的表单代码,因为它嵌入在一个相当大的项目中。我认为我的问题的意图很明确。

标签: c++ boost graph isomorphism


【解决方案1】:

Boost.Graph 使用“属性图”将数据与不同的图元素(即顶点、边或整个图)相关联。属性映射只是一个容器,可以将图形的内部描述符类型与其他一些数据相关联。可以在herehere 找到一些示例。

我假设您已经看过 the docsisomorphism 函数。因此,在您的情况下,您的每个图表都将有一个用于边权重的属性映射,然后您可以选择在调用 isomorphism 函数来控制行为和/或获取额外数据时提供更多属性映射。但是,我看不到任何方法可以提供谓词来验证边缘权重是否匹配。您可能必须自己处理(例如,首先运行该函数以检查“纯”同构,然后遍历一个图的边并使用输出 isomorphism_map 在第二个图中找到相应的边并检查相等性)

【讨论】:

  • 属性映射不像容器。它们就像知道如何查找/更新数据的引用(例如在容器中)
  • 这是一个很好的建议。不幸的是,在我的情况下,您的建议将行不通。这样做的原因是由于从图中删除了一些信息,因此 isomorphism_map 不是唯一的。因此,如果您选择一个特定的地图,然后检查边缘等效性,您的结果有时为真,有时为假。如果这是真的,那么你很好。但是如果它是假的,这并不排除不同的 isomorphism_map 具有相同的边缘属性。如果有办法让同构函数在找不到匹配项的情况下继续运行,那么这将起作用。
【解决方案2】:

据我所知,该算法不允许您指定边等价标准。不过,也许你可以申请vf2_sub_graph_iso,它需要一个可选的EdgeEquivalencePredicate

【讨论】:

  • 是的,如果我能够将子图定义为整个图或类似的东西,这可能是一个解决方案,我会看到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多