https://bitbucket.org/opuctplab/procon25
- 2014年に行われた第25回高専プロコンで使用した府大高専のソルバ群になります.
- 開発に携わったメンバーは @kyuridenamida, @refiute, @kagasantwi, @mecha_g3 です.
- 解説スライド: http://www.slideshare.net/opuctplab/h25-40607479
- このプログラムが残した結果は,高専プロコン優勝・NAPROCK 国際プロコン準優勝でした.
- 決勝戦の一部の動画が次のURLから閲覧可能です. https://youtu.be/RkXWYu1_RHw?t=8m35s
- http://www.procon.gr.jp/uploads/procon25/Apply25.pdf 内の 9 ページ目に詳細が書かれています.
- 画像スライドパズルの発展形のような課題です.主な特徴は以下の通りです.
- 同じ大きさのピースに分割されたバラバラな画像が与えられるが,パズルを解く前に元の画像を推測しなければならない.
- 分割の最大サイズは 16×16 で,これは力まかせ法で最適解を出すのは到底不可能なサイズである.
- スライドパズルでは空きマスを動かすことしかできなかったが,この課題では空きマスは存在せず,その代わりどんなマスをも空きマスのように動かす対象として選んで良く,複数回(最大で16回)選びなおすことができる.一度の移動は,選んだマスを上下左右のマスと入れ替える操作として定義される.
- 解の評価は,一致数(パズルの復元度合い)を再優先要素とし,同じ場合はペナルティの総和で競う.移動・再選択・解の提出経過時間の3つの要素に重み付けがなされており,ペナルティはそれらの重み付き総和である.
- 開発はCUI部分(画像解析・パズル解析)に関しては C++11 を使用し,GUI 部分に関しては C# を使用しました.
- 基本的には使用したフレームワークは .NET Framework のみです.
- 私(kyuridenamida)が主に携わったのは画像解析の部分よりも,パズルを解く部分のアルゴリズムの設計と改善です.
- 動かし方を制限し,多項式時間計算量で停止するような戦略を考えました.
- 戦略の詳細はREADME冒頭で貼った解説スライドを参照して頂くとわかりやすいと思います.
- parserディレクトリ: ppmを画像解析してパズル問題ファイル(独自フォーマット)に変換するプログラム
- Proディレクトリ: 本番で使用したGUI
- solverディレクトリ: パズル問題ファイルを解くパズルのソルバー
- 実際に動作させるためには,database.zip を解凍しなくてはなりません.解凍すると 4GB 程度になります.
- ただし,database.zipは含まれていない(容量が大きすぎるためgithubにアップロードできなかった)ので,cloneはクローン元から行ってください.