Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2013 TCO Marathon Round 3 (yowa)

1,727 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2013 TCO Marathon Round 3 (yowa)

  1. 1. 2013 TCO Marathon Round 3CirclesSeparation-円の重なりをなくすお仕事-参加メモ@yowa
  2. 2. どんな問題?● 円がたくさんある(N=50~500)● それぞれの円には、質量と初期位置がある
  3. 3. どんな問題?● 円がたくさんある(N=50~500)● それぞれの円には、質量と初期位置がある– 円が重ならないように移動させる– 仕事(質量×移動距離)の総和が小さいほどエラい!!
  4. 4. 基本的な性質● 重ならないなら、初期位置に置くのがベスト● 初期位置が重なる場合は?(単純に N=2 で)
  5. 5. 基本的な性質● 重ならないなら、初期位置に置くのがベスト● 初期位置が重なる場合は?(単純に N=2 で)– 移動距離が同じ→軽いのを動せば仕事は小– 重い方を初期位置に、軽いのを最短距離に。重軽
  6. 6. 基本的な性質●3つ以上の円が絡むと、そう単純じゃない重軽軽重軽軽それぞれの重さ、移動距離によってどっちがいいのかまちまち
  7. 7. 剛体シミュレーション  ● とりあえず円同士が重ならないように配置● 重ならない状態を保ったまま– 円を初期位置に近づけたり– ランダム移動させたり– 重い円で他の円をはじいたり
  8. 8. 剛体シミュレーション?● とりあえず円同士が重ならないように配置● 重ならない状態を保ったまま– 円を初期位置に近づけたり– ランダム移動させたり– 重い円で他の円をはじいたりめんどそう!
  9. 9. Greedy な解法● 円を重い順にソート● 移動距離最小の位置に置く● 一度置いた円は動かさない→ それなりにいい解は求まる
  10. 10. 移動距離最小の位置?● 最小になる位置は、以下のいずれか– 初期位置 (候補数: 1)– 置けなければ、邪魔な円にピッタリ (候補数: O(N) )– それも無理なら、2円に接する位置 (候補数: O(N^2) )● 計 O(N^2) 個の候補から、重なりなく置けて距離最小な位置を選ぶ
  11. 11. 計算量の見積もり● 置く位置の候補が O(N^2) ヶ所● 候補ごとに、置いてある円(O(N)個)と重なり判定● それを N個の円について行う→ 全部で O(N^4)
  12. 12. 計算量の見積もり● 置く位置の候補が O(N^2) ヶ所● 候補ごとに、置いてる円(O(N)個)と重なり判定● それを N個の円について行う→ 全部で O(N^4)\重い/ 
  13. 13. 計算量の改善● 置いてある円(O(N)個)と重なり判定– 置いてある円は互いに重なってない→ 面積あたりの円の数は、たかが知れてる– マス目に区切って、その中の円とだけ重なり判定→ サイズが適切なら、O(1)個くらいで済む
  14. 14. 計算量の改善● 置く位置の候補が O(N^2) ヶ所– 2円に接する位置(候補数: O(N^2) ) ← これが重い– D = (2円の円周の最短距離) が置きたい円の直径より長いと、接する位置とか無い(間をすりぬける)– D が小さい順に判定、直径より長くなったら打ち切り→ 候補数 O(N) くらいになる
  15. 15. ここまでのまとめ● とりあえず Greedy な解を求めたい●O(N^4) くらいかかりそう● やっぱ O(N^2) くらいで済みそう
  16. 16. 山登り● 最初は重い順に置く Greedy をやる→2 円の置く順番を入れ替えて Greedy→ 改善したらそれ採用(Greedy が重いから、焼きなましが効くほど試行回数を稼げないし……)
  17. 17. どれを入れ替える?●2円入れ替えの全列挙 → O(N^2)● そんなに Greedy を試せない → スコア見積もり● 隣接する2円だったら、入れ替えても他の円の位置への影響は少ないんじゃね?(勘)● その2円の位置をそのまま入れ替えた(=円の重なりアリ)ときのスコアになるんじゃね?(勘)
  18. 18. やったこと● 初期解: 重い順に Greedy● 最善解の2円を swap して Greedy– 2円は隣接してること– 位置を単純にswapしたときのスコアが良い順に試す● スコアが改善したら、それを採用(山登り)● 一定試行回数で改善が起きなかったら打ち切り– 重い順(ランダム補正) で初期解生成、最初にもどる
  19. 19. やってないこと● 剛体シミュレーション● 木とか使う近傍円探索● 円を Greedy な位置以外に置くこと– k-best とかでビームサーチしたけど重かった● 円を置く順序を探索すること– ビームサーチしたけど重(ry●N によってアルゴリズムの切り替え– 試してないけど、有効そう(Nの分布的に考えて)
  20. 20. おしまい      ――――――――――  製作・著作 @yowa   

×