株式会社フィックスターズ
「最適解を目指せ!!」
(ナンプレ盤面問題)
解法の説明
田中伸明
自己紹介
田中伸明 Twitter等:tomerun
元々はパズル的な数学が好きだったことから、「コン
ピューターサイエンスの応用みたいな事がしたいなー」
と思いソフトウェアエンジニアになる
2008年頃からTopCoderやGoogle Co...
方針
基本的な方針は、典型的な解法で紹介したような、ナン
プレ盤面埋め+逐次改善
逐次改善の方法は、「1マス選んで他の値に変える」だ
け。これを頑張って高速化しました。
●
工夫の余地は色々ありそうだけど、その分遅くなって
結果は悪くなりそうな...
高速化
最も影響が大きいと思われる「盤面のbit化」について。
1=0b000000001、2=0b000000010、…
のようにして各数字をbitで表すと、
9個のマスに1〜9が1個ずつ含まれている
⇔9個のbitのorの結果が0b1111...
高速化
この問題は、orではなくxorを取ることで解消できる。
1=0b00000001、2=0b00000010、…、9=0
のようにして各数字をbitで表す。こうすると、
9個のマスに1〜9が1個ずつ含まれている
⇔9個のbitのxorの結...
並列化
盤面を分割して並列に処理します。
縦8個*横8個の64領域に分け、市松模様に交互に
Aグループを32並列で処理
→Bグループを32並列で処理
→Aグループを32並列で処理
→…以下繰り返し
実装にはOpenMPを使いました。
ほとんど引...
並列化
市松模様だとスレッドセーフじゃなかった…
角で接する部分で互いに影響してしまいます。
下の図のように、細長く切るべきだった
A
B
A
B
A
B
A
B
…
A
B
A
B
A
B
A
B
高さ8マス以上
実行&結果
実行環境として、EC2のcc2.8xlarge
(16core/32thread)スポットインスタンスを1台使い
ました。
●
実行時間:15時間
●
CPU時間:400時間 (CPU80%くらいしか使えてないですね)
●
料金:$...
まとめ
・OpenMPすごく楽
・EC2スポットインスタンス安い
・machyさんすごい
Upcoming SlideShare
Loading in...5
×

Code iq interpretation_tanaka_publish

1,894

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
1,894
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
2
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さんすごい
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×