小编v_0*_*ver的帖子

在保持某些节点的连通性的条件下打破有向图中的循环

我有一个由强连通分量(蓝色)和一组节点(橙色)组成的有向图,它们是它的输入。挑战在于用最少的边缘去除尽可能多的循环。此外,每个橙色节点到每个蓝色节点都必须有一条路径。

我的图

我用蛮力解决了这个问题:

  1. 去除随机边缘
  2. 检查从每个橙色节点到每个蓝色节点的路径。如果一切正常,我会在列表中添加一条边并计算循环数。
  3. 我将边返回到图形并转到步骤 1,直到我遍历所有边
  4. 接下来,从结果列表(长度为 n)我生成组合 C (n, k) 其中 k = {2 ... n}
  5. 我对所有边的组合执行操作 1、2、3

代码的核心如下所示:

    for level in range(2, len(edges)):
        stop = True
        edges2 = combinations(edges,level)
        for i, e in enumerate(edges2):
            g.remove_edges_from(e)

            test = True
            for node in orange_nodes:
                d = nx.algorithms.descendants(g, node)
                test = blue_nodes == d
                if not test:
                    break
            if test:
                stop = False
                cycles_count = len(list(nx.simple_cycles(g)))
                print(f'{i}\t{level}\t{cycles_count}\t{e}')

            g.add_edges_from(e)

        if stop:
            break
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 是否有可能以某种方式优化代码(nx.algorithms.descendants() 和 nx.simple_cycles() 非常慢)?是否可以使用生成树反馈弧集重写代码?
  2. 也许有一种快速搜索算法不是最好的解决方案,而是一个好的解决方案? …

python digraphs networkx

10
推荐指数
1
解决办法
622
查看次数

标签 统计

digraphs ×1

networkx ×1

python ×1