20
北大日立マラソン2nd やったこと @yowa

AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

  • Upload
    yowaken

  • View
    323

  • Download
    1

Embed Size (px)

Citation preview

Page 1: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

北大日立マラソン2nd やったこと

@yowa

Page 2: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

1st のおさらい

● K×Kの盤面に 1~V の数字を置く

● 得点表(項目数: E)のペアが隣接 → 加点

  得点表

(1, 2) -> 5点

(2, 6) -> 2点

(4, 7) -> 9点

(6, 7) -> 8点

Page 3: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

1st のおさらい

● K×Kの盤面に 1~V の数字を置く

● 得点表(項目数: E)のペアが隣接 → 加点

  得点表

(1, 2) -> 5点

(2, 6) -> 2点

(4, 7) -> 9点

(6, 7) -> 8点

総得点:    11点

Page 4: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

1st と 2nd の違い

● 同じ数字を、   連結する複数マスに置ける

● 得点表をフルコンプするとボーナス100,000点

  得点表

   (省略)

Page 5: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(基本アイデア)

● 左図のように   斜めに並べれば、K×Kの盤面で

(K+1)個の領域が互いに隣り合う     (完全グラフ)

● V K+1 ≦ ならこれでフルコンプ

Page 6: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(基本アイデア)

● V > K+1 ならば  いくつかの領域をぶった切って   領域数を増やす

Page 7: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おおまかなアルゴリズム(1/4)

● K×Kの盤面を、V個の領域に分割する(前述の方法)

Page 8: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おおまかなアルゴリズム(2/4)

● K×Kの盤面を、V個の領域に分割する(前述の方法)

● 領域の形を固定したまま、どの領域にどの数字を当てはめるか、焼きなましで決める

↑ここは、だいたい 1st と同じアルゴリズム

Page 9: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おおまかなアルゴリズム(2/4)

● K×Kの盤面を、V個の領域に分割する(前述の方法)

● 領域の形を固定したまま、どの領域にどの数字を当てはめるか、焼きなましで決める

↑ここは、だいたい 1st と同じアルゴリズム

Page 10: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おおまかなアルゴリズム(3/4)

● K×Kの盤面を、V個の領域に分割する(前述の方法)

● 領域の形を固定したまま、どの領域にどの数字を当てはめるか、焼きなましで決める

↑ここは、だいたい 1st と同じアルゴリズム● 当てはめた数字を固定したまま、領域の形をちょっ

とずつ変形させ、スコア改善なら採用(山登り)

Page 11: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おおまかなアルゴリズム(4/4)

● K×Kの盤面を、V個の領域に分割する(前述の方法)

● 領域の形を固定したまま、どの領域にどの数字を当てはめるか、焼きなましで決める

↑ここは、だいたい 1st と同じアルゴリズム● 当てはめた数字を固定したまま、領域の形をちょっ

とずつ変形させ、スコア改善なら採用(山登り)● (蛇足) スコアが減らない範囲で、各領域を狭める

実は使ったマス数でスコアにペナルティがある

そんなの誤差だよ、誤差

Page 12: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(焼きなまし)

● いったん各領域の形はさっきのに固定– 領域同士が隣接してるかどうかの隣接グラフを  

あらかじめ計算しておく

● どの領域を何番に割り当てるか?– 焼きなまし

– 2つの領域について、割り当てる番号を swap して   よかったら採用(悪くても一定確率で採用)

Page 13: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(領域変形) (1/2)

● 「領域はそれぞれ連結でないといけない」という  制約を守ったままの変形– 除去するマスが領域グラフの関節点かどうか

– オレのアルゴリズムぢからでは、そんなの無理無理

Page 14: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(領域変形) (2/2)

● 各領域の形を木(tree)に限定

– 幸い初期領域は木(閉路どころか分岐すらない)

– 次数2以上なら関節点、次数1ならそうじゃない● 周囲8マスだけ見れば関節点かどうかわかる!かんたん!

この5→周囲に5が2マスある→関節点→変更すると領域切断→変更不可

Page 15: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(領域変形) (2/2)

● 各領域の形を木(tree)に限定

– 幸い初期領域は木(閉路どころか分岐すらない)

– 次数2以上なら関節点、次数1ならそうじゃない● 周囲8マスだけ見れば関節点かどうかわかる!かんたん!

この8→周囲に8が1マスだけ→関節点じゃない→変更しておk

Page 16: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やったこと(領域変形) (2/2)

● 各領域の形を木(tree)に限定

– 幸い初期領域は木(閉路どころか分岐すらない)

– 次数2以上なら関節点、次数1ならそうじゃない● 周囲8マスだけ見れば関節点かどうかわかる!かんたん!

この8→2,7,1 に変更可

→3,5には変更不可

(周囲に2個ある

 →木じゃなくなる)→4,6にも変更不可

(周囲に0個

  →飛び地になる)

Page 17: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

やらなかったこと

● 積極的に得点表コンプボーナスを取りに行く– さっきのやり方でコンプできたらラッキー程度

– 特に小規模なグラフ(V小、E小、K大)なら、それ専用のアルゴリズムに切り替えてでも、ボーナス狙うべき

● 領域変形時の焼きなまし– 山登りにとどめた

– やってはみたけど芳しくなかった

– 計算が重くて回数稼げないのと、この近傍の取り方だと遷移確率の可逆性(?)みたいな(?)アレが適してない(?)

– 焼きなまし、わからん

Page 18: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

よかったこと / よくなかったこと

● 序盤に「どんな形の領域にしたら完全グラフが埋め込めるかな~?」と図を書きながらいろいろ考えたのがたのしかったです。

● 解のvisualizeがけっこうキレイにできたのがよかっ

たです。(テキストでSVGをベタ出力だけどな)

● まとめスライドに取り掛かるのが遅かったのがよくなかったです

Page 19: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

よかったこと / よくなかったこと

● 序盤に「どんな形の領域にしたら完全グラフが埋め込めるかな~?」と図を書きながらいろいろ考えたのがたのしかったです。

● 解のvisualizeがけっこうキレイにできたのがよかっ

たです。(テキストでSVGをベタ出力だけどな)

● まとめスライドに取り掛かるのが遅かったのがよくなかったです

Page 20: AtCoder 北大日立マラソン 2nd 参加メモ (yowa)

おしまい

@yowa