Upgrade to Pro — share decks privately, control downloads, hide ads and more …

サンタコンペで二度全完した話

 サンタコンペで二度全完した話

Kaggle Tokyo Meetup #4での発表資料

wata_orz

May 12, 2018
Tweet

More Decks by wata_orz

Other Decks in Technology

Transcript

  1. 3 自己紹介  東大情報科学科→情報理工(2016年3月博士卒)  国立情報学研究所 助教  離散アルゴリズムの研究をしている 

    機械学習は初心者 世界 1 位 (2010) 世界 2 位 (2011) 世界 3 位 (2009) 3回優勝 (2013,2015,2016) 競プロ: wata Twitter: @wata_orz ICFPC Masterになりたい…
  2. 問題概要 5 1,000種類×1,000個 1,000,000人 サンタと子供の幸福度関数, が与えられるので、幸福度の和 σ , + σ

    (, ) が出来るだけ大きい割当 : 子供→プレゼント を求めよ。  , ≔ サンタが子供にプレゼントを配る幸福度  , ≔ 子供がプレゼントを貰ったときの幸福度 , はスパースで非零要素がそれぞれ106個、107個 1+1+3+4+1+2=12 1 1 0 0 0 0 1 1 3 0 0 4 1 2 0 2
  3. 私の研究の紹介  2-SATの充足可能性は線形時間で判定できる。  充足不能な場合、出来るだけ沢山の節を充足する問 題(Max 2-SAT)はNP困難なので解くのが難しい…? 簡単 激ムズ? 2-SAT

    ( = 0) Max 2-SAT ( > 0) 10 充足されない 節の数 ここらへん(小さい)はまだ簡単なのでは? 私の結果 (SODA 2013): 任意の定数に対し、個以外充足可能かは線形時間で解ける アルゴリズム: LP緩和を最大流で解いて分枝限定法
  4. タイムライン 13 Dec13 Jan13 開始 終了 Dec14 最適解を達成し 1位確定 Dec23

    最適解が続出したため ルール変更で第二ラウンド  入力が大きくなった:子供の幸福度の非零が107 → 108個に  三つ子が出現:双子4,000人 → 三つ子5,001人、双子40,000人  スコアが単純な線形和から σ , 3 + σ , 3に  賞金が分割:1位賞金$8,000を第一ラウンド$2,000+第二ラウ ンド$6,000に分割、最長トップ賞も持ち越し
  5. タイムライン 14 Dec13 Jan13 開始 終了 Dec14 最適解を達成し 1位確定 Dec23

    最適解が続出したため ルール変更で第二ラウンド Dec26 再び最適解を達成 ところが… 僅かな差でKomaki君に先を越されたorz 私:Dec26 01:52:43、 Komaki君:Dec26 01:19:03 まだ終了まで半分以上あるため、最長トップ賞も逃し、 34分差で賞金$9,500を失う 敗因:人間性を捧げなかった 自前の最小費用流実装が遅かった
  6. 最小費用流 入力: 問題: 16 −() +() • 有向グラフ = (,

    ) • 各辺の容量 (≥ 0)と重み minimize ෍ s.t. σ ∈−() − σ ∈+() = 0 (∀ ∈ ) 0 ≤ ≤ ∀ ∈ 入る量=出る量 を通して最大 まで流せる 単位量あたりコスト が かかる < 0な辺もある (流すと得をする)
  7. 最小費用流  様々な最適化問題が、最小費用流に帰着して効率 的に解ける(競プロでは頻出)  https://www.slideshare.net/wata_orz/ss-91375739  アルゴリズム  最短路反復法

     コストスケーリング法  ライブラリ  LEMON: http://lemon.cs.elte.hu/trac/lemon  Google OR-Tools: https://developers.google.com/optimization/ 私は自前のコストスケーリング法実装を使用した 17
  8. 最小費用流への帰着 18 1 1 0 0 0 0 1 1

    3 0 0 4 1 2 0 2 容量2 容量1 容量1 コスト = −幸福度 −4 −1 −1 0 −3 −3 −4 0 → → → という閉路が プレゼント を子供 に渡すことに対応
  9. 分枝限定法  解ける問題(e.g. 最小費用流)+邪魔な制約(e.g. 双子制約) に対し、邪魔な制約を無視した緩和問題を考える。  緩和問題の解 ≥ 元の問題の解(最大化の場合)が成り立つ

    ので、探索の枝刈りに使える。 19 1. 緩和問題を解く 2. if 既に発見した解 ≥ 緩和解 then return 3. if 緩和解が緩和した制約を満たす then 解を更新 4. else 満たされていない制約を一つ選び、満たすよう に再帰的に分岐して探索する
  10. 分岐の方法 異なるプレゼント, を受け取った双子を一組選び、プレゼント を渡す場合と、プレゼントを渡さない場合で分岐 20 1 2 −4 −1 −1

    0 −3 −3 −4 0 1 2 −4 −1 −1 0 −3 −3 1 2 −1 0 −3 −3 −4 0 1を渡す 1を渡さない 1以外からの辺を消す 1からの辺を消す 双子制約が満たされていない
  11. 三乗和の解き方  第二ラウンドでは、目的関数が幸福度の線形でなく、 σ , 3 + σ , 3となった

     の非零が106個に対し、の非零が108個もあるの で、σ , の方が圧倒的に大きく出来る → を無視してのみを最大化すれば、ほぼ最適 21 これ以上の最適化はKaggleのスコアボードの有 効桁数を超え、「not an improvement」と言われ るが、ちゃんと最適化しないとダメだった 真の最適解は十分大きい数に対して、 + を最大化すれば得られる
  12. 高速化3 3. 分枝限定法において、分岐後の最小費用流の計算 は、増大路計算により( log )時間で出来る 23 1 2 a

    b c d −4 −1 −1 0 −3 −3 −4 0 1 2 a b c d 4 −1 1 0 3 −3 4 0 残余グラフ 使った辺の 向きと重みを反転 からへの増大路=残余グラフでのからへのパス
  13. 高速化3 3. 分枝限定法において、分岐後の最小費用流の計算 は、増大路計算により( log )時間で出来る 24 1 2 a

    b c d −4 −1 −1 0 −3 −3 −4 0 1 2 a b c d −4 −1 −1 0 −3 −3 1以外からの辺を消して 最小費用流を計算 → 1 への最短増大路 ( → 2 → → 1) に沿って押し戻す 1 2 a b c d −4 −1 −1 0 −3 −3 −4 辺1bを使う 1 2 a b c d −4 −1 −1 0 −3 −3 −4 1以外からの使われ ていない辺を消す
  14. 高速化5 5. 最適解で絶対に使われる・使われない辺を除去しグ ラフを小さくする  = 0 → 1 にした際の緩和解が、既知の解以下に

    なったら、 = 0で固定してよい  = 1 → 0 も同様 一回の判定に( log )かかるので、全部の辺を調べると 2 log 。 = 108なので無理 26
  15. 高速化5  = 0 → 1にすると、最小費用流のコストは からへの最短増大路 + 増加する 

    = 1 → 0 にすると、最小費用流のコストは からへの最短増大路 − 増加する  1辺ごとに最短増大路を計算すると108回の最短路計算が必 要だが、 (プレゼント)は1000種類しかないので、1000回の最 短路計算で出来る(それでもまだ若干重いが) 27 からへ押し戻す からへ別ルートで流す
  16. 高速化5 双対変数(ポテンシャル)を用いると、一気に辺を削除 出来る(Reduced cost fixingと呼ばれるテク) 最小費用流の双対性 最小費用流が最適 ⇔ 残余グラフの全ての辺で ≤

    + を満たすようなポテンシャル: → ℝが存在  からへの最短増大路の長さ ≥ − が成り立つ  先にこの下界で辺を減らしてから最短路計算をした 28 4 −1 1 0 3 −3 4 0 0 3 1 0 0 0 0 0 残余グラフ (使った辺の向き と重みを反転)
  17. 実行時間など  全部通して1時間位  殆どの計算時間は一番最初の最小費用流計算  自前実装でなく、OR-Toolsとかの外部ライブラリを使えば、 だいぶ速くなるっぽい  あまりに遅いので、コンペ中は計算結果をファイルに保存

    して、ソルバ改善→再実行時の再計算を無くした  が、のみ最適化から + 最適化に変えた際に計算し 直す必要が…→計算中にKomaki君が最適解達成orz  辺の削減効果  約108辺 → 約50万辺 29