Code iq interpretation_tanaka_publish

2,478 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,478
On SlideShare
0
From Embeds
0
Number of Embeds
1,986
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Code iq interpretation_tanaka_publish

  1. 1. 株式会社フィックスターズ 「最適解を目指せ!!」 (ナンプレ盤面問題) 解法の説明 田中伸明
  2. 2. 自己紹介 田中伸明 Twitter等:tomerun 元々はパズル的な数学が好きだったことから、「コン ピューターサイエンスの応用みたいな事がしたいなー」 と思いソフトウェアエンジニアになる 2008年頃からTopCoderやGoogle Code Jam等に参 加、その縁もあって今年からフィックスターズへ それ以前はパッケージソフト開発など この問題のような、いわゆる"マラソン系"の問題を作っ たのは初めてでした
  3. 3. 方針 基本的な方針は、典型的な解法で紹介したような、ナン プレ盤面埋め+逐次改善 逐次改善の方法は、「1マス選んで他の値に変える」だ け。これを頑張って高速化しました。 ● 工夫の余地は色々ありそうだけど、その分遅くなって 結果は悪くなりそうな気がした ● ややこしいことをすると並列化が難しくなる
  4. 4. 高速化 最も影響が大きいと思われる「盤面のbit化」について。 1=0b000000001、2=0b000000010、… のようにして各数字をbitで表すと、 9個のマスに1〜9が1個ずつ含まれている ⇔9個のbitのorの結果が0b111111111=0x1FF とbit演算だけで判定でき高速。 ただし、この方法だと差分更新が難しい。 例えば、9マスの数字が 127456789 だったとすると、 bitのorを取った結果は 0b111111011 左から3つめを3に変更した結果がどうなるかは、また9 マス分辿ってorを取らないと確定できない
  5. 5. 高速化 この問題は、orではなくxorを取ることで解消できる。 1=0b00000001、2=0b00000010、…、9=0 のようにして各数字をbitで表す。こうすると、 9個のマスに1〜9が1個ずつ含まれている ⇔9個のbitのxorの結果が0b11111111=0xFF と判定できる(前ページでは9bitだったが今度は8bit) 例えば、9マスの数字が 127456789 だったとすると、 bitのxorを取った結果は 0b10111011 左から3つめを3に変更した結果がどうなるかは、この値 に差分である0b01000100をxorかければ分かる
  6. 6. 並列化 盤面を分割して並列に処理します。 縦8個*横8個の64領域に分け、市松模様に交互に Aグループを32並列で処理 →Bグループを32並列で処理 →Aグループを32並列で処理 →…以下繰り返し 実装にはOpenMPを使いました。 ほとんど引っかかることなく楽に書けました。 しかしこのブロックの分け方はよろしくなかった A B A B A B A B A B A B A B AB A B A B A B A B A B A B A B AB A B A B A B A B A B A B A B AB A B A B A B A B A B A B A B AB
  7. 7. 並列化 市松模様だとスレッドセーフじゃなかった… 角で接する部分で互いに影響してしまいます。 下の図のように、細長く切るべきだった A B A B A B A B … A B A B A B A B 高さ8マス以上
  8. 8. 実行&結果 実行環境として、EC2のcc2.8xlarge (16core/32thread)スポットインスタンスを1台使い ました。 ● 実行時間:15時間 ● CPU時間:400時間 (CPU80%くらいしか使えてないですね) ● 料金:$4くらい? ● 合計繰り返し回数:5兆回 スコアは231829点でした。machyさんに負けた…
  9. 9. まとめ ・OpenMPすごく楽 ・EC2スポットインスタンス安い ・machyさんすごい

×