2010-12-13 16 views
10

Estoy buscando el código de Python para la correspondencia entre el peso máximo y el costo mínimo en un gráfico bipartito. He estado usando el código de coincidencia de peso máximo de casos generales en NetworkX, pero estoy resultando demasiado lento para mis necesidades. Esto probablemente se deba al hecho de que el algoritmo general es más lento y al hecho de que la solución NetworkX se implementa por completo en Python. Idealmente, me gustaría encontrar un código Python para el problema de correspondencia bipartita que envuelve algún código C/C++, pero en este momento, cualquier cosa más rápida que la implementación de NetworkX sería útil.Código de correspondencia bipartita de peso máximo/mínimo en Python

+0

¿Tiene alguna pseudo código específico en mente? ¿Puedes proporcionar un ejemplo de entrada/salida de Python? – kevpie

+2

Pregunta similar http://stackoverflow.com/questions/4075669/hungarian-algorithm-in-python – Ante

+0

@Kevpie Estoy abierto a casi cualquier interfaz. El problema del peso máximo es, en sí mismo, bien definido (en Wikipedia, por ejemplo, http://en.wikipedia.org/wiki/Matching_(graph_theory)#Maximum_matchings_in_bipartite_graphs), por lo que no quería perder espacio redefiniéndolo. La entrada sería un gráfico o incluso solo una matriz de peso, y la salida sería una coincidencia entre los vértices bipartitos. – nomad

Respuesta

6

Después de algunas investigaciones adicionales, he encontrado los siguientes dos módulos particularmente útiles (http://pypi.python.org/pypi/pyLAPJV/0.3 y http://pypi.python.org/pypi/hungarian). Ambos son algoritmos implementados en C++ con enlaces de Python, y se ejecutan mucho más rápido que la implementación de coincidencia de NetworkX. La implementación de pyLAPJV, sin embargo, parece ser un poco voluble para mis necesidades y no maneja adecuadamente los bordes con ponderación idéntica. El módulo húngaro (aunque supuestamente más lento que el algoritmo pyLAPJV) ejecuta aproximadamente 3 órdenes de magnitud más rápido que la implementación de NetworkX en los tamaños de datos con los que actualmente estoy tratando. También voy a dar otra mirada al código sugerido por kunigami, ya que creo que se puede ejecutar a través de Shedskin con bastante facilidad para dar una implementación razonablemente rápida.

1

No estoy seguro si esto es lo que está buscando, pero es una implementación de Python del algoritmo de comparación de gráficos bipartitos Hopcroft-Karp. De lo contrario, probablemente sea un buen lugar para comenzar.

Hopcroft-Karp Bipartite Matching

+0

Gracias por el enlace Nico. Sin embargo, el problema de coincidencia máxima es mayor que el problema de coincidencia de peso máximo; se trata de encontrar el número máximo de vértices participantes, el intestino no toma los pesos en cuenta. – nomad

0

El peso mínimo coincidente bipartito se pueden resolver por el algoritmo húngaro (wikipedia). El enlace en wikipedia se vincula a una implementación de python. Aunque no estoy seguro si es más rápido que el código que mencionaste.

+0

Gracias Kunigami, lo verificaré y veré cómo funciona. – nomad

Cuestiones relacionadas