2010-12-13 13 views
10

Sto cercando il codice Python per la corrispondenza di peso/minimo costo massimo in un grafico bipartito. Ho utilizzato il codice di corrispondenza del peso massimo del caso generale in NetworkX, ma lo trovo troppo lento per le mie esigenze. Ciò è probabilmente dovuto sia al fatto che l'algoritmo generale è più lento, sia al fatto che la soluzione NetworkX è implementata interamente in Python. Idealmente, mi piacerebbe trovare un codice Python per il problema di corrispondenza bipartito che avvolge un po 'di codice C/C++, ma al momento, qualsiasi cosa più veloce dell'implementazione di NetworkX sarebbe utile.Codice di corrispondenza bipartito di costo massimo/minimo in Python

+0

Avete qualche pseudo codice specifico in mente? Potete fornire un esempio di input/output di python? – kevpie

+2

Domanda simile http://stackoverflow.com/questions/4075669/hungarian-algorithm-in-python – Ante

+0

@Kevpie Sono aperto a quasi tutte le interfacce. Il problema del peso massimo è, a sua volta, ben definito (su Wikipedia per esempio http://en.wikipedia.org/wiki/Matching_(graph_theory)#Maximum_matchings_in_bipartite_graphs) quindi non volevo sprecare spazio ridefinendolo. L'input sarebbe un grafico o anche solo una matrice di peso, e l'output sarebbe una corrispondenza tra i vertici bipartito. – nomad

risposta

6

Dopo ulteriori indagini, ho trovato particolarmente utili i seguenti due moduli (http://pypi.python.org/pypi/pyLAPJV/0.3 e http://pypi.python.org/pypi/hungarian). Sono entrambi algoritmi implementati in C++ con collegamenti Python ed eseguiti molto più velocemente rispetto all'implementazione di corrispondenza di NetworkX. L'implementazione di pyLAPJV, tuttavia, sembra essere un po 'troppo volubile per le mie esigenze e non gestisce correttamente i bordi con pesi identici. Il modulo ungherese (anche se apparentemente più lento dell'algoritmo pyLAPJV) esegue circa 3 ordini di grandezza più velocemente dell'implementazione di NetworkX sulle dimensioni dei dati con cui attualmente mi occupo. Darò anche un'altra occhiata al codice suggerito da kunigami, poiché ritengo che possa essere eseguito con Shedskin abbastanza facilmente per dare un'implementazione ragionevolmente veloce.

1

Non troppo sicuro se questo è ciò che si sta cercando, ma è un'implementazione python dell'algoritmo di corrispondenza del grafico bipartito Hopcroft-Karp. In caso contrario, probabilmente può essere un buon punto di partenza per te.

Hopcroft-Karp Bipartite Matching

+0

Grazie per il link Nico. Tuttavia, il problema di corrispondenza massima non è elevato rispetto al problema di corrispondenza del peso massimo; si occupa di trovare il numero massimo di vertici partecipanti, l'intestino non tiene conto dei pesi. – nomad

0

Il peso corrispondente minimo bipartito può essere risolto dall'algoritmo ungherese (wikipedia). Il collegamento nei collegamenti di Wikipedia ad un'implementazione python. Non sono sicuro se sia più veloce del codice che hai citato, però.

+0

Grazie Kunigami, lo controllerò e vediamo come si comporta. – nomad

Problemi correlati