Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
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>あの点はこっちの点より微妙に遠いお
だから後回しにするお!
あ、あれ…あの点からどんどん遠ざかるお…
Prochain SlideShare
Chargement dans…5
×

TopCoder Marathon Match 74 (yowa)

2 285 vues

Publié le

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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. ご清聴 ありがとうございました …… ご清聴?

×