21
2013 TCO Marathon Round 2 FragileMirrors - 鏡をぶっこわせ - 参加メモ yowa (@yowa)

2013 TCO Marathon Round 2 (yowa)

  • Upload
    yowaken

  • View
    1.783

  • Download
    2

Embed Size (px)

Citation preview

2013 TCO Marathon Round 2

FragileMirrors- 鏡をぶっこわせ -

参加メモ

                  yowa (@yowa)

どんな問題?

● N×Nのマス目に、ナナメ向きの鏡がみっしり

N = 4 の例 (本当は N=50~100)

どんな問題?

● 光線を当てる→反射した直後に鏡が壊れる

←これが こうなる→(6枚破壊)

どんな問題?

● できるだけ少ない手数で、全ての鏡を壊そう!

この図は2手でいける

やったこと

ビームサーチ

やったこと

ビームサーチ光線だけに、レーザービームってね!

ご清聴、ありがとうございました

もうちょい詳しく

● 幅優先探索– ただし全ての解候補ではなく

良さそうな方から k 個だけ保存。

● 「良さそう」って?● k っていくつ?

評価関数

● 残りの鏡の数が少ない方が良さそう● 鏡の数が同じでも、まとまってたほうが良さそう

4手 2手 1手

評価関数

● 残りの枚数と、● 「壊してしまって空になった列」の数を元に、

てきとーに決めた

k: ビーム幅(解の保持数)

● サイズNのとき、だいたい N 手くらいの解がある● 一つの局面で有効な手は O(N) 手● 1手のシミュレーションに、最悪O(N)くらいかかる

● 解を求めるのに O(k N^3) くらいかかりそう

→ k を O(1/N^3) とかにしとけば、

 だいたい決まった時間でおわりそうだぜ

(実際は O(1/N^2.5) くらいにした)

枝刈りとか

● 1手で4枚以下しか壊れなかった– 出口側から入射でも同じ結果になるのでスキップ

● 枚数少ないからシミュレーション重くないしあんま意味ないかもだ

● 局面の同一判定とか– Zobrist Hash をつかった

● 各マスにランダムなhash値を割り当てる● (局面のhash値) = (壊したマスのhash値を全部 xor )

所感

● 幅優先だから、時間調節が難しかった● 高速化はわかんない

vector<int> じゃなく vector<char> にするとか

優先度順に並べるのに partial_sort() するとか

そんくらい(しか知識がない)

小ネタ

時間vsスコアでプロットしてたら…

Nが偶数(上)/Nが奇数(下)、でした

奇数/偶数でわかれる理由

● 特に考察とかは無いです– 2つに分かれるのに気づいたの

最終提出の2時間前とかだし

– 問題自体がそういうものなのか、

オレのアルゴリズムがそうなってるのか、

それすらわかんない

まとめ

● ビームサーチした

ご清聴、ありがとうございました