【问题标题】:Find all reachable vertices in a Boost BGL graph efficiently有效地查找 Boost BGL 图中的所有可到达顶点
【发布时间】:2018-12-11 12:32:04
【问题描述】:

我是 boost 图形库的新手,正在尝试解决以下问题 问题:

在图中 (boost::adjacency_list) 我有 3 个不同的 顶点类型(使用 std::variant 实现)和当前 无向边:

  1. 连接器 (1)
  2. 开关 (2)
  3. SwitchState (3) - (ON/OFF)

我的图表中典型的层次结构是这样的:

(1a) - (2a) - (1b) - (1d) - (2b) - (1e)
        |                    |
       (3a)                 (3b)
        |                    |
       (1c)

我需要做的是找到所有可到达的顶点 从某个起点(例如 1a):

1a -> 2a -> 1b -> 1d -> 2b -> 1e

当然会立即想到使用 BFS 或 DFS! :-)

但是:顶点 (2) 的状态(开关或继电器) 由直接连接的状态(布尔值)控制 顶点 (3)。这意味着没有办法穿越 如果(3a)(假设)为假,则通过顶点(2a)从(1a)到(1b)。 最后:不能从类型 (2) 遍历到类型 (3) 顶点。

我的问题是:有没有人对如何 有效地实现这样的图遍历?我已经使用大量向量/映射等和 DFS 在普通 C++ 中实现了这一点,但希望将代码移动到底层图形的更高、更抽象(但希望仍然有效)的实现!

我不确定我是否应该:

  1. 使用filtered_graph,只用BFS或DFS遍历?
  2. 然后根据类型 3 顶点状态创建一个子图并应用 BFS/DFS?
  3. 在通过 BFS/DFSvisitor 进行搜索时,是否可以“即时”实现这一目标?
  4. 另一种解决方案?

非常欢迎有帮助的想法!

PS:代码用于模拟电网 - 以防万一。

【问题讨论】:

    标签: c++ boost graph depth-first-search boost-graph


    【解决方案1】:

    使用filtered_graph,只使用BFS或DFS遍历?

    对我来说,“隐藏”关闭边缘的过滤图在概念上似乎最简单。如果你的属性包足够简单(没有动态分配,也没有引用来辅助别名规则),编译器将在优化它方面做得非常出色。

    然后根据类型 3 顶点状态创建一个 sub_graph 并应用 BFS/DFS?

    子图有相当大的开销,所以它们看起来不像你的票。

    在通过 BFS/DFSvisitor 进行搜索时,是否可以“即时”实现这一目标?

    我想是的。您可以让访问者对“examine_edge”事件采取行动,并在颜色图中标记下游顶点。您应该检查算法文档以查看是否记录了颜色图的语义。

    如果是这样,这似乎是最优化的解决方案,尽管从概念上讲它比 filters_graph 方法稍微复杂一些。

    如果没有,我会在基于未记录的实现细节进行优化之前三思而后行。它可能会在未来的版本中中断,或者与例如令人惊讶的交互。库中隐藏的特殊情况。

    【讨论】:

    • 感谢您的回复。对我来说,“访客”的方法似乎是“把东西放在别人的口袋里”。换句话说:我会在我的解决方案和 DFS/BFS 算法的底层实现细节之间通过动态操作 colomap 来创建一个强耦合。恕我直言,采用过滤图路线是解决问题的一种更通用的方法,最终实现将比“访问者”方法更易于维护。我想我会试试的。 :-)
    • 不能再同意了。
    猜你喜欢
    • 2019-05-20
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多