es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encuentra un subgrafo conectado con n nodos y e aristas en python.

Tengo un conjunto de datos de un grafo no dirigido muy grande en formato .txt, que convertí en un grafo networkx. Necesito extraer un subgrafo conectado que contenga N nodos (y E aristas si es posible, pero no es necesario). ¿Cómo debo hacerlo? Este es el código que escribí para encontrar el subgrafo conectado más grande:

def encontrar_subgrafo(grafo):
  subgrafos_componentes_conectados = (grafo.subgrafo(c) para c en nx.componentes_conectadas(grafo))
  subgrafo_mas_grande = max(subgrafos_componentes_conectados, key=len)
  devolver subgrafo_mas_grande

El subgrafo que quiero está en algún lugar entre el subgrafo mínimo y el subgrafo máximo. Cualquier ayuda será apreciada.

Editar: Puede ser cualquier conjunto de N nodos, no se requieren nodos específicos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para extraer un subgrafo conectado que contenga N nodos de un grafo de networkx, puede modificar el código que ha escrito de la siguiente manera:

    def encontrar_subgrafo_con_n_nodos(grafico, n):
        # obtener todos los subgrafos de componentes conectados
        subgrafos_componentes_conectados = [grafico.subgrafo(c) para c en nx.componentes_conectadas(grafico)]
        # filtrar los subgrafos cuyo recuento de nodos sea mayor o igual a n
        subgrafos_con_n_nodos = filter(lambda g: len(g.nodos()) >= n, subgrafos_componentes_conectados)
        # ordenar los subgrafos por recuento de nodos en orden descendente
        subgrafos_ordenados = sorted(subgrafos_con_n_nodos, key=lambda g: len(g.nodos()), reverse=True)
        # devolver el primer subgrafo de la lista (que tiene al menos n nodos)
        return subgrafos_ordenados[0].copia()
    

    Esta función toma dos parámetros: el grafo de networkx y la cantidad deseada de nodos en el subgrafo. Primero encuentra todos los subgrafos de componentes conectados en el grafo usando el método componentes_conectadas(). Luego filtra los subgrafos cuyo recuento de nodos es menor que n usando la función filter(). Los subgrafos resultantes se ordenan en orden descendente según el recuento de nodos usando la función sorted(). Finalmente, se devuelve el primer subgrafo de la lista (que tiene al menos n nodos) usando el método copia().

    Tenga en cuenta que esta función asume que hay al menos un subgrafo de componentes conectados con n o más nodos. Si este no es el caso, se generará un IndexError. Puede manejar este caso comprobando la longitud de la lista subgrafos_ordenados antes de acceder a su primer elemento.

    También tenga en cuenta que esta función solo considera el número de nodos en el subgrafo, no el número de aristas. Si necesita un subgrafo con un número específico de aristas también, puede modificar el código para incluir esa restricción. Una forma de hacer esto es definir una función personalizada para ordenar los subgrafos en función tanto del recuento de nodos como del recuento de aristas, y utilizar esa función en la llamada a sorted().

Comments are closed.