Floating Log 2012/12

2012-12-30

二部グラフ最大マッチング列挙

二部グラフ G=(U, V, E) を与えられたときに、その最大マッチングを列挙するプログラムを書いた (nxbimatch @ bitbucket.org)。 力ずくで探索するのに欲しかったのだが、意外にそういうプログラムが見当たらなかったからだ。

二部グラフ最大マッチングを一つ取り出すアルゴリズムはよく知られていて、Hopcroft-Karp のアルゴリズムが \(O(n^{5/2})\) 時間で走る(\(n\) は頂点数)。

列挙するアルゴリズムは Uno の一つ当たり \(O(n)\) 時間のものが知られているが、計算量を落とすための工夫がややこしい。 工夫を落とすと計算量としては一つ当たり \(O(m)\) 時間しか保証できない(\(m\) は辺数)。 が、自分が考えたい二部グラフが次数制限付き、つまり辺数が頂点数の定数倍以内なので、実質的にこれで \(O(n)\) 時間が達成できる。 ということでこのわりと素朴なアルゴリズムを実装した。

アルゴリズムは以下のようになる。

GEN_MAXIMUM_MATCHING(G):

  1. G の最大マッチングを(Hopcroft-Karp で)一つ見つけ、M とする。
  2. G の辺に M は U から V, それ以外は V から U と向きを付けた有向グラフを D とする。
  3. GEN_MAXIMUM_MATCHING_ITER(D,M)

GEN_MAXIMUM_MATCHING_ITER(D,M):

  1. D に辺がなければ終了。
  2. D にサイクルがなければ、 GEN_MAXIMUM_MATCHING_ITER_PATH(D,M)
  3. サイクルの一つを C とし、C に沿って M の辺を交換したマッチングを M' とし、M' を出力する。
  4. C と M の共通辺の一つを e とする。
  5. D から e および e と端点を共有する全ての辺を取り除いたグラフを D+ とし、GEN_MAXIMUM_MATCHING_ITER(D+,M)
  6. D の辺を C に沿って反転し e を取り除いたグラフを D- とし、GEN_MAXIMUM_MATCHING_ITER(D-,M')

GEN_MAXIMUM_MATCHING_ITER_PATH(D,M):

  1. D に辺がなければ終了。
  2. D に長さ 2 の交替パスが存在しなければ終了。
  3. 長さ 2 の交替パスの一つを P とし、M に含まれる辺を e, 含まれない辺を f とする。
  4. M から e を取り除いて f を加えたものを M' とし、M' を出力する。
  5. D から f を取り除いたグラフを D- とし、GEN_MAXIMUM_MATCHING_ITER_PATH(D-,M)
  6. D から f および f と端点を共有する全ての辺を取り除いたグラフを D+ とし、GEN_MAXIMUM_MATCHING_ITER_PATH(D+,M')

素朴でない実装は、計算量を落とすために GEN_MAXIMUM_MATCHING_ITER の 3 でサイクルを"上手く"選択する。

アルゴリズムの中でいくつもの有向グラフを次々に作っているが、グラフの実装として採用した NetworkX ではコピーが非常に重たい操作なので、辺を抜いたり戻したりを繰り返す方が速い。 プログラムを読んで、一番直観的でない部分は多分ここ。

参考文献:

posted at 13:58:40
 
2012-12-24

Gentoo Prefix 翻訳

Gentoo Prefix の翻訳を進めた。 プロジェクトトップページ を更新し、 ブートストラップ手順 を新しく翻訳した(古い Mac 用ブートストラップ手順はお払い箱だ)。

ブートストラップは本当に手軽になった。 ブートストラップ・スクリプトをダウンロードして、chmod して走らせると、二つか三つ質問(インストール場所はどこがいいかとか)に答えれば自動でインストールしてくれる。

posted at 00:17:20
 
2012-12-22

定数配分

総選挙も終わったが、また定数配分を巡って訴訟が起こされている。 (たとえば 衆院選無効求め提訴=「1票の格差」で広島の弁護士―午後、全国一斉に とか)

ところで議員定数の配分自体を法で決める必要性はどこにあるんだろう。 全体の定数と選挙制度そのものと配分アルゴリズムを法で決めれば、あとは国勢調査ごとにアルゴリズムを実装したプログラムを動かして配分を決定するぐらい役人任せでいいのではないか。 アルゴリズムを決める際には、選挙区同士の格差何倍以内とか、選挙区に飛び地ができないようにするとか、そういった制約を事前に決めてしまう。 その方が簡単だと思うのだが。

posted at 13:37:20
12月 2012
       1
2 3 4 5 6 7 8
9101112131415
16171819202122
23242526272829
3031     
11月
2012
 4月
2013

浮遊する思考・浮遊する言葉を拾い集めて記録しておくページ。

Python
Desktop
Server

© 2012-2013, Matsui Fe2+ Tetsushi