如何在 Networkx 中生成三角形自由图(使用随机种子)?

How to generate a triangle free graph in Networkx (with randomseed)?

在检查了 networkx 的 the documentation on triangles 之后,我想知道是否有一种生成无三角形图的方法比随机生成图形直到恰好出现无三角形图更有效,(特别是如果有人想使用恒定的随机种子)。

下面是生成图形直到它们没有三角形的代码,但具有不同的随机种子。对于 10 个节点的图表,它已经需要大约 20 秒。

def create_triangle_free_graph(show_graphs):
    seed = 42
    nr_of_nodes = 10
    probability_of_creating_an_edge = 0.85
    nr_of_triangles = 1  # Initialise at 1 to initiate while loop.
    while nr_of_triangles > 0:
        graph = nx.fast_gnp_random_graph(
            nr_of_nodes, probability_of_creating_an_edge
        )
        triangles = nx.triangles(G).values()
        nr_of_triangles = sum(triangles) / 3
        print(f"nr_of_triangles={nr_of_triangles}")

    return graph

因此,我想问一下: 有没有更快的方法在 networkx 中生成三角形自由图(使用随机种子)?

一个三角形存在于图中当且仅当由一条边连接的两个顶点共享一个或多个邻居。可以通过在不共享邻居的节点之间添加边来扩展 triangle-free 图。空图是 triangle-free,因此有一个简单的算法来创建 triangle-free 个图。

#!/usr/bin/env python
"""
Create a triangle free graph.
"""

import random
import networkx as nx

from itertools import combinations

def triangle_free_graph(total_nodes):
    """Construct a triangle free graph."""
    nodes = range(total_nodes)
    g = nx.Graph()
    g.add_nodes_from(nodes)
    edge_candidates = list(combinations(nodes, 2))
    random.shuffle(edge_candidates)
    for (u, v) in edge_candidates:
        if not set(n for n in g.neighbors(u)) & set(n for n in g.neighbors(v)):
            g.add_edge(u, v)
    return g

g = triangle_free_graph(10)
print(nx.triangles(g))

结果图中的边数在很大程度上取决于 edge_candidates 的顺序。要获得具有所需边密度的图,请重复该过程,直到找到具有相同或更高密度的图(然后删除多余的边),或者直到您的耐心耗尽。

cutoff = 0.85
max_iterations = 1e+4
iteration = 0
while nx.density(g) < cutoff:
    g = triangle_free_graph(10)
    iteration += 1
    if iteration == max_iterations:
        import warnings
        warnings.warn("Maximum number of iterations reached!")
        break

# TODO: remove edges until the desired density is achieved