Beginnen Sie mit einer zufälligen Liste von ganzen Zahlen, sagen:Symmetric Bipartite Matching der Elemente in Liste
list = [2,5,7,1,3]
Ziel: maximal jeden Eintrag in der Liste mit einem anderen Eintrag in der Liste paaren. Einträge von Werten (m, n) können angepasst werden, wenn log_base_2 ((m + n)/gcd (m, n)) NICHT eine ganze Zahl ist. I.e. (7,3) ist eine gültige Übereinstimmung, und (1,3) ist es nicht.
Ich bin mir ziemlich sicher, dass ein Weg, dies zu tun wäre, zwei Listen zu generieren, A und B, das entspricht die ursprüngliche Liste:
A=B=list=[2,5,7,1,3]
Und dann behandelt es als ein zweiteiliges Matching Problem mit der zusätzliche Einschränkung, dass, wenn A [m] mit B [n] übereinstimmt, A [n] auch mit B [m] übereinstimmen muss (wiederum zusätzlich zu der obigen Übereinstimmungseinschränkung). Ich würde mir vorstellen, dass eine Visualisierung des resultierenden Flussnetzwerks horizontal symmetrisch wäre (d. H. Entlang der Source-Sink-Achse, daher der Titel).
Ich weiß, wie man ein bipartite Matching-Problem mit MaxFlow löst, kann aber nicht herausfinden, wie diese letzte, fett gedruckte Constraint implementiert wird. Jede Hilfe wäre sehr, äh, hilfreich.
Danke für die Zeiger! Nach einigem Suchen fand ich eine einfachere Implementierung des Edmonds/'Blossom'-Algorithmus, den ich unter Verwendung von http: // code aufwickelte.activestate.com/recipes/221251-maximum-cardinality-matching-in-general-graphs/ Es nutzt Guido Van Rossum die sehr intuitive Graph Struktur: https://www.python.org/doc/essays/graphs/ I hoffe das hilft zukünftigen Lesern! –
@Matt, bitte teilen Sie einen Link zu der einfacheren Implementierung. – snakile
Ich dachte, ich hätte - das sollte es sein: http://code.activestate.com/recipes/221251-maximum-cardinality-matching-in-general-graphs/ –