ならば

音とかで遊んでいたログ

大局将棋の駒の成りの系統樹

大局将棋の駒の成りの関係を表す系統樹を作った。大局将棋を指す人は参考にしてください。
当たり前だけどひとつの駒が成れるのは一回だけなので、歩兵が五回成って最終的に大鷲になれるわけではない。
下のリンク先の画像サイズは3253×2315。


というのは動作確認の結果なので実は内容はどうでもいい。確認したかったのはGraphvizで、小さい連結成分を大量に含むグラフのレイアウトが縦や横に異常に長くならないようにするための方法。

成りの系統樹のように連結成分が多いグラフのdotファイルに対して、特に何の対策も取らずにdotコマンドを実行すると、横に異常に長いレイアウトになる。
オリジナルの画像サイズは13292×539で、このままだと横に長すぎて はてなフォトライフに登録できないので75%に縮小した。


この縦横比を改善するために、いくつかのコマンドを組み合わせて使う。
次のコマンドの出力が最初に挙げた画像。

$ ccomps -x ./in.dot | dot | gvpack -array | neato -n2 -Tpng -o ./out.png

パイプの連結をばらして個別に説明。

  • ccompsコマンド
    前にも書いたけど、グラフの連結成分を分離して、その結果をDOT言語で出力する。デフォルトでは連結成分ごとにサブグラフになるが、-xオプションを付けるとグラフに分離される。
  • dotコマンド
    gvpackコマンドの入力にはレイアウト情報が必要なのでdotコマンドを挟んでレイアウト情報を作る。
  • gvpackコマンド
    複数のグラフをひとつのレイアウトに収めて単一のグラフにして出力する。-arrayオプションを付けると入力元の各グラフを行列のように整列して並べてくれる。デフォルトだと整列せず、密になるように押し込もうとするのでもっとコンパクトにレイアウトされるけど、グラフによっては見にくくなる。
  • neatoコマンド
    gvpackコマンドの結果にはレイアウトとしてノードなどの位置情報が既に含まれているので、これ以上レイアウトを変えてほしくない。そこで、neatoコマンドに-nオプションを付けて、指定した位置情報に基づいてグラフを描画させる。-nだけだと多少の調整が入る(ノード同士が重ね合わさらないように位置をずらすとか)けど、-n2にすると指定した通りの位置情報が保たれる。
    普通は有向グラフはdotコマンドでレイアウトするけど、dotコマンドだと-nオプションは無視されるのでneatoコマンドを使う。


ところで、unflattenコマンドは孤立点が多いときとか木構造でリーフが多いときに全体的なレイアウトの広がりを圧縮したい場合には使えるようだが、今回のケースでは上手くいかなかった。