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.
TopCoder Marathon Match 74  AntiTravelingSalesperson ( 巡回セールスマンにイヂワルしちゃえ ) 書いた人 : yowa (twitter @yowa)
今回の問題 巡回セールスマン問題を 最近傍巡回で解くから、 イヂワルな 点配置を考えてね !!
バックグラウンド <ul><li>平面上の巡回セールスマン問題(TSP) </li><ul><li>平面上に点がいくつか与えられる
すべての点を一度ずつ訪れる
合計距離を短くしたい </li></ul><li>最近傍ヒューリスティック(nearst-neighbour: NN) </li><ul><li>開始位置から最も近い点に移動
そこから、未訪問の最も近い点に移動
すべての点を訪れるまで繰り返す </li></ul></ul>
今回の問題(もちょっと詳しく) <ul><li>引数 </li><ul><li>点の数 N (10~1万)
Nf 個の固定点 (Nf = 3~10) ※スタート地点も指定 </li></ul><li>やること </li><ul><li>N個の点を自由に配置する   ※指定枠内で </li></ul><li>スコア </li><ul><li>(N+Nf...
得られた巡回路の距離がスコア
長ければ長いほど良い </li></ul></ul>
以降、やったこと
2通りの切り口 <ul><li>最適解自体が長い点配置を考える
NN  が苦手な配置を考える </li></ul>
最適解が長い <ul><li>ランダム配置は意外に長くない </li><ul><li>点間の距離がバラバラ </li><ul><li>短いのもあれば長いのもある </li></ul><li>最適解は短い辺が採用されがち </li></ul><l...
点を格子状に配置 <ul><li>縦sqrt(N)個、横sqrt(N)個
最短辺の長さ: 1/sqrt(N)
最適解の長さ:
  N × 1/sqrt(N)
= sqrt(N) </li></ul>※  点を置ける範囲は     1×1  の正方形
NN  が苦手な配置 <ul><li>アルゴリズムの中の人の気持ちを想像 </li><ul><li>あの点はこっちの点より微妙に遠いお
だから後回しにするお!
あ、あれ…あの点からどんどん遠ざかるお…
Upcoming SlideShare
Loading in …5
×

TopCoder Marathon Match 74 (yowa)

2,281 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

TopCoder Marathon Match 74 (yowa)

  1. 1. TopCoder Marathon Match 74 AntiTravelingSalesperson ( 巡回セールスマンにイヂワルしちゃえ ) 書いた人 : yowa (twitter @yowa)
  2. 2. 今回の問題 巡回セールスマン問題を 最近傍巡回で解くから、 イヂワルな 点配置を考えてね !!
  3. 3. バックグラウンド <ul><li>平面上の巡回セールスマン問題(TSP) </li><ul><li>平面上に点がいくつか与えられる
  4. 4. すべての点を一度ずつ訪れる
  5. 5. 合計距離を短くしたい </li></ul><li>最近傍ヒューリスティック(nearst-neighbour: NN) </li><ul><li>開始位置から最も近い点に移動
  6. 6. そこから、未訪問の最も近い点に移動
  7. 7. すべての点を訪れるまで繰り返す </li></ul></ul>
  8. 8. 今回の問題(もちょっと詳しく) <ul><li>引数 </li><ul><li>点の数 N (10~1万)
  9. 9. Nf 個の固定点 (Nf = 3~10) ※スタート地点も指定 </li></ul><li>やること </li><ul><li>N個の点を自由に配置する   ※指定枠内で </li></ul><li>スコア </li><ul><li>(N+Nf)個の点を NN ヒューリスティックで解く
  10. 10. 得られた巡回路の距離がスコア
  11. 11. 長ければ長いほど良い </li></ul></ul>
  12. 12. 以降、やったこと
  13. 13. 2通りの切り口 <ul><li>最適解自体が長い点配置を考える
  14. 14. NN が苦手な配置を考える </li></ul>
  15. 15. 最適解が長い <ul><li>ランダム配置は意外に長くない </li><ul><li>点間の距離がバラバラ </li><ul><li>短いのもあれば長いのもある </li></ul><li>最適解は短い辺が採用されがち </li></ul><li>「最も短い辺」の長さを長くすればよくね? </li><ul><li>(最適解の長さ)≧(最も短い辺の長さ)×(点の数) </li></ul></ul>
  16. 16. 点を格子状に配置 <ul><li>縦sqrt(N)個、横sqrt(N)個
  17. 17. 最短辺の長さ: 1/sqrt(N)
  18. 18. 最適解の長さ:
  19. 19.   N × 1/sqrt(N)
  20. 20. = sqrt(N) </li></ul>※ 点を置ける範囲は     1×1 の正方形
  21. 21. NN が苦手な配置 <ul><li>アルゴリズムの中の人の気持ちを想像 </li><ul><li>あの点はこっちの点より微妙に遠いお
  22. 22. だから後回しにするお!
  23. 23. あ、あれ…あの点からどんどん遠ざかるお…
  24. 24. 結果的に遠回りになってしまったお </li></ul><li>点を後回しにするような配置にすればよさそうだ </li></ul>
  25. 25. 格子状の点を食い残しつつ巡る <ul><li>赤い点を残して回る </li><ul><li>等距離の点が複数あったときの処理 </li><ul><li>返り値配列で先に出てくる方が選択される </li></ul><li>赤い点を後ろに入れておく </li></ul><li>赤い点同士の最短距離 </li><ul><li>通常の2倍 </li></ul></ul>青3個 + 赤1個 で    1グループ 3 × 1  1 × 2 4  N = 1.25  N
  26. 26. 初日 暫定トップ <ul>一瞬でも輝いたさ! </ul>
  27. 27. ふて寝期 <ul><li>四角い格子点より三角な格子点の方が点が密 </li><ul><li>点の数が同じなら、点の間隔を開けられる </li></ul><li>だから三角格子にするとさらに点が伸びる!
  28. 28. でも、後回しテクは等距離なのが生きてる
  29. 29. 整数座標にしか置けないから、等距離は無理 </li><ul><li>なんで√3は有理数じゃないんだお……
  30. 30. ピタゴラスに言いつけてやるお…… </li></ul></ul>
  31. 31. <ul>一週間後 </ul><ul><li>微妙にズレておk  ※辺長より6桁小さいズレ
  32. 32. b≦a, a≦s, a≦t なら太線ルートを通ってくれる </li><ul><ul><li>                    くらい(たぶん) </li></ul></ul></ul>a a a b b s s s s t t t t  2  3  1   3 3   N = 1.336  N
  33. 33. あとはグダグダ <ul><li>格子状配置が威力を発揮するのは大きい N </li><ul><li>小さいNだと点配置に合わせたカスタマイズが効く </li></ul><li>N は 10~1万、とは言っても…… </li><ul><li>10^rand(1~4の実数乱数)
  34. 34. 具体的には 10~20 が出る確率が全体の1割とか
  35. 35. 小さい N がちょー重要 </li></ul><li>アイデアないです </li><ul><li>ランダム配置や、ランダム点移動で山登りしたくらい
  36. 36. ランダム点移動山登りはでかいNでもやった </li></ul></ul>
  37. 37. ちょっと頑張った方法 <ul><li>点配置を固定->順路が決まる </li><ul><li>p(0) -> p(1) -> ... -> p(X) -> ... -> p(N+Nf) -> p(0) </li></ul><li>順路が変わらない範囲で p(X) を動かす </li><ul><li>(A) p(0) ... p(X-1) を変えない
  38. 38. (B) p(X-1)->p(X) を変えない
  39. 39. (C) p(X)->p(X+1) を変えない </li><ul><li>(a)  |p(i)->p(i+1)| < |p(i)->p(X)|  (0≦i≦X-2)
  40. 40. (b)  |p(X-1)->p(X)| < |p(X-1)->p(j)| (X+1≦j≦N+Nf)
  41. 41. (c) |p(X)->p(X+1)| < |p(X)->p(k)| (X+2≦k≦N+Nf) </li></ul></ul></ul>
  42. 42. ガチはめんどい <ul><li>連立不等式 </li><ul><li>(a) は「円の内側」
  43. 43. (b) は「直線で区切った片側」
  44. 44. (c) は「円の外側」 </li></ul><li>これらを満たす点集合(平面上の領域)を考え……
  45. 45. めんど!
  46. 46. p(X) を基点とした縦横方向だけを考える </li><ul><li>平面上の領域->めんどい
  47. 47. 直線上の区間->まだマシ </li></ul></ul>
  48. 48. あんまり使えてない <ul><li>同一距離なら配列内順序を優先 </li><ul><li>これを考慮するのがめんどくて実装バグりまくる </li></ul><li>1点について範囲を求めるのに O(N) かかる </li><ul><li>全点では O(N^2) なので、おいそれと呼べない </li></ul><li>これを使っても劇的な改善があるわけじゃない </li><ul><li>所詮「1点動かす」「ルート不変」という局所最適ですし </li></ul></ul>
  49. 49. NN さんパネェ いぢわるしてごめん <ul><li>NN を自分で実装しなきゃダメだよね </li><ul><li>N回最近傍を探す -> O(N^2)
  50. 50. O(N log N)があるらしいけど、わからん…… </li></ul><li>kd-tree (2d-tree) ? </li><ul><li>知らんけど「前処理しといてその後高速」なんじゃね?
  51. 51. 「(一度訪問した)点を削除」操作もいけるんかね?
  52. 52. パス </li></ul><li>どう実装したもんか…… </li></ul>
  53. 53. これ、Codeforcesでやったとこだ! <ul><li>Minimum Sum
  54. 54.             (School Regional Team Contest, Saratov, 2011) 1 週間前 </li><ul><li>点集合から、最も距離が小さい点ペアを探す問題 </li></ul><li>自分の解法 </li><ul><li>まず x 座標で全体をソート
  55. 55. 点pの最近傍: pとソート順が近いものから探す </li><ul><li>ソート順が遠いものは探索枝刈りできる
  56. 56. (現時点での最近傍との距離) < (x 方向の距離) </li></ul><li>O(N^2) だけど通った </li></ul><li>今回もこの方式で行くお! </li></ul>
  57. 57. そんなに速くない <ul><li>N=1万で、NN解を100回求めるのに2秒かかる </li><ul><li>解を求められる回数が、点の数Nより超少ない
  58. 58. まともな山登りにならないお…… </li></ul><li>点を1個動かす山登り </li><ul><li>たいていNN解は局所的にしか変わらない(気がする)
  59. 59. それを利用すれば……わからん </li></ul><li>y軸でいくつかの領域に分けて、領域で現行方式 </li><ul><li>N=1万で 3 倍くらい速くなった
  60. 60. でも雀の涙だね…… </li></ul></ul>
  61. 61. スコアボードをながめる <ul><li>自分が submit しても上位陣のスコアが動かない </li><ul><li>best解を1つも出せてないという現実にヘコむ </li></ul><li>crem たん一人抜け期 </li><ul><li>2位に10点差とか
  62. 62. 「小さい N のうまい方法あるんだろうな」とか思ってた </li></ul></ul>
  63. 63. 雑多なアイデア <ul><li>小さいNは固定点パターンごとに埋め込み? </li><ul><li>そして埋め込み解をベースに探索、とか
  64. 64. うまくいかなそうだから試してない </li></ul><li>格子点方式で、固定点の近くの配置をいじる? </li><ul><li>思いついただけで試してない </li></ul><li>時間あまるし、スライドにまとめる? </li><ul><li>それ採用! -> 現在に至る </li></ul></ul>
  65. 65. ご清聴 ありがとうございました …… ご清聴?

×