ScalaでDiplomacyの命令解決ライブラリを作成
ScalaでDiplomacyの命令解決ライブラリを作成中。現在行軍フェイズの処理まで作成済み。
jDipがあまりにも古い(10年以上まともにメンテされてない)のでどうにもこうにも使いにくいのでなんとかならんのかと考えていたが,結局Scalaで一から書き起こすことにした。現在DIPLOMACY ADJUDICATOR TEST CASES(DATC)のSection.AからSection.G,つまり行軍フェイズ部分のテストは100%パスしている。行軍フェイズに比べれば撤退フェイズ・調整フェイズはかなり楽なので一山越えた。というところでgithubに登録しておいた。
基本的なデータ構造はjDipをかなり参考にした。地図のデータなどはjDipからそのままコピーしてきた。
jDip自体は先に述べたようにかなり古臭くなっている。なんせJava 1.3とか1.4の時代に書かれていてenumもgenericもないという恐しいものになっている。それは仕方がないが制御構造を例外処理で行うのはひどすぎた。最初はjDipをリファクタリングしてけばなんとかなるかと思ったが目が潰れそうなコードが多いのであきらめた。jDipのコード自体は参考にならなかったが,考え方は参考になった。
Scalaによる実際の作成はライブラリに助けられた部分も大きい。特にscala-graphのおかげでめんどくさいグラフ探索をする必要がなくなったことは非常に楽にしてくれた。parser combinatorはテストケースの作成の手助けとなった。
DATCのテストケースはもちろんエッジケースが記述してあるわけだが,まださらに実際には発生しないだろうが変な行軍を考えれば明確に決定できない例も考えられなくもないなという気はする。輸送と支援がサイクルを構成してサポートカットするようなテストケースはてこずった(6.F.23とか6.F.24)。実際のところ実は現在の公式ルールでは解決できないという説明があったりする。このあたりはややこしくていくつかのルールが提案されていたりする。紙に図を書いてデバッガで状態チェックしながらなかなかめんどくさかった。このあたりは結局命令の依存関係グラフを作成してサイクルを検出して…という処理が必要になる。
最初にjDipのコードを読みだしたのが約1年前で,ダラダラやっていたせいもあるがなんとか目処がつくところまで来た。テスト走らせてIDEが警告表示だらけなのを本当に全部潰せるのかよと思いながらやっていてオールグリーンになってほっとした。次はやっつけ仕事になっている部分をきれいに書き直しつつDATCのSection.H(retriating)とSection.I(Building)の部分を作成しよう。
あとScalaで書いた理由はjDipのようなマルチプラットフォームなGUIまで作りたかったのでScalaにはJavaFX(ScalaFX)があるという理由。GUIまでたどりつくのはかなり先だと思われるが。
- https://github.com/takaki/scdip
- http://web.inter.nl.net/users/L.B.Kruijswijk/ DATC
- http://www.floc.net/dpjudge/?page=Algorithm Diplomacyの行軍解決アルゴリズムだけど完全ではないと思う。