スタートは、言う:対称二部マッチングの整数のランダムなリストと
list = [2,5,7,1,3]
は目的:最大限リスト内の別のエントリでリスト内の各エントリをペア。 log_base_2((m + n)/ gcd(m、n))が整数でない場合は、値(m、n)のエントリを照合できます。私。 (7,3)は有効な照合であり、(1,3)は一致しません。
A=B=list=[2,5,7,1,3]
し、次いで二部マッチング問題として扱い:
は私が最初のリストと同等の二つのリスト、AとBを生成することですこれを実行する1つの方法をかなり確信していますA [m]がB [n]と一致する場合、A [n]もB [m]と一致しなければならないという追加の制約(上記の一致制約に加えて)。結果として得られるフローネットワークの視覚化が水平に対称である(すなわち、ソース - シンク軸に沿って、したがってタイトル)ことが想像される。
私はMaxFlowを使用して二部構成のマッチング問題を解決する方法を知っていますが、この最後の太字の制約を実装する方法を理解することはできません。どんな助けも非常に役に立つでしょう。
ポインタありがとうございます!いくつかの検索をした後、私はエドモンズ/ 'ブロッサム'アルゴリズムのより簡単な実装を発見しました: http://コード。activestate.com/recipes/221251-maximum-cardinality-matching-in-general-graphs/ Guido Van Rossumの非常に直感的なグラフ構造を利用しています。 https://www.python.org/doc/essays/graphs/ I将来の読者に役立つことを願っています! –
@Mattより簡単な実装へのリンクをお知らせください。 – snakile
私はやったと思った - これはそれでなければならない: http://code.activestate.com/recipes/221251-maximum-cardinality-matching-in-general-graphs/ –