Colorante gráfico codicioso en Python -- python campo con algorithm campo con graph camp codereview Relacionados El problema

Greedy Graph Coloring in Python


5
vote

problema

Español

GRAPH COLORING ALGORITHM (codicioso / Welsh Powell)

Estoy tratando de aprender gráficos, y no pude encontrar una implementación de Python del algoritmo de Welsh Powell en línea, así que traté de escribir mi propia. Aquí están los pasos.

  1. ordenar los nodos en grado descendente. (La mayoría de los vecinos ... menos vecinos)
  2. Para cada nodo, verifique los colores de los nodos vecinos y marquelos como no están disponibles.
  3. Elija el color más bajo disponible. (de [0, 1, 2, ..., len (gráfico) -1])

  def color_nodes(graph):   # Order nodes in descending degree   nodes = sorted(list(graph.keys()), key=lambda x: len(graph[x]), reverse=True)   color_map = {}    for node in nodes:     available_colors = [True] * len(nodes)     for neighbor in graph[node]:       if neighbor in color_map:         color = color_map[neighbor]         available_colors[color] = False     for color, available in enumerate(available_colors):       if available:         color_map[node] = color         break    return color_map   if __name__ == '__main__':   graph = {     'a': list('bcd'),     'b': list('ac'),     'c': list('abdef'),     'd': list('ace'),     'e': list('cdf'),     'f': list('ce')   }   print(color_nodes(graph))   # {'c': 0, 'a': 1, 'd': 2, 'e': 1, 'b': 2, 'f': 2}   

ejemplo

Para el gráfico de entrada, produjo el resultado anterior. ¿La implementación es correcta?

Original en ingles

Graph Coloring Algorithm (Greedy/ Welsh Powell)

I am trying to learn graphs, and I couldn't find a Python implementation of the Welsh Powell algorithm online, so I tried to write my own. Here are the steps.

  1. Order the nodes in descending degree. (Most neighbors ... Least neighbors)
  2. For each node, check the colors of neighbor nodes and mark them as unavailable.
  3. Choose the lowest available color. (from [0, 1, 2, ..., len(graph) -1])

def color_nodes(graph):   # Order nodes in descending degree   nodes = sorted(list(graph.keys()), key=lambda x: len(graph[x]), reverse=True)   color_map = {}    for node in nodes:     available_colors = [True] * len(nodes)     for neighbor in graph[node]:       if neighbor in color_map:         color = color_map[neighbor]         available_colors[color] = False     for color, available in enumerate(available_colors):       if available:         color_map[node] = color         break    return color_map   if __name__ == '__main__':   graph = {     'a': list('bcd'),     'b': list('ac'),     'c': list('abdef'),     'd': list('ace'),     'e': list('cdf'),     'f': list('ce')   }   print(color_nodes(graph))   # {'c': 0, 'a': 1, 'd': 2, 'e': 1, 'b': 2, 'f': 2} 

example

For the input graph, it produced the above result. Is the implementation correct?

        

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

PEP 8, la guía oficial de Python Style, dice que La sangría debe ser 4 Espacios por nivel . Dado que Whitespace es significativo en Python, esa es una convención bastante fuerte.

La implementación podría ser menos verbosa:

  • a-zA-Z0-95 podría acortarse a a-zA-Z0-96 .
  • En lugar de definir a-zA-Z0-97 como una lista de booleans, puede definir a-zA-Z0-98 como conjunto, idealmente usando un Expresión del generador .
  • El bucle que asigna a-zA-Z0-99 se puede simplificar a {0 .
  {1  
 

PEP 8, the official Python style guide, says that indentation should be 4 spaces per level. Since whitespace is significant in Python, that is a pretty strong convention.

The implementation could be less verbose:

  • sorted(list(graph.keys()), xe2x80xa6) could be shortened to sorted(graph, xe2x80xa6).
  • Instead of defining available_colors as a list of booleans, you could define taken_colors as a set, ideally using a generator expression.
  • The loop that assigns color_map[node] can be simplified down to next(generator expression with a condition).
def color_nodes(graph):     color_map = {}     # Consider nodes in descending degree      for node in sorted(graph, key=lambda x: len(graph[x]), reverse=True):         neighbor_colors = set(color_map.get(neigh) for neigh in graph[node])         color_map[node] = next(              color for color in range(len(graph)) if color not in neighbor_colors         )     return color_map 
 
 
 
 

Relacionados problema

5  Vertiendo agua entre dos jarras para obtener una cierta cantidad en una de las jarras  ( Pouring water between two jugs to get a certain amount in one of the jugs ) 
Escribí una solución para un problema de jarra (dado que dos jarras de agua de diferentes tamaños encuentran los pasos necesarios para obtener una cantidad es...

3  Amplitud Primera búsqueda Python Implementación  ( Breadth first search python implementation ) 
Tengo la siguiente implementación del algoritmo BFS, en el que he usado //C# Syntax here public string Reverse(string s) { char[] arr = s.ToCharArray(); ...

2  Pequeño marco de búsqueda de ruta genérica en Java  ( Small generic path search framework in java ) 
Tengo esta pequeña biblioteca de búsqueda de ruta genérica. No es perfecto en absoluto, así que necesito algunos comentarios para tener la oportunidad de mejo...

1  BFS secuencial Java  ( Java sequential bfs ) 
Actualmente estoy trabajando para optimizar mi código. Para hacerlo, tengo que asegurarme de que mi BFS secuencial funcione perfectamente. Luego, debo aplicar...

4  Algoritmo a gráficos conectados al grupo  ( Algorithm to group connected graphs ) 
Estoy trabajando en un algoritmo, que debe agrupar arcos conectados. La situación se describe a través de ejemplos de código a continuación. Tengo arcos: ...

31  Un algoritmo de búsqueda  ( A search algorithm ) 
NodeData8 almacena toda la información del nodo que necesita el AStar algoritmo. Esta información incluye el valor de _cache0 , _cache1 y 998877665...

4  Una implementación de gráficos en C ++  ( A graph implementation in c ) 
Estoy construyendo un gráfico genérico. Quiero saber si el diseño actual está bien. ¿Hay alguna pérdida de memoria? Cualquier sugerencia es profundamente apre...

0  Código de número de rutas posible de la longitud dada entre 2 nodos dados  ( Code for number of routes possible of the given length between 2 given nodes ) 
Recientemente me encontré en este problema , aquí hay un extracto de eso, Es bien sabido que el algoritmo de enrutamiento utilizado en Internet es altam...

5  "Investigador Hatim es el desafío" correcto o incorrecto "  ( Researcher hatim is right or wrong challenge ) 
Escribí un programa para resolver un problema, no soy tan bueno en Python, así que quiera ayuda para encontrar áreas donde este programa se pueda mejorar o si...

3  Implementación del algoritmo de DIJKSTRA para encontrar el camino más corto en gráfico  ( Implementation of dijkstras algorithm to find the shortest path in graph ) 
Esta es mi implementación del algoritmo de Dijkstra en C ++. Por favor aclare Si el diseño de la clase es adecuado o si necesita mejorarse. Estoy codif...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos