Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

tbf07-seat-optim.pdf

 tbf07-seat-optim.pdf

Avatar for Shuhei Fujiwara

Shuhei Fujiwara

October 15, 2019
Tweet

More Decks by Shuhei Fujiwara

Other Decks in Technology

Transcript

  1. 解決したい課題 ▶ 技術曞兞 7 の堎合玄 640 サヌクルがそれぞれどこの垭に座るかを決めたい ▶ 近いゞャンルのサヌクルが近くに集たっおほしい こ40

    こ01 け78 け41 け38 け39 け40 け01 く20 く01 き40 き01 か80 か41 か40 か01 お40 お01 え40 え01 う78 う41 う40 う03 う01 い30 い01 あ01 あ20 催事スペヌス 荷物䜜業スペヌス スポンサヌブヌス 運営ブヌス 出⌝ ⌊⌝ 4
  2. 埗られた成果 ▶ 珟圚は自動生成された叩き台をもずに議論ず調敎を重ねお決定しおいる ▶ 技術曞兞 4 (箄 250 サヌクル) でも叩き台を䜜るのに

    1 日 2 日かかるくらい 倧倉だった ▶ 珟圚は玄 640 サヌクルでも近いレベルのものを 1 分皋床で出せるように ▶ 技術曞兞 5 〜 7 で 1 幎半䜿っおいる ▶ 実際に珟堎で最適化を䜿っお埗られた知芋も倚い ▶ 隠すこずはあんたりないので、だいたい喋りたす 5
  3. サヌクル間の類䌌床を定矩する tag 1 tag 2 tag 3 · · ·

    circle 1 æ•°å­Š 機械孊習 R · · · circle 2 機械孊習 æ•°å­Š . . . . . . . . . . . . circle m Android IoT Kotlin · · · ▶ タグ集合同士の類䌌床なら䞊手いこず定矩できそう ▶ タグはどこから持っおきたか? ▶ 技術曞兞 5: 運営が手䜜業で䜜っおいた ▶ 技術曞兞 6: サヌクル偎が自分で入力するシステムが実装された ▶ 技術曞兞 7: 衚蚘揺れなどを修正・管理するシステムが実装された 7
  4. 類䌌床の定矩 タグの匷さ r を次のように定矩する: r(t) := 1 (1 + log

    nt)np t where nt := [Tag t を持぀サヌクルの総数] サヌクル間類䌌床の定矩 Ci , Cj をサヌクル i, j を衚すタグ集合ずしお s(Ci , Cj) := max t∈Ci∩Cj r(t) ▶ 珍しいタグが優遇されるように傟斜を぀けた ▶ p は傟斜を調敎するパラメヌタ調敎が蟛いので本圓は入れたくなかった ▶ タグが倚いサヌクルが有利にならないよう最倧だけを芋る 8
  5. タグず類䌌床に関する残課題 タグ以倖の情報を䞊手く䜿えるず嬉しい ▶ 過去回のサヌクルチェック ▶ 同じ人がチェックしたサヌクルは䌌おいる? ▶ 過去回のかんたん埌払いでの賌入履歎 ▶ 同じ人が賌入したサヌクルは䌌おいる?

    ▶ いずれも新芏サヌクルは履歎がないずいうのが問題 ▶ 今のずころ初参加サヌクルの割合はかなり倧きい ▶ 初参加で配眮が䞊手くいかないずすごく䜓隓が悪い 11
  6. 各垭同士の近さは定矩するべきか? 真面目にやるず泥沌 ▶ 隣ず背䞭合わせはどっちがどれくらい近いの? ▶ 通路を挟んで向かい合わせは近いの? ▶「ちょっずレむアりト倉曎したから 10 分で回し盎しお」 こ40

    こ01 け78 け41 け38 け39 け40 け01 く20 く01 き40 き01 か80 か41 か40 か01 お40 お01 え40 え01 う78 う41 う40 う03 う01 い30 い01 あ01 あ20 催事スペヌス 荷物䜜業スペヌス スポンサヌブヌス 運営ブヌス 出⌝ ⌊⌝ 12
  7. Phase 1: サヌクルをいく぀かのブロックに分割 circle block circle A あ circle B

    う circle C う circle D あ . . . . . . あ size: 3 う size: 3 い size: 2 え size: 2 A B C D E F G H I J A D I B C E F J G H サヌクル A~J を郚分集合に分割 あ size: 3 い size: 2 う size: 3 え size: 2 ▶ 巊の感じの衚が自動でできる ▶ 実甚䞊は「あ」ずかよりももう少し现かくブロックを分ける ▶ 各ブロック内での詳现な䞊びは別の問題ずしお解く 13
  8. Phase 2: 各ブロック内の詳现な配眮 circle block seat circle A あ 1

    circle B う 2 circle C う 1 circle D あ 3 . . . . . . . . . あ01 あ04 あ02 あ05 あ03 あ06 A D B E C F B E F A C D ブロック内での適切な配眮を 決める ▶ 各ブロックごずに具䜓的な配眮を決定する ▶ ここでは誰ず隣り合っおいるかなど现かい条件を考慮する 14
  9. FAQ: なぜ問題を 2 段階に分けたのか 芁件倉曎に柔軟に察応する必芁があった ▶ 定期的に䌚堎が倉曎される ▶ 秋葉原通運䌚通 ==>

    秋葉原 UDX ==> 池袋サンシャむンシティ ▶ 実際に机を䞊べる詳现なレむアりトは盎前たで決められない ▶ 同じ䌚堎でも圓遞サヌクル数や導線蚈画など様々な芁因が絡む ▶「今お誕生日垭䜜った配眮䌚議圓日 」 ▶ ここの難しさを Phase 1 で吞収する戊略 ▶ これは実際めちゃくちゃ䞊手く働いた 15
  10. FAQ: なぜ問題を 2 段階に分けたのか Phase 1 を挟むこずで人間の意図を適床に反映させやすい ▶ たずえば「壁際䞀垯に同䞀ゞャンルの倧きい゚リアができおほしい」など ▶

    ブロックの切り方だけ人間が決められるくらいが䞁床良かった ▶ End-to-end で解く圢にするずどうしおも難しいチュヌニングが発生する ▶ 配眮の良し悪しの正確な刀断は難しいのでチュヌニングが楜なモデリングに するこずが非垞に重芁 ▶「ここはチュヌニング可胜なパラメヌタにしようぜ」は最悪の愚策 ▶ 技術曞兞 6 では最重芁タグだけじゃなく top k を芋る実装などもしたが チュヌニングが難しいので技術曞兞 7 では倖した 16
  11. FAQ: なぜ問題を 2 段階に分けたのか 実は「䌌たゞャンルのサヌクルは近くにいお欲しい」には 2 皮類の気持ちがある ▶ 買う人の芖点 (Phase

    1) ▶ ムラなくゞャンルごずの゚リアを圢成したい ▶ ブロック単䜍で䞊手く分けられおいれば OK ▶ サヌクル参加者の芖点 (Phase 2) ▶ 隣が特に珍しいゞャンルで同奜の士だずすごく嬉しい 17
  12. Phase 1: サヌクルをいく぀かのブロックに分割 circle block circle A あ circle B

    う circle C う circle D あ . . . . . . あ size: 3 う size: 3 い size: 2 え size: 2 A B C D E F G H I J A D I B C E F J G H サヌクル A~J を郚分集合に分割 あ size: 3 い size: 2 う size: 3 え size: 2 ▶ 巊の感じの衚が自動でできる ▶ 実甚䞊は「あ」ずかよりももう少し现かくブロックを分ける ▶ 各ブロック内での詳现な䞊びは別の問題ずしお解く 18
  13. Size-Constrained Minimum k-Cut サヌクルをブロックに分割する問題はサむズ制玄付き最小カット 問題蚭定 ▶ ノヌド vi : サヌクル

    i に察応 ▶ sij : サヌクル i, j の類䌌床 ▶ これがそのたた vi , vj を結ぶ蟺 eij の重みになる ▶ 䞀気に k ブロックに分けたい堎合は k-Cut j i sij 19
  14. 技術曞兞 7 における工倫 600 200 250 150 Figure 1: 技術曞兞

    6 以前 600 400 200 250 150 Figure 2: 技術曞兞 7 ▶ 技術曞兞 6 以前はたずめおブロック分けをしおいた ▶ 技術曞兞 7 では朚構造を持たせお再垰的に分割 20
  15. サヌクル分割問題のアルゎリズム 3 ぀くらい手法を怜蚎しお最終的に簡単なヒュヌリスティクスに着地 没ネタは時間があれば玹介 1. ランダムに実行可胜解を生成 2. ランダムに 2 ブロックを遞択

    3. 各ブロックからランダムに 1 サヌクルず぀遞択 4. 目的関数倀が改善するならばサヌクルの座垭亀換を実行 5. 2–4 を適圓な回数繰り返す 22
  16. 䜙談: 敎数蚈画を゜ルバヌで解き切れるならそれが最善? + 䞊手くいかなかったずきに定匏化が悪いのか最適化手法が悪いのか 問題を切り分けられるずすごく嬉しい + ゜ルバヌに投げ蟌めるずアルゎリズム実装䞊は比范的楜 − ゜ルバヌの有無や良し悪しに匷く䟝存する −

    厳密解法だず蚈算時間が安定しないのは実甚䞊かなり蟛い ▶ 途䞭で打ち切っおもそれなりの解が埗られる手法が安党 ? 実際に解の質がどの皋床違うか今回は未確認 ▶ 配眮䜜業をしおいお皀に「ここは解法の甘さかな」ず思う郚分が芋぀かる皋床 23
  17. サヌクル分割問題の残課題 モデリング自䜓の完成床はかなり高くなっおきたので 最適化手法の改善に手を付けたい ▶ サむズ制玄付き最小カットに特化した効率的なアルゎリズム ▶ NP-hard であるこずたでは知られおいるがアルゎリズムの研究が少ない ▶ サむズ制玄付き劣モゞュラ関数最小化

    ▶ カット関数は劣モなのでこの方向で良い研究があればそれでも良い ▶ 研究ずしおはいく぀かあるがカット関数に察しお䞊手くいった䟋が 芋぀からない ▶ 玠盎に今のアルゎリズムの延長線䞊で改良する線もある ▶ 亀換する 2 サヌクルをランダムではなく䞊手に遞ぶ ▶ 目的関数倀ぞの貢献が小さいものなど 24
  18. おたけ: 開発のタむムラむンうろ芚え ▶ 技術曞兞 5 の配眮発衚 1 週間前: ▶ サヌクル䞀芧を芋お絶望し、自動化を怜蚎し始める

    ▶ 1 〜 2 日目 ▶ 類䌌床の定矩を考えお詊し甚デヌタ䜜成 ▶ プロトタむプを䜜り始める ▶ 3 〜 4 日目 ▶ 4 皮類のプロトタむプを実装しお最も䞊手くいった結果を䜜業者に共有 ▶「意倖ず圢になっおるのでこれ叩き台で良いかも?」ずいう話に 25
  19. Phase 2: 各ブロック内の詳现な配眮 circle block seat circle A あ 1

    circle B う 2 circle C う 1 circle D あ 3 . . . . . . . . . あ01 あ04 あ02 あ05 あ03 あ06 A D B E C F B E F A C D ブロック内での適切な配眮を 決める ▶ 各ブロックごずに具䜓的な配眮を決定する ▶ ここでは誰ず隣り合っおいるかなど现かい条件を考慮する 26
  20. サヌクル順列問題のアルゎリズム 実装䞊既存の TSP ゜ルバヌに乗っかりたかったのでちょっず無理した 1. 笊号を逆転させお定数を足すこずで最短ハミルトン路問題に倉換 2. 最も遠い 2 頂点

    vi, vj を端点に固定 3. vi, vj を結ぶ蟺 eij の重みを 0 に修正 4. このグラフに察しお TSP を解く ▶ 重み 0 なので eij は必ず遞ばれる 5. 埗られた閉路から eij を陀いお終了 28
  21. サヌクル順列問題の残課題 ▶ アルゎリズムが゜ルバヌ事情に瞛られおお明らかにむケおない ▶ 実甚䞊は十分なので気持ちの問題っぜい ▶ 今のずころブロックサむズは高々 50 くらいに分割しおいるので厳密解 埗られないかなあ

    ▶ 分枝限定法くらいは曞いおみたけど自前で雑にやっおも遅いよね... ▶ ぀いでに頂点眰金法ずかも詊した有限回での終了が保蚌できなくお解散 ▶ 小芏暡な最長or 最短ハミルトン路問題を解く良い手法知っおいる人が いたら教えおほしい 30
  22. ブロック間の調敎 A D I B C E G H L

    F J K あ01--あ03 い01--い03 う01--う03 え01--え03 ブロックの䜍眮を人手で入れ替える A D I B C E G H L F J K あ01--あ03 い01--い03 う01--う03 え01--え03 ▶ 同じサむズのブロック同士は䜍眮を亀換するこずができる ▶ ブロックのサむズをできる限り揃えお人間による調敎の䜙地を残す ▶ 元々の「あ」〜「こ」のブロックをもう少し现かく分割 31
  23. ゞャンル以倖の情報を考慮した最終調敎 ▶ 頒垃郚数が倚いサヌクルが䞊ぶず危険 ▶ 子連れなどの事情を考慮 ▶ 技術曞兞 7 では蚗児所があったので䞍芁 ▶

    党䜓最適のために露骚に割りを食っおいるサヌクルがいないか ▶ etc... 技術曞兞 6 では自動配眮の時点で䞀郚制玄を考慮しおいたが 各ゞャンルを䞊手くたずめる時間 ≫ 最終調敎にかかる時間 なので技術曞兞 7 ではひずたず自動化の範囲から倖した 33
  24. 珟実䞖界の壁 ▶ わかっおはいたけど目的関数の蚭蚈は難しい ▶ 出おきた解の良し悪し最適化的な意味ではなく実甚䞊ずいう意味が すぐに刀断できるかどうかで詊行錯誀の速床が段違い ▶ 今回は䜜業者兌アルゎリズム実装者なので、出おきた解の良し悪しがある皋床 わかるずいう意味で比范的奜条件だったはず ▶

    でもやっぱり正確な良し悪しは sfujiwara でも刀断し切れない郚分があっお 議論しないずわからないので倧倉 ▶ 仕事でやるずお客さん連れおこないず刀断できないずかで以䞋略 ▶ 最適化に限らず゜フトりェア開発党般の問題ずいう気も...? 35
  25. 2 次の敎数蚈画問題ずしおの定匏化 若干センス無い気がするけど最初はこう捉えおいた block 1 block 2 block 3 ·

    · · block N circle 1 1 0 0 · · · 0 circle 2 0 0 1 · · · 0 circle 3 0 0 1 · · · 0 . . . . . . . . . . . . ... . . . circle M 0 1 0 · · · 0 min x m ∑ i m ∑ j n ∑ k sij xik xjk s.t. xik ∈ {0, 1} n ∑ k xik = 1 m ∑ i xik ≀ ck ▶ 同䞀ブロック内のサヌクル間類䌌床の総和を最倧化 ▶ ↔ 離れ離れになるサヌクルの類䌌床総和カットの最小化 ▶ ブロック k には任意のサむズ ck を䞎えるこずができる 36
  26. 技術曞兞 5 で詊したこず 敎数蚈画問題ずしお解き切れないか? ▶ 目的関数が 2 次の敎数蚈画は解き切るのが厳しいけれど 補助倉数を導入すれば線圢に萜ずせる ▶

    やっおみたら必芁な補助倉数が思ったより倚くおダメ ▶ 2 分割を再垰的にやるずかも考えたけど厳しい ▶ 100 サヌクルを 2 分割くらいが限界っぜい 37
  27. 最小カットの玠盎な LP 定匏化に制玄を加える 技術曞兞 7 で怜蚎したけど䜕を思ったかコヌド捚おたっぜい PC の奥底から発掘したのでこれからリベンゞ ▶ 最倧流の双察問題に敎数制玄ずかサむズ制玄を足す

    ▶ そこたで倉数は倚くないけど 50 サヌクルくらいで MIP ゜ルバヌCBCが 音を䞊げた ▶ MIP ゜ルバヌが苊手なタむプの問題なのか...? ▶ Gurobi ずか CPLEX でもやりたいけどそんな金はない ▶ 制玄を倖すず完党単暡なので光の速さで解けおムカ぀く ▶ もうちょいきちんず怜蚎しおも良い気はする ▶ 敎数制玄なしで解いお違反したずころにちょっずず぀制玄足しおいくずか...? 40